1) Query String 이란?
Query String (쿼리 문자열)이란 웹 클라이언트에서 웹 서버에 정보를 요청할 때, 데이터를 전달하는 문자열이다.
브라우저 주소창을 보면 흔히들 알고 있는 URL, 웹 주소, 링크 라 부르는 이 긴 문자열 안에 쿼리 스트링이 포함되어 있다.
웹은 클라이언트의 요청과 서버의 응답으로 이루어지고 있는데 이때 클라이언트가 어떤 요청을 했는지에 대한 정보가 넘어가야 서버에서는 그에 상응하는 결과 응답을 내어줄 수 있다. 예를 들면 인터넷 쇼핑몰에서 상의만 보고 싶을때 '상의'라는 원하는 데이터 정보를 서버에 넘겨야 서버에서 많은 정보 중 클라이언트가 요청했던 '상의'에 해당하는 정보들만 화면에 출력해줄 수 있는 것이다.
이 데이터 정보들은 쿼리 문자열이라고 데이터를 전달하는 문자열을 통해 전송이 된다. 인터넷을 이용하면서 주소창을 세심하게 살펴 본적이 없다면 지금부터 주소를 한번 살펴보자.
URL을 메모장에 복사해서 붙여넣고 주소 문자들을 확인해보면 ?
를 기준으로 뒤에 Key=Value
형식으로 값이 전달된다. 값이 여러개일 경우에는 Key=Value&Key=Value
이런 형태로 넘어간다.
2) Query String 예시
네이버에 '안녕하세요'라고 검색했을 때 브라우저의 주소창을 확인해보면 물음표 뒤에 여러개의 Key와 Value값이 넘어가고 있다. key와 value는 최초 개발자가 설정하는 값이기 때문에 사실 이것만으로 어떤 자료가 넘어가고 있는지 모든걸 알 수는 없지만 한가지 query라는 Key 값에는 내가 검색했던 '안녕하세요'라는 데이터가 전달되고 있는걸 확인 할 수 있다.
네이버 검색창에 직접적으로 검색하지 않고 주소창의 query에 해당하는 value값만 수정해서 검색 해도 원하는 결과를 얻을 수 있다.
3) Query String의 전달 방식
<body>
<form action="어디로 전송할지" method="전달 방식">
<p>당신의 이름은 무엇인가요?</p>
이름 : <input name="key" value="김헤헿" name="name">
<button>전송</button>
</form>
</body>
인터넷 브라우저에서 다양한 정보 데이터를 서버에 전송할 수 있도록 html 문서 내에 <form>
태그를 사용하여 값을 전송한다.
<form> 태그 내에는 원하는 데이터 정보를 사용자에게 받기 위하여 입력 태그들을 사용한다 대표적으로 <input>
, <textarea>
태그들이 있으며 전송 할 때는 <button>
또는 <input type="submit">
을 이용한다. html 태그와 관련하여 이 글에서는 자세히 다루지 않을 것이다. 데이터들을 서버에 전송할 때는 보내는 방식은 두가지로 나뉘는데 하나는 get방식, 하나는 post방식이다.
3-1) Get 방식
Get 방식은 간단한 정보를 입력할 때 주로 사용한다.
네이버 검색창 처럼 url로 확인이 가능하며, 주소창에 노출이 되는 부분이기 때문에 보안적인 측면에서 좋지는 않다.
개인정보를 다루는 것이 아니라 위에 예시로 들었던 네이버 검색창 또는 쇼핑몰의 분류 기능같은 노출되어도 문제가 없는 부분이라면 대부분 get 방식을 사용한다.
하지만 이 방식은 서버가 실행됨과 동시에 미리 메모리를 할당하는 방식이기 때문에 길이에 제한이 있다. 따라서 보안에 큰 영향이 없지만 긴 문자열을 전송하거나 파일을 전송할 때는(파일은 바이너리 형식으로 서버에 전달된다) 사용 할 수 없다.
3-2) Post 방식
post는 내용이 외부로 유출되면 안되는 암호나 주민번호 또는 길이 제한이 없어야 하는 긴 문자나 파일 업로드 기능 구현시에 사용한다.
메모리 공간을 미리 지정하는게 아니라 요청이 있을 때마다 동적으로 할당하기 때문에 길이 제한이 없고, url에 노출되지 않기 때문에 보안에 더 용이하다.
4) Servlet에서 데이터 추출 방법
자, 그럼 이렇게 전달된 데이터들은 어떻게 서버로 전달되는지 데이터 추출 하는 방법을 알아보자.
4-1) 클라이언트 서버사이드 부분
<h3>당신의 정보를 알려주세요.</h3>
<form action="GetTypeTest" method="get">
이름 : <input type="text" name="name"><br>
나이 : <input type="number" name="age">
<button>확인</button>
</form>
html태그로 작성된 문서를 보면 '확인' 버튼을 눌렀을 때 GetTypeTest 라는 패스를 찾아 해당 문서로 데이터들을 get 방식으로 전달한다.
( 입력값이 들어올 태그에는 name 속성을 꼭 입력해줘야 한다. name을 기준으로 데이터를 추출 할 수 있기 때문이다. 하나의 변수 명 지정 같은 느낌이 된다. )
4-2) 서버 사이드 부분
response.setContentType("text/html; charset=UTF-8"); #콘텐츠 타입 설정
String name = request.getParameter("name"); #html input 태그에서 입력된 name 값
String age = request.getParameter("age");
System.out.println("당신의 이름은 " + name + "입니다.");
System.out.println("당신의 나이는 " + age + "입니다.");
GetTypeTest 라는 이름으로 Servlet을 생성하여 doGet 메서드 안에 위 코드를 입력해줬다.
차례대로 처음엔 콘텐츠 타입 지정, '확인'을 누름으로써 넘어왔던 데이터 값 추출, 추출된 데이터 값 출력이다.
데이터를 추출 할 때는 request의 메소드인 getParameter를 사용한다.
4-3) 출력 결과
이름은 '김헤헷' 나이는 '33'입력 하여 확인 버튼을 눌렀다.
get방식으로 보냈기 때문에 주소창에 내가 입력했던 데이터들이 그대로 쿼리 문자열로서 노출 되어 보여진다. 또 서버 사이드에서 데이터 추출후 콘솔에 출력되도록 코드를 짰을 때, 데이터 값도 문제 없이 잘 넘어온걸 확인 할 수 있다.
4-4) Post 방식으로 전송한다면?
form method를 post로 설정해놨고 나머지는 동일하게 진행해서 출력해봤다.
post 방식으로 보냈을 때는 Query String은 전부 사라졌다. 내가 지정한 패쓰의 경로만 나올 뿐 그 외의 데이터 값들은 알 수 없다. 이와 상관없이 서버에서 데이터 추출 했을 때는 정상적으로 추출되고 콘솔에도 제대로 출력되어 나오는걸 확인 할 수 있다.
여기까지는 간단한 체크를 위한 입력이다. 실제로는 null 값이 들어왔을 때의 예외처리도 해야 하며, 넘어온 값이 하나의 값이 아니라 여러개의 배열 형식일 때는 request.getParameter();
가 아니라 request.getParameterValues();
로 값을 추출 할 수 있다.