💡 [Spring] JwtFilter - ArgumentResolver 여기에서도 다뤘지만, Filter와 ArgumentResolver를 통한 데이터 전달 원리에 대해 자세히 다뤄보고자 포스팅을 한다!
Filter에서 ArgumentResolver로 데이터를 전달하고자 한다.
일반적으로 함수에 파라미터를 전달할 때는 파라미터로 직접 데이터를 넘기지만, Filter에서 ArgumentResolver로 데이터를 전달하는 방식은 다르다.
⇒ request 객체는 요청마다 동일하게 유지되므로, 이를 활용해서 데이터를 전달할 수 있다.
Filter에서는 요청을 처리하는 중간에 JWT나 다른 정보를 추출할 수 있다.
추출한 데이터를 request 객체에 저장하고, 이 데이터는 ArgumentResolver나 컨트롤러에서 활용할 수 있다.
Filter에서 ArgumentResolver로 데이터를 전달하려면 HttpServletRequest에 데이터를 세팅하여, 요청 객체를 통해 값을 전달할 수 있다.
HttpServletRequest는 계속해서 요청을 따라가기 때문에, 요청의 생명 주기 내내 ArgumentResolver에서 request 객체의 데이터를 참조할 수 있다.
📌 요청 흐름은
Filter->ArgumentResolver->controller->service-> ... 와 같은 순서로 진행된다.
요청이 들어오면 가장 먼저 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 객체에 데이터를 설정한다.
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 객체를 이용하여, 위에서 설정한 데이터를 꺼내 쓸 수 있다.
ArgumentResolver에서 채운 파라미터를 사용하여 컨트롤러가 실행된다.
이곳에서 HTTP 요청을 처리하고, 필요한 로직을 실행한 후, 서비스 계층으로 데이터를 넘긴다.
서비스 계층에서는 실제 비즈니스 로직을 처리하고, 데이터를 반환하거나, 다른 로직을 실행한다.
서비스 계층은 주로 데이터베이스와의 상호작용 또는 복잡한 계산 등을 처리한다.
Filter에서 추출한 데이터를 HttpServletRequest에 저장하고, 이 데이터를 ArgumentResolver에서 접근하는 방식으로 두 컴포넌트를 연결할 수 있다.
이를 통해 Filter에서 처리한 데이터를 컨트롤러까지 전달하는 방식으로 요청 처리 흐름을 유지할 수 있다.