💡 [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
에서 처리한 데이터를 컨트롤러까지 전달하는 방식으로 요청 처리 흐름을 유지할 수 있다.