[Spring] Filter와 ArgumentResolver를 통한 데이터 전달 원리

조민경·2025년 3월 12일
0

Spring

목록 보기
7/13

💡 [Spring] JwtFilter - ArgumentResolver 여기에서도 다뤘지만, FilterArgumentResolver를 통한 데이터 전달 원리에 대해 자세히 다뤄보고자 포스팅을 한다!



❓ 문제의 상황

  • Filter에서 ArgumentResolver로 데이터를 전달하고자 한다.

  • 일반적으로 함수에 파라미터를 전달할 때는 파라미터로 직접 데이터를 넘기지만, Filter에서 ArgumentResolver데이터를 전달하는 방식은 다르다.

    request 객체요청마다 동일하게 유지되므로, 이를 활용해서 데이터를 전달할 수 있다.




🔗 Filter와 ArgumentResolver의 연결

  • Filter에서는 요청을 처리하는 중간에 JWT나 다른 정보를 추출할 수 있다.

  • 추출한 데이터를 request 객체에 저장하고, 이 데이터는 ArgumentResolver나 컨트롤러에서 활용할 수 있다.




💡 해결 방법

  • Filter에서 ArgumentResolver로 데이터를 전달하려면 HttpServletRequest에 데이터를 세팅하여, 요청 객체를 통해 값을 전달할 수 있다.

  • HttpServletRequest는 계속해서 요청을 따라가기 때문에, 요청의 생명 주기 내내 ArgumentResolver에서 request 객체의 데이터를 참조할 수 있다.




✅ 요청의 흐름

📌 요청 흐름은 Filter -> ArgumentResolver -> controller -> service -> ... 와 같은 순서로 진행된다.

1. 🛡️ Filter

  • 요청이 들어오면 가장 먼저 Filter가 실행된다.

  • 이 시점에서 인증이나 로깅, 데이터 추출 등을 처리할 수 있다.

  • 예를 들어, JWT를 추출하고 유효성을 검사한 후 HttpServletRequest에 데이터를 저장할 수 있다.

// Filter에서 JWT 클레임 정보 추출 후 Request에 데이터 세팅
httpRequest.setAttribute("userId", Long.parseLong(claims.getSubject()));
httpRequest.setAttribute("email", claims.get("email"));
httpRequest.setAttribute("userRole", userRoleString);

     💡 위와 같이 httpRequest.setAttribute()를 사용하여 request 객체에 데이터를 설정한다.


2. 🔄 ArgumentResolver

  • Filter에서 데이터를 HttpServletRequest에 설정한 후, ArgumentResolver가 실행된다.

  • ArgumentResolver는 컨트롤러 메서드의 파라미터를 채워주는 역할을 하며, HttpServletRequest에서 필요한 데이터를 추출해 전달한다.

  • 이 부분에서 request 객체에 저장된 데이터를 사용할 수 있다.

HttpServletRequest request = (HttpServletRequest) webRequest.getNativeRequest();

// JwtFilter 에서 set 한 userId, email, userRole 값을 가져옴
Long userId = (Long) request.getAttribute("userId");
String email = (String) request.getAttribute("email");
UserRole userRole = UserRole.of((String) request.getAttribute("userRole"));

     💡 ArgumentResolver에서 HttpServletRequest 객체를 이용하여, 위에서 설정한 데이터를 꺼내 쓸 수 있다.


3. 👩‍💼 Controller

  • ArgumentResolver에서 채운 파라미터를 사용하여 컨트롤러가 실행된다.

  • 이곳에서 HTTP 요청을 처리하고, 필요한 로직을 실행한 후, 서비스 계층으로 데이터를 넘긴다.


4. 💼 Service

  • 서비스 계층에서는 실제 비즈니스 로직을 처리하고, 데이터를 반환하거나, 다른 로직을 실행한다.

  • 서비스 계층은 주로 데이터베이스와의 상호작용 또는 복잡한 계산 등을 처리한다.




🚀 결론

  • Filter에서 추출한 데이터를 HttpServletRequest에 저장하고, 이 데이터를 ArgumentResolver에서 접근하는 방식으로 두 컴포넌트를 연결할 수 있다.

  • 이를 통해 Filter에서 처리한 데이터를 컨트롤러까지 전달하는 방식으로 요청 처리 흐름을 유지할 수 있다.

0개의 댓글