실제 실무 환경 이나 로그인 , 세션 , 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를 적용 안할곳을 정한다.
'자바 > 스프링(Spring)' 카테고리의 다른 글
스프링 시큐리티를 사용해보자!! (0) | 2022.09.23 |
---|---|
자바(Spring) OpenAPI를 통한 JSON Parser 코드 (0) | 2022.09.08 |
스프링(Spring) JSon 역직렬화 문제 (중복배열) (0) | 2022.07.08 |
스프링 타임리프(Thymleaf) 한눈에 정리하기 (0) | 2022.05.18 |
스프링 Redirect를 활용해보자 (0) | 2022.04.19 |