IT수업/STS3

IT 수업 20주차 (136) Filter and Interceptor

워제하 2024. 5. 10. 15:29

 

< 실습하기 >

09 프로젝트를 복사하여 10_Filter_Interceptor 프로젝트를 만들어준다.

 

src/main/java에 filter 패키지를 만들고 TestFilter 클래스를 만들어 준다.

 

 

 

Filter는 javax servlet으로 import 해준다.

TestFilter에 빨간줄 뜰때 마우스를 올리면 add 뜨는데 그거 누르면 자동으로 코드가 생긴다.

 

 

한번 실행시켜본다.

 

 

 

주소창에 /memo/add를 치고 안에 값을 넣고 제출버튼을 누르면 콘솔창에 이전에 만든 aop가 출력된다.

 

 

 

 

 

● 인터셉터

개발자가 특정 Controller의 핸들러가 실행되기 전이나 후에 추가적인 작업을 원할 때 Interceptor를 사용한다. 

스프링 인터셉터를 사용함으로써 코드의 중복을 줄이고 관심사를 분리하여 개발자는 핵심 비즈니스 로직에 집중할 수 있다. 또한, 유연한 설정 방식과 다중 인터셉터 지원으로 인해 개발자는 프로젝트의 요구에 맞게 인터셉터를 활용할 수 있다.

 

 

●Spring Interceptor의 작동원리

1. HandlerMapping 검색
클라이언트의 요청이 들어오면 먼저 HandlerMapping 이라는 Spring 컴포넌트가 요청과 관련된 적절한 컨트롤러를 찾는다. HandlerMapping은 요청 URL을 기반으로 컨트롤러를 선택하는 역할을 한다.

2. Interceptor 체인 생성
HandlerMapping은 해당 컨트롤러와 연결된 Interceptor 체인을 생성한다. Interceptor 체인은 여러개의 Interceptor 객체로 구성될 수 있으며, 각각의 Interceptor는 요청을 가로 채고 처리하는 역할을 수행한다.

3. PreHandle 매서드 호출
Interceptor 체인의 각 Interceptor는 PreHandle 매서드를 호출하여 요청을 가로챈다. PreHandle 매서드는 요청을 처리하기 전에 싱행되는 매서드로, 요청에 대한 사전 작업을 수행할 수 있다.

4. 컨트롤러 호출
PreHandle 메서드 실행 후, HandlerMapping은 적절한 컨트롤러를 호출한다. 컨트롤러는 클라이언트 요청을 처리하고, 결과를 반환한다.

5. PostHandle 메서드 호출
컨트롤러가 실행된 후에는 Interceptor 체인의 각 Interceptor의 PostHandle 메서드가 호출된다. PostHandle 메서드는 컨트롤러의 실행 결과를 가로채고, 후속 작업을 수행할 수 있다.

6. View 렌더링 및 응답
PostHandle 메서드 실행 후, HandlerMapping은 적절한 View를 렌더링하여 클라이언트에게 응답을 보낸다.

7. AfterCompletion 메서드 호출
응답이 완료되면 Interceptor 체인의 각 Interceptor의 AfterCompletion 메서드가 호출된다. AfterCompletion 메서드는 요청 처리가 완료된 후에 실행되며, 리소스 정리나 로깅 등의 작업을 수행할 수 있다.

 

 

 

< 장점 >

1. 중앙 집중적인 공통 기능 관리

Interceptor를 사용하면 로그인 체크, 권한 검사, 로깅, 예외 처리 등과 같은 공통적인 기능을 중앙에서 관리할 수 있습니다. 중복 코드를 제거하고 유지보수성을 향상시킬 수 있습니다.

2.재사용성과 확장성

Interceptor는 여러 컨트롤러에 적용될 수 있으며, Interceptor 체인을 구성하여 여러 개의 Interceptor를 조합할 수 있습니다. 이로 인해 공통 기능을 간편하게 재사용하고, 필요에 따라 확장할 수 있습니다.

3. 요청 처리 과정 제어

Interceptor는 요청 전(preHandle)과 후(postHandle)에 실행되는 메서드를 제공하여 요청 처리 과정을 세밀하게 제어할 수 있습니다. 예를 들어, 요청 전에 인증 체크를 수행하거나, 요청 후에 로깅 작업을 수행할 수 있습니다.

4. 전역 예외 처리

Interceptor를 사용하면 예외 처리를 중앙에서 처리할 수 있습니다. 예외가 발생하면 Interceptor의 예외 처리 메서드를 활용하여 일관된 방식으로 예외를 처리하고 사용자에게 적절한 응답을 보낼 수 있습니다.

 

 

 

< 단점 >

1. 성능 영향

Interceptor는 요청과 응답 사이에 위치하므로, 매 요청마다 Interceptor 체인이 실행되어야 한다. Interceptor가 많거나 복잡한 작업을 수행하는 경우 성능에 영향을 줄 수 있다. 따라서 Interceptor의 사용은 신중하게 고려되어야 한다.

2. 컨트롤러와의 결합도

Interceptor는 컨트롤러와 긴밀하게 결합되어 있다. 이는 컨트롤러의 변경에 따라 Interceptor도 변경될 수 있음을 의미한다. 따라서 Interceptor의 사용은 컨트롤러와의 강한 결합도를 가질 수 있으므로 유지보수에 주의가 필요하다.

3. 작업의 순서와 조건 제어

Interceptor 체인에서 Interceptor의 실행 순서와 조건 제어를 올바르게 설정해야 한다. 잘못된 순서나 조건 설정은 의도하지 않은 동작을 유발할 수 있으므로 주의가 필요하다.

4. 제한된 범위

Interceptor는 주로 웹 요청을 처리하는 데 사용된다. 따라서 웹 애플리케이션에만 적용 가능하며, 다른 종류의 요청이나 서비스에는 사용할 수 없다.

 

 

● Filter와 Interceptor의 비교

- Spring Interceptor : Spring MVC에 종속적으로 동작하며, 컨트롤러에 집중된 기능을 처리하고 중앙에서 관리한다.
- Filter : Java Servlet 스펙에 정의된 필터 인터페이스를 구현하여 동작하며, 웹 애플리케이션 전체에 영향을 미친다.
- AOP : 관점 지향 프로그래밍의 개념을 기반으로 동작하며, 애플리케이션 전체의 핵심 비즈니스 로직에 공통 기능을 적용한다.

 

 

src/main/java에 interceptor 패키지를 추가해주고 그 안에 MemoInterceptor 클래스를 만들어 준다.

 

 

 

빈 등록은 할 필요 없이 implements를 해준다.

 

 

그리고 마우스 우클릭으로 source의 override/implement의 HandlerInterceptor를 추가해준다.

 

HandlerInterceptor 인터페이스

스프링 인터셉터는 HandlerInterceptor 인터페이스를 구현하여 작성된다. 이 인터페이스는 세 가지 메서드를 가지고 있다.

  • preHandle() : 컨트롤러 실행 전에 호출되는 메서드입니다. 요청을 가로채고 사전 작업을 수행할 수 있다. 이 메서드가 true를 반환하면 요청은 계속 진행되고, false를 반환하면 요청 처리가 중단된다.
  • postHandle() : 컨트롤러 실행 이후에 호출되는 메서드이다. 컨트롤러의 실행 결과에 대한 후처리 작업을 수행할 수 있다.
  • afterCompletion() : 뷰 렌더링까지 완료된 후에 호출되는 메서드이다. 최종적인 작업 처리를 수행할 수 있다.

 

 

첫번째 override인 preHandle은 boolean형이라 리턴을 true로 바꿔준다.

 

 

그리고 sysout으로 출력을 확인해본다.

 

 

WebMvcConfig로 가서 확인해야한다.

WebMvcConfig의 맨밑으로 이동하여 마우스 우클릭으로 source의 override/implement의 addInterceptors를 추가해준다.

 

받은 override에 addInterceptor를 작성해준다.

 

그리고 프로그램을 실행하여 memo/add로 가면 MemoInterceptor가 실행된다. 만약 memo가 아닌 다른 페이지로 간다면 interceptor는 반응하지 않는다.

 

 

 

 

 

 

 

 

 

 

 

 

 

참조 : https://velog.io/@dnflekf2748/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%9D%B8%ED%84%B0%EC%85%89%ED%84%B0Interceptor