본문 바로가기
프로그래밍

Servlet의 request, response와 JSP의 request, response는 서로 다른 객체

by 탁구치는 개발자 2015. 7. 23.

Spring을 이용해 웹을 개발할 때 대부분 Controller의 request, response 객체와 JSP의 request, response 객체가 서로 다르다는 것을 신경쓰지 않고 개발 한다. (Spring에만 국한 된 것이 아닌 MVC 패턴으로의 개발을 할 때도 포함)


최근에 경험한 삽질로 인해서 Controller와 JSP에서 사용하는 request, response 객체는 서로 다르다는 것을 알게 되었고 나의 삽질 경험을 이곳에 작성해 본다. 딱딱한 구성의 글 보다는 스토리 전개 방식으로 나의 경험을 풀어나가 보려 한다.


아주 오래 전~ 한 자바 개발자가 있었다.

그 개발자는 자신이 만든 스프링 웹 애플리케이션에 버그가 있다는 것을 알게 되었고, 버그를 해결하기 위해서는 JSP 코드에 cookie 셋팅을 해야 한다는 것을 알게 되었다.

즉, response 객체에 특정 쿠키 값을 셋팅하여 문제를 해결할 수 있는 방법인데 가장 빠르고 신속하게 배포할 수 있는 최선의 방법이라고 그 남자는 생각했다.


그래서 다음과 같은 코드를 심고, 테스트를 진행해 보았다.

Cookie cookie = new Cookie("solution", "문제해결");

cookie.setPath("/");

cookie.setDomain("test.domain");

response.addCookie(cookie);


허나, solution 쿠키 값은 response 헤더에 실리지 않은 상태로 client로 내려가는데.........


개발자는 생각했다.

쿠키 셋팅 방법이 잘못되었나?

Javascript 방법으로 쿠키를 셋팅해 보자고 생각한 개발자는 다시 시도했다.

그러나 결과는 동일했다.

리턴되는 response 헤더에는 "solution" 쿠키 값이 존재하지 않는다.


개발자는 멘붕이 온다.

왜 안 될까? 왜 안 될까?

문득 오래전 기억이 떠오른다. http://lng1982.tistory.com/197

jstl의 c:import 를 사용할 때 최초 요청의 request와 c:import 에서 요청한 request가 달랐다는 점이 생각난 것이다.


그 순간 번득한 것은?

"설마 response의 객체도 서로 다른 것인가" 라는 생각을 하게 되었고, 객체의 레퍼런스 변수 값을 찍어보니 그러했다.

실제 client 로 리턴되는 response는 Controller Response 객체인데 엄한 JSP response에 쿠키를 셋팅하고 있었으니 정상적으로 처리되지 않은 것이다.

[Controller Response 객체 레퍼런스]

org.apache.catalina.connector.ResponseFacade@4991f9c4


[JSP 객체 레퍼런스]

org.apache.jasper.runtime.ServletResponseWrapperInclude@52b39ca2


결국 개발자는 Contoller의 response 객체에 쿠키를 셋팅하게 되었고, 문제는 자연스럽게 해결되었다.

그렇게 그 개발자는 문제를 해결한 후 안도의 한숨을 쉴 수 있었다. ^^