[JSP] QueryString으로 데이터 넘기는 법(feat. form태그 GET Method)

2023. 6. 21. 21:39프로그래밍/웹 개발

웹 페이지에서 데이터를 넘기는 데에는 크게 두 가지 방법이 있다.

get method와 post method를 사용하는 것이다.

이 중 get method를 통한 데이터 전달 방식의 종류에 대해 정리하겠다. 지금부터 이를 'get 방식'이라고 명명한다.

 

 

일반적으로 <form> 태그 안에서 데이터를 넘기는 형식을 많이 봐왔고 이제까지 그렇게만 사용해왔다.

 

<form action="test.html" method = "get">

    <input type="text" name = "itistest" value = "success">
    <input type="text" name = "itistest2" value = "failure">
    <input type="submit" >
    
</form>

이렇게 데이터를 넘길때 method = "post"로 설정하면 내부적으로 데이터를 처리하기 때문에 사용자는 전달 요청된 parameter에 직접 접근할 수 없다. 그러나 get 방식은 다르다. URL 뒤편에 parameter(데이터)의 정보가 출력된다.

form태그 내에 있는 submit 버튼을 누를 시 저렇게 name과 value를 가지고 있는 태그들의 데이터가 넘어가게 된다.

URL을 자세히 보면 파일명 뒤편에 ?로 시작하는 부분부터 name과 value에 해당하는 값들이 있는 것을 확인할 수 있다. 즉 서버에서 ?부터는 URL로 인식하지 않는 것이다. 따라서 이를 이용해 form태그 뿐만 아니라 다양한 페이지 이동 처리에서도 가능하다. 

 

우선 내가 아는 페이지 이동 처리 방법은 다음과 같다.

 

1. JavaScript의 location.href = "이동할 파일명" 

2. HTML의 <a href= "이동할 파일명">

3. JSP의 reponse.sendRedirect("이동할 파일명");

4. HTML의 form 태그의 action = "이동할 파일명" -> <form action = "이동할 파일명">

 

이외에도 훨씬 많은 방법이 있으리라 생각된다. 우선 위와 같이 URL을 통해 페이지 이동 처리하는 메서드들의 특징은 메서드의 default 속성값이 "get"이라는 것이다. 따라서 form태그에서 name value 값을 URL로 넘겨주듯이 다음과 같이 작성해도 데이터를 넘겨줄 수 있다. 이론상 맞는데 실제로 가능한지 하나의 jsp파일과 html파일로 테스트 해보자. 

*주의 : form태그의 action의 주소명에는 임의로 쿼리스트링을 추가할 수 없다. form태그는 내부적으로 선언된 태그들의 name과 value들만 parameter로 가져온다. 그러므로 form태그를 이용해 여러개의 데이터를 넘기고 싶다면 input태그의 hidden속성을 이용할 것.

 

-test.html 파일의 body 태그 내의 코드

<form action="test.html" method = "get">

    <a href = "test2.jsp?name1=hi&name2=bye">테스트</a>
    <input type="submit" >

</form>

위와 같이 작성한 코드가 있고 href로 설정된 '테스트' 텍스트를 클릭했을 때 과연 URL로 설정한 name과 value도 받아올 수 있을까?

 

- test2.jsp 파일의 body태그 내의 코드

<%

String name1 = request.getParameter("name1");
String name2 = request.getParameter("name2");
out.println("<h1>" + name1 + name2  + "</h1>");
%>

실행결과

name1과 name2에 설정된 value1(hi)와 value2(bye)가 out.println을 통해 작성됨을 확인할 수 있다.

뿐만 아니라 URL에서 직접 value값을 다르게 설정하면 설정한대로 출력될 것이다. 이렇게 URL뒤에 ?를 붙이고 parameter(데이터)를 넘기는 문자열을 쿼리스트링(Query String)이라고 한다.

위의 예제에서는 <a> 태그를 이용했지만 앞서 언급한 4가지 방법 어떤 방법으로 쿼리스트링을 추가해도 같은 결과를 얻을 수 있다.

 

 

- 쿼리스트링을 사용했을 때의 문제점

꼭 form태그를 통해서만 넘겨줘야 하는 값이 있다. html의 input태그나 select태그 등 사용자가 페이지에서 옵션을 선택한 상태에서 데이터를 넘길 때는 form태그를 이용해야 한다(물론 html 태그에 onclick = "javascript내에 함수명"을 작성하고 매개변수로 값을 넘긴 후에 그 함수에서 매개변수를 쿼리스트링으로 작성해서 보낼 수는 있겠다). 그러니까 쿼리스트링을 적극적으로 활용할 수 있는 때는 java 클래스의 객체 정보를 통한 페이징 처리를 할 때나 DB를 연동했을 때 유리한 것이다.

또한 form태그의 get 방식이나 앞서 언급한 쿼리스트링을 이용해 URL에 parameter를 넘기게 되면 아무래도 내가 전달하는 데이터가 주소창에 노출되기 때문에 보안에 취약하다. 즉 데이터를 보호해야 하는 상황에서는 적절하지 못한 방법이란 것이다.

그렇다면 꼭 넘겨야 하는 값이 있는데 그게 페이지 상으로는 보이지 않아야 한다면 어떻게 해야할까?

 

1. input태그를 만든 후에 name과value 값을 지정해주고 hidden 속성으로 가려준 후 form태그로 넘겨주면 된다. 

<form action="test.html" method = "get">

    <input type="text" name = "nam3" value = "rehi!" hidden >
    <input type="submit" >
    
</form>

input 태그를 작성했음에도 화면으로 보이지는 않으나 제출 버튼을 클릭하게 되면 URL뒤에 name과 value값이 넘어감을 알 수 있다.

또한 이렇게 작성하게 되면 form태그 내에 있는 데이터들 뿐만 아니라 내가 넘기고 싶은 객체가 갖고 있는 값 같은 것들도 넘길 수 있게 된다. 

 

2. session.getAttribute & session.setAttribute 사용하기

<%

    session.setAttribute("test", 5);
    Object o = session.getAttribute("test");
    int num = o == null ? 99 : (Integer) o;
    out.println(num);
    
%>
<a href="test2.jsp">새로고침</a>

jsp 파일에 위와 같이 작성된 코드가 있다. 실제로 처리할때는 독립된 jsp파일로 처리하는 것이 맞으나 그냥 확인하기 위해 하나의 jsp 파일에 작성했다. 위와 같이 session.setAttribue로 변수명과 값을 넘겨줄 수 있고 getAttribute로 값을 가져올 수 있다.

조금 다른 점이라면 session에 넘긴 값은 Object 타입으로 저장된다는 것이고 이를 다시 원하는 형태로 바꾸기 위해선 형변환을 해줘야 한다. 만약 session에서 설정된 attribute값을 가져오지 못하면 99가 작성될 것이고 정상적으로 값을 받아오게 되면 5가 나올 것이다.

결과를 보면 세션에서 정상적으로 값을 반환했음을 확인할 수 있다.