728x90
Spring Boot Filter and Interceptor
Spring의 Request/Response 구조
위와 같이 요청 하나에도 스프링 내부에선 수많은 레이어를 지나서 요청이 수행된다!
- 클라이언트로부터 요청이 들어오면 해당 요청은 먼저 Filter를 거치게 된다
- 그리고 DispachServlet을 거쳐서 Contoller 레이어로 넘어가게 된다
- Controller layer
- 먼저 HandlerInterceptor에 요청이 넘어간다
- 그리고 Handler로 넘어가는데, 이는 우리가 알고 있는 실제 controller의 역할을 하게 된다 (@RequestMapping을 통해 매핑하는 역할을 Handler가 한다)
- View 레이어의 ViewResolver에서 view를 Mapping한다
종단 관심사와 횡단 관심사(Cross Cutting Concerns)
- 관심사 (Concerns)
- 관심사란, 컴퓨터 프로그램 코드에 영향을 미치는 정보의 집합이다
- 컴퓨터 과학에서 관심사 분리(separation of concerns, SoC)는 컴퓨터 프로그램을 구별된 부분으로 분리시키는 디자인 원칙(설계 원칙)으로, 각 부문은 개개의 관심사를 해결한다
- 즉, SoC는 컨트롤러/비즈니스(애플리케이션)/데이터 액세스 레이어로 분리하는 것을 의미한다
- 모듈을 만들어 로직을 분리하는 것이다
- 관심사 분리를 이용하면 프로그램의 설계, 디플로이, 이용의 일부 관점에 더 높은 정도의 자유가 생긴다
- 종단 관심사
- 특정 기능과 관련된 관심사
- Presentation Layer, Business Layer, Data Access Layer
- 횡단 관심사
- 모든 Layer에 걸쳐 공통적으로 필요한 관심사
- 모든 종단 관심사에 걸쳐 필요한 처리
- 로깅, 캐싱 등..
Spring에서 횡단 관심사를 구현하는 방법
- HTTP Request, REST API 레벨의 횡단 관심사 - 실제 controller가 수행되기 전에 수행됨
- Filter
- HandlerInterceptor
- Method 레벨의 횡단 관심사 - 특정 메소드에 대해 공통적으로 로직을 추가하는 방법
- Aspect Oriented Programming(AOP)
Filter vs HandlerInterceptor
- 모든 요청이 들어오면 controller가 실행되기 전에 필터나 인터셉터를 통해 특정 동작을 수행한다
- 필터
- 여러개가 존재할 수 있다
- 로깅, 인증(Authentication), 인가(Authorization) 등..
- DispatcherServlet
- request를 어떤 controller method로 넘길지 선택해주는 역할을 한다
Filter
- Servlet 컨테이너와 Dispatcher Servlet 사이에서 실행됨
- Filter 인터페이스를 구현
- doFilter 메소드에서 Filter에서 수행될 코드를 구현
- 목적별로 다수의 Filter가 수행 가능
- Loggin Filter, Authenticating Filter, ...
- Filter의 순서 지정 가능
서버
- 물리적 서버 - 리눅스 서버
- 웹서버 - nginx (정적인 파일 처리)
- WAS - tomcat (프로그램을 돌릴 수 있는 서버)
Filter 실습
- LoggingFilter의 생성 및 구현
- AuthenticateFilter의 생성 및 구현
- @Order 설정
- HttpServletRequest 클래스의 멤버 변수 호출
- AuthenticateFilter에서 Service 레이어 메소드 호출
(실습 파일은 0330 라이브강의에 있음! 나중에 혼자 하면서 복습해보기!)
HandlerInterceptor
- DispatchServle과 Handler(Controller) 사이에서 실행
- HandlerInterceptor 인터페이스를 구현하거나 HandlerInterceptorAdopter를 상속
- 총 3개의 메소드를 오버라이딩한다
- preHandler() : Controller가 호출되기 전에 실행
- postHandle() : Controller가 종료된 후 실행
- afterCompletion() : View에 Model이 렌더링 되고 난 후 실행
HandleInterceptor 실습
- LoggingInteceptor 생성 및 구현
- Config 클래스에서 Interceptor 등록
- log 출력 정보로 호출 순서 확인
(이것도 실습 코드 참고!)
728x90
'코드프레소 체험단' 카테고리의 다른 글
[그림과 실습으로 배우는 도커 & 쿠버네티스] 스터디 🐳 (0) | 2022.05.04 |
---|---|
[Java 웹 개발 트랙 개발 팀 프로젝트] 오리엔테이션 (0) | 2022.03.10 |
[라이브 강의] 2022-01-19 (0) | 2022.02.28 |
[오프라인] 2022-02-05 (0) | 2022.02.06 |
댓글