본문 바로가기
✨ Back-end/Spring-Boot

응집도를 높이는 기능 Intercepter 사용법.

by 환풍 2023. 3. 29.
728x90

응집도를 높이는 기능 intercepter

 

Admin컨트롤러에 있는 카테고리 관리 페이지나 상품 등록 페이지 상품 재고관리 페이지 상품 정보 수정 페이지에 있는 

메뉴 목록 조회, 서브 메뉴 목록 조회 model 을 쓴것과 같이 이 기능들은 어쩔수 없이 화면에 보여지기 위해 컨트롤러에 계속 반복해서 집어 넣었다.  이런 중복된 코드들을 없애서 좀 더 단편화된 코드로 바꿔보자. 그렇게 해야 응집도가 높아지면서 보다 나아진다. 이렇게 응집도를 낮추는 intercepter에 대해서 공부해보자.


먼저 프로젝트를 하나 만든다.

이번 프로젝트에서는 Lombok, Spring Boot DevTools, Spring Web, Thymeleaf 이 4개를 쓸 것이다.

 

html을 t1, t2 ,t3 이렇게 3개 만들어주었다.

 

TestController 컨트롤러

컨트롤러에서 각 t1 t2 t3페이지가 이동되면 콘솔창에 메소드 작업 실행 구문을 띄워주었다.

 

그리고 두개의 클래스를 만들어 implements를 시켜줄 것이다.

TestIntercepter1 클래스

 

 인터셉터 사용 하기 
1. HandlerInterceptor 라는 인터페이스를 구현하는 클래스를 생성.

2. HandlerInterceptor 인터페이스에 정의된 메소드 중 사용하고자 하는 메소드를 오버라이딩.
3. 메소드의 종류 : preHandle, postHandle , afterComplation 총 3개.
 해당 3개의 메소드는 작업 시기에 따라 구분된다.

 1) preHandle -> 특정메소드가 실행되기 전에 호출.
 2) postHandle -> 특정메소드가 실행되고 HTML로 가기 전에 호출
 3) afterComplation -> 특정 메소드가 실행되고 HTML 페이지가 전송되면 호출.

TestIntercepter1 

 

IntercepterConfig 클래스

IntercepterConfig 클래스에서 오버라이드를 addInterceptors(InterceptorRegistry registry) 을 선택해서 만들어준다.

@Configuration의 사용은 의존성 주입을 위해 쓴것이고, 클래스에 대한 객체 생성을 하는 기능을 한다.

이렇게 IntercepterConfig 클래스와 TestIntercepter1 클래스를 만들어 주고 implements로 각 구현 메소드를 채워줬다.

TestController 컨트롤러

t1 페이지에서 새로고침을 하면 preHandle() 메소드 실행이 콘솔창에서 가장 먼저 실행된 것을 볼 수 있다.

 

하나의 컨트롤러에서는 여러개의 html로 데이터들을 보낼 수 있다.

 

스프링에는 우리눈에 보이지 않지만 컨트롤러가 하나 더 있다. 이것은 컨트롤러를 관리하는 관제탑 역할을 한다.

 

세션을 가로체는 인터셉터가 존재하는데, 초록색 세로 선이 인터셉터이다.

컨트롤러에서 메소드를 실행하기전 인터셉터를 적용하여 데이터를 가로채면서 데이터 변환을 해줄 수 있다.

 

즉 , 컨트롤러의 메소드가 시작되기 전에 공통적인 일을 해주었던 것이 TestIntercepter1 클래스에 있는 preHandle 이라는 메소드가 인터셉터 역할을 하여 실행되기 전에 이것 먼저 실행되어서 콘솔창에 나타나 지는 것이다.
TestIntercepter1에서는 정의만하고, 쓰는 것은 IntercepterConfig에서 쓰는 것이다.
그게 바로 어노테이션 @Configuration을 적어주었고. WebMvcConfigurer를 implements로 구현한 것이다.

t1.html , TestController 컨트롤러

t1 html에서 a 태그를 주어 페이지 이동시 name으로 java, age로 20 데이터를 넘겼다.

컨트롤러에서 t2에서 데이터를 String name, int age로 매개변수를 설정하고, Model 객체를 생성해주었다.

이후 model 객체에 t1에서 보낸 name 데이터를 name이라는 이름으로, age 데이터를 age라는 이름으로 html에 전달한다.

get으로 받아왔기 때문에 주소창에 그대로 데이터가 출력되는 것 까지 볼 수 있으며,

html에서 [[${name}]] 과 같이 데이터를 받아올 수 있다.

IntercepterConfig

registry를 주면서 new 객체로 TestIntercepter1()을 주게되면 해당 인터셉터 클래스의 기능을 사용한다는 것이다.

이후 addPathPatterns에 경로를 적어 넣어주면, 해당 경로에 데이터들을 따로 적어주지 않아도 출력된다.

TestIntercepter1 클래스

이곳에서 request.getParameter로 name과 age 데이터들을 받아와 저장시켜 콘솔창에도 출력해보았다.

t2 html에 데이터가 들어오면서 콘솔창에는 메소드 preHandle가 가장 먼저 출력되고 postHandle()이 마지막에 출력되는 것을 확인할 수 있다.

 1) preHandle -> 특정메소드가 실행되기 전에 호출.
 2) postHandle -> 특정메소드가 실행되고 HTML로 가기 전에 호출
 3) afterComplation -> 특정 메소드가 실행되고 HTML 페이지가 전송되면 호출.

postHandle이라는 메소드를 Ovrride할때 함께 생성된 ModelAndView 객체를 이용해 울산시라는 문자열 데이터를 addr 이름으로 html에 넘겨주었다.

 

이런식으로 postHandle로 인해 특정메소드가 실행되고 HTML로 가기 전에 호출되면서 데이터를 마지막에 보내는 것을 확인할 수 있다.

 

추가적으로 
위 addPathPatterns 세줄과 같은 코드- .addPathPatterns("/test1/t1", "/test1/t2" , "/test1/t3") 

하나의 컨트롤러에서 모든 메소드에 적용 할때-  .addPathPatterns("/test1/**")

 특정 메소드만 제외하고 싶을 때- .addPathPatterns("/test1/**")
                                   .excludePathPatterns("/test1/t3", "/test1/t2")

 특정 단어가 들어간 메소드만 실행- .addPathPatterns("test1/*List")

모든 컨트롤러에 모든 메소드를 다 넣겠다- .addPathPatterns("/**/**")

 

반응형

댓글