• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

HttpServeltRequest 객체의 빈 스코프에 대해 질문 드립니다.

22.04.17 20:17 작성 조회수 162

0

안녕하세요! 스프링에 대한 기초 지식이 부족한 개발자 입니다.

프로젝트 개발 중 해결은 하였지만 이해가 가지 않아 질문 드립니다.

너무 궁금해서 강의를 시작하기도 전에 질문 먼저 드리는 점 죄송합니다..ㅠ

 

기존에 돌아가던 프로젝트를 이관하는 중에 

client로부터 page라는 parameter가  request에 중복으로 들어오는 경우가 생겼습니다.

가장 좋은 방법은 하나를 빼고 request를 보내도록 수정하는 것이겠지만, 다른 부분에서도 쓰이는 util쪽 코드라 쉽게 건들이지 못해서  RequestWrapper를 사용하게 되었습니다.

 

public class RequestWrapper extends HttpServletRequestWrapper {

       Map<String, Object> hashMap ;

      public RequestWrapper  ( HttpServletRequest req ) {

             ....

          hashMap  = new HashMap<String, Object>( req.getParameterMap );

}

 

이런 식으로 request로 들어온 parameter들을 받아서 중복된 page를 제거하고 hashMap에 넣은 후,

getParameterValues와 getParameter에서 저 hashMap에서 값을 꺼내오도록 변경하였습니다.

 

제가 이해가 안가는 부분은 아래와 같은 상황인데요..

특정 request 를 받아 controller를 거쳐  xxx.jsp를 리턴 한 후 ( A과정 ) 해당 jsp안에서 

jstl의 <c:import>와 <c:param>을 통해 다시 한번  임의의 다른  controller를 호출해서 값을 받아오는 ( B과정 ) 부분이 있었습니다.

 

그런데 wrapper를 적용하기 전에는 정상작동하던 것이 wrapper를 사용하기 시작하니까

<c:param>으로 넘겨주는 값들은 넘어가지가 않고 그 전에 호출되던 A과정의 request parameter들이 넘어가더라구요..

 

request객체는 scope가 request이니까 A과정에서 jsp를 return하고 나면 사라지고 

B과정에서 jstl 태그를 이용해 다시 특정 컨트롤러를 호출하면 새로운 request 객체가 생성되서 <c:param>들이 넘어가야 맞는 것 아닌가요...?

getParameter를 통해 <c:param>으로 보내준 값을들 찍어봐도 전부 null값으로 나왔습니다..

 

제가 추측하는 이유는 

1) jsp안에서 jstl로 다른 컨트롤러 호출 시 request의 scope이 종료되지 않은 경우

2) request는 A과정과 B과정 모두 각각 생성되고 사라지는데, wrapper의 생성자에서 hashMap을 세팅했기 떄문에 이후에는 wrapper 객체가 새로 생성되는 경우가 없어 hashMap 값이 바뀌지 않는 경우 

2)번이 이유인 경우에 그럼 wrapper의 scope도 prototype이나 request로 변경해줘야 할까요..??

상태값을 가지고 있는 class 의 경우 싱글톤으로 관리하면 안된다고 배우긴 했는데 ... requestWapper이니 request별로 뭔가 초기화 되거나 새로 만들어질 것이라고 생각을 했습니다..ㅠ

 

제가 스프링 지식이 부족해서 질문을 너무 복잡하게 작성한 것 같습니다.. 

혹시 위 말고 다른 이유가 있는 걸까요??.. 

답변 기다리고 있겠습니다...ㅠ 감사합니다!

 

 

 

 

 

 

답변 0

답변을 작성해보세요.

답변을 기다리고 있는 질문이에요.
첫번째 답변을 남겨보세요!