자바/스프링(Spring)

ArgumentResovler 와 Interceptor에 대하여

류창 2022. 8. 23. 14:40
반응형

 

실제 실무 환경 이나   로그인 , 세션 , JWT기능을 구현하다보면 

 

계속 봐야할 2개의 개념이  ArgumentResovler 와 Interceptor이다.

 

 

 

도대체 이 2개가 뭐냐?!

 

ArgumentResolver의 역할: 

1. 들어오는 세션 또는 JWT가 올바른지 검증

2.  1번의 과정을  하나의 어노테이션으로 정의함으로써  코드의 깔끔함

3.  2번에 인해  Controller단에 의존관계를 줄일수있다.

 

 

Intercepter의 역할: 

 

해당 페이지를 열 수 있는  권한을 부여합니다.

 

EX) 비로그인 사용자는  물품구매 페이지를 이동할수없다.

       사용자는 관리자페이지를 들어갈수없다.

 

 

 

 

실제로 요청을 받으면,    RequestMapping 검색 -> Intercepter -> ArgumentResolver ->  Mapping메소드 실행 이다.

 

 

 

우선 Intercepter의 예제를 한번 살펴보겠다.

 

 

예제로 세션을 활용한 LoginCheckInterceptor를 살펴보겠습니다. 

 

LoginCheckIntercoptor는    로그인한 사용자만 들어갈수 있는 페이지의 접근여부를 결정해주는 기능이다.

 

 

Interceptor의 기능을 받아오기위해   HandlerInterceptor를 참조를 해왔는데,   HandlerInterceptorAdaptor를 상속받아와도 괜찮습니다.

 

Interceptor에는 3개의 구간이 존재합니다.

 

1. preHandle:   Controller 호출 전

 

2. postHandle:  Controller 호출 후

 

3.afterComplete : View에서 화면 출력을 포함한 모든일이 끝나고 난 뒤 

 

 

우선 본 기능인    로그인 사용자의 접근권한을 설정하기위해  Controller 호출 전인 preHandle에 구현하도록 합시다.

 

 

preHandle에 return 타입을 보시면 Boolean값이 보이는데,

 

저 Boolean값이  True면  접근허가  Fasle면 접근금지를 뜻합니다.

 

따라서, request가 들어왔을때,

 

request에서 세션을꺼내 확인했는데  비로그인 사용자 Or 세션이없으면  False: 접근금지를 주고,

 

있다면 True: 접근 허가를 합니다.

 

 

ArgumenResolver 예제

 

ArgumentResolver 역시 세션과 JWT를 검증하는 역할은 동일하지만, 

 

이 기능을 쓰는 이유는    코드의 간결함 + 데이터 변환 + 의존관계 줄이기  때문에 씁니다.

 

 

만약 ArgumentResolver를 안쓴다면?

 

Controller단 안에다  세션과 JWT검증기능을 그대로 넣어야한다.

 

넣어도 코드는 작동할테지만  Controller단에  검증코드 중복 + 의존관계 증가 (책임증가)문제가 있다.

 

 

따라서 이런 세션 or JWT 검증코드는 따로 분리하려고 나온게 ArgumentResolver다.

 

 

검증로직을 축약을  어노테이션으로한다.@Login 을 통해   Login세션인지 검증로직을 불러오는것이다.

 

 

HandlerMethodArgumentResolver를 참조받는다.

 

supportsParameter에서 검증 작업을한다.  여기서 reutrn값이 False라면 검증실패로 @Login이 작동하지않는다.return 값이 True라면 다음스탭인 resolveArgument가 작동한다.

 

True를 반환하는 조건은    parameter가 @Login을 갇는지 + 그리고 Member클래스인지를 판단한다.

 

 

검증을 마쳤으면 resolveArgument를 실행한다.

 

여기선  데이터를 변환한다. 

입력으로받는  Member정보  ->  Session을 가져온다 ->  Session에서 Member를 바인딩해서 다시 가져온다

이 과정을 실행한다.

ArgumentResolver , Interceptor 적용

 

 

ArgumentResolver , Interceptor를 만들었다면  적용을 하셔야합니다.

 

 

WebMvcConfigurer를 사용하면  자동으로 세팅해주는 설정에 

 

개발자가 원하는 설정을 추가만하기만하면된다.

 

우리는 ArgumentResolver를  자작한걸 추가하고, Interceptor를 추가하자.

 

Interceptor는 추가할때   접근할수있는페이지와 접근 풀가능한 페이지를 설정이가능하다.

 

addPathPatterns는   이 Interceptor를 어디에 적용할지를 정한다.  

excludePathPatterns는  Interceptor를 적용 안할곳을 정한다.

 

 

 

 

 

 

반응형