본문 바로가기

새롭게 쌓은 지식

Spring ArgumentResolver와 Interceptor

1. ArgumentResolver

어떠한 요청이 컨트롤러에 들어왔을 때, 요청에 들어온 값으로부터 원하는 객체를 만들어내는 일을 ArgumentResolver이 간접적으로 해줄 수 있다.

 

검증과 관련된 코드가 Controller에 존재할 때는 사용자 검증이 필요한 모든 메서드에 같은 코드가 중복될 뿐만 아니라 Controller에서 수행하는 책임이 증가한다는 문제가 존재한다.

https://github.com/f-lab-edu/daangn-market-used-trading/pull/9/commits/f34fa65057876abab4c50ddb110943ece5643fe6

 

[#4] 회원관리 및 회원탈퇴 기능 구현 by ssibongee · Pull Request #9 · f-lab-edu/daangn-market-used-trading

This repository has been archived by the owner. It is now read-only. Add this suggestion to a batch that can be applied as a single commit. This suggestion is invalid because no changes were made to the code. Suggestions cannot be applied while the pull re

github.com

 

        Member member = loginService.getLoginMember();

 

로그인 유저의 로그인여부를 검증하는 로직이 getMemberProfile, updateMemberProfile, changePassword 등등에서 반복된다.

 

이를 ArgumentResolver 로 바꾸자.

 

supportsParameter 의 반환값이 true이면 resolveArgument의 반환값이 해당 어노테이션이 붙은 파라미터에 주입된다.

 

 

 

 

 

 

 

 

 

2. interceptor

 

 

 

이 로그아웃API 와 같이 컨트롤러에 매핑되기 직전 HandlerInteceptor에 의해 공통된 요청을 처리한다.

 

해당 어노테이션을 정의해준다.

 

true 를 반환할 때만 해당 어노테이션이 붙은 메서드가 실행된다.

(핸들러매핑시 특정 URL의 요청을 인터셉터로 가도록 따로 URL을 설정 할 수 있다.)

 

 

위의 LoginInterceptor은 로그인 한 해당 멤버가 존재하는지 검증하는 로직이다.

 

 

간단한 spring의 동작 방식은 다음과 같다.

1. 요청이 들어온다.


2. filter가 작동한다. 


3. DispatcherServlet에 전달된다. DispatcherServlet이란, Spring의 핵심 객체로, Client의 요청을 받고 응답을 주기까지의 모든 역할을 담당한다.


4. DispatcherServlet은 HandlerMapping을 통해 요청을 처리할 Controller를 찾는다.
이 때, Controller를 찾고 Interceptor가 확인할 url과 일치하면 Interceptor의 preHandle이 실행된다.


5. DispatcherServlet은 Controller를 실행해줄 HandlerAdapter를 찾는다.
이 때, Adapter를 찾고 handle을 실행하기 위해 필요한 파라미터를 생성하기 위해 Resolver는 실행된다.


6. HandlerAdapter는 Controller를 실행한다.
이 때, Interceptor의 postHandle이 실행된다.


7. DispatcherServlet은 실행한 결과를 ViewResolver에게 전달한다.
ViewResolver는 View에 전달한다.
이 때, Interceptor의 afterCompletion 실행된다.


8. DispatcherServletdms View로부터 받은 정보를 Client에 전달한다.


9. 응답을 반환한다.

 

 

 

# 결론

ArgumentResolver, Interceptor을 사용하면 코드의 중복도 제거할 수 있고, Controller에 직접적으로 책임을 주지 않을 수도 있다.

 

 

# Argument Resolver와 인터셉터(Interceptor) 차이점

1. ArgumentResolver는 인터셉터 이후에 동작을 하며, 어떠한 요청이 컨트롤러에 들어왔을 때, 요청에 들어온 값으로부터 원하는 객체를 반환한다.
2. 반면, 인터셉터는 실제 컨트롤러가 실행되기 전에 요청을 가로채며, 특정 객체를 반환할 수 없다. 오직 boolean 혹은 void 반환 타입만 존재한다.

 

 

 

참고하면 좋을 자료 ( 정말 잘 정리되어있다 꼭 읽어보자 )

블로그 - Interceptor

블로그 - ArgumentResolver

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

꾸준히 다시보자.

 

1. 220917

2. 220928

3. 221004

4. 221028

Recent Posts
Popular Posts
Recent Comments