공통 기능 구현의 분리
웹 개발을 하다 보면 인증인가, 로깅, 트랜잭션 등 공통 로직으로 처리해야 되는 업무가 생긴다.
공통업무에 관련된 코드를 모든 페이지마다 작성해야 한다면 중복된 코드가 많아지게 되고 프로젝트 단위가 커질수록 서버에 부하를 줄 수도 있으며, 소스 관리도 되지 않는다.
공통부분은 빼서 따로 관리하는 것이 좋다.
공통처리를 위해 활용할 수 있는 것이 3가지가 있다.
- Filter(필터) : 핸들러 동작의 전 후 과정에 부가로직 처리, 웹 컨테이너에서 관리
- Interceptor(인터셉터) : 이하 비슷함, 스프링 컨테이너에서 관리
- AOP(관점 지향 프로그래밍) : 메서드 동작의 전 후 과정에 부가로직 처리
Filter, Interceptor, AOP의 흐름
요청이 들어오면 Filter → Interceptor → AOP → Interceptor → Filter 순으로 거치게 된다.
- Filter는 Dispatcher Servlet 영역에 들어가기 전
- Interceptor는 스프링의 DispatcherServlet이 Controller를 호출하기 전
- AOP는 Controller 처리 이후 주로 비즈니스 로직에서 실행된다.
1. Filter
요청과 응답을 거른 뒤 정제하는 역할을 한다.
서블릿 필터는 DeispatcherServlet 이전에 실행이 되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청내용을 변경하거나, 여러 가지 체크를 수행할 수 있다.
HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 처리하며, 필터 적용 시 필터가 호출된 후에 서블릿이 호출된다.
실행 메서드
- doFilter() : 요청이 들어올 때마다 해당 메서드가 호출된다. HTTP 요청이 오면 작동
- init() : 필터 인스턴스 초기화
- destroy() : 필터 인스턴스 종료
2. Interceptor
요청에 대한 작업 전/후로 가로챈다
필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다.
하지만 인터셉터는 스프링의 DispatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트 내부에서 Controller에 관한 요청과 응답에 대해 처리한다.
스프링의 모든 빈 객체에 접근할 수 있으며, N개 등록될 수 있다.
실행 메서드
- preHandler() : 컨트롤러 메서드가 실행되기 전, 전처리 작업이나 요청 정보를 가공하거나 추가하는 경우
- postHandler() : 컨트롤러 메서드 실행직 후 view 페이지 렌더링 되기 전
- afterCompletion() : view 페이지가 렌더링 되고 난 후, 요청 처리 중에 사용한 리소스를 반환할 때
3. AOP(Aspect Oriented Programming)
관점 지향 프로그래밍이다.
AOP의 등장으로 인해 OOP(객체 지향 프로그래밍)을 더욱 OOP 답게 할 수 있게 되었다.
AOP의 기능을 비즈니스 로직과 공통 모듈로 구분한 후에 개발자의 코드 밖에서 필요한 시점에 비즈니스 로직을 삽입하여 실행되도록 한다. 즉, OOP에서는 공통적인 기능을 각 객체의 횡단으로 입력했다면, AOP는 공통적이 기능을 종단 간으로 삽입할 수 있도록 한 것이다.
개발자는 계정, 게시판, 계좌이체와 같은 기능을 만들고, 공통적인 관심을 처리하는 모듈을 분리해서 개발한 뒤, 필요한 시점에 자동으로 소스코드가 삽입되도록 하는 것이다.
Interceptor나 Filter와는 달리 메서드 전후의 지점에 자유롭게 설정이 가능하다.
Interceptro와 Filter는 주소로 대상을 구분해서 걸러내야 하는 반면, AOP는 주소, 파라미터, 어노테이션 등 다양한 방법으로 대상을 지정할 수 있다.
AOP 주요 용어와 흐름
Aspect
구현하고자 하는 횡단 관심사(로깅, 트랜잭션, 권한 등)의 기능을 의미한다.
한 개 이상의 point cut과 advice의 조합으로 만들어진다.
Join Point
aspect를 삽입하여 advice가 적용될 수 있는 위치를 의미한다.
advice를 적용 가능한 지점을 의미한다. 메서드 호출, 필드 값 변경 등이 join point에 해당한다.
Point cut
join point의 부분집합으로서 실제로 advice가 적용되는 join point를 나타낸다.
하나 또는 복수의 join point를 하나로 묶은 것을 point cut이라고 한다.
Advice
aspect의 구현체로 join point에서 실행되어야 하는 코드이다.
관점으로서 분리되고 실행 시 모듈에 weaving(advice를 핵심 로직 코드에 적용하는 것) 된 구체적인 처리를 AOP에서는 advice라고 한다.
실전
Q. Request가 들어올 때 거치는 순서, 각 역할들의 장점 및 차이점을 설명해 주실 수 있을까요?
Request가 들어와서 처음 만나는 곳은 Filter입니다. Filter는 HTTP 프로토콜 요청을 받으면 가장 먼저 받아서 처리하며, 요청을 거르고 정제하는 역할을 합니다. 또한 DispatcherServlet 이전에 실행되어 요청 내용을 변경하거나 여러 가지 체크를 수행할 수 있다. 예를 들면, 헤더에 토큰이 포함되어 있는지 확인하고 올바른 토큰인지 검증하는 역할을 합니다. Filter를 지나고 나면 DispatcherServlet에 등록된 Interceptor를 만나게 됩니다. Interceptor는 서버에 들어온 request객체를 컨트롤러의 핸들러로 도달하기 전에 가로채서 부가적인 기능이 실행되게끔 만들어줍니다. Interceptor는 Filter와는 달리 스프링의 기술이기 때문에 스프링의 모든 빈 객체에 접근할 수 있으며 여러 개의 Interceptor를 등록하여 적용할 수 있습니다. Interceptor가 자신의 역할을 마치면 Controller에 도달하여 여러 가지 기능들을 수행하는데 그곳에서 AOP가 적용됩니다. AOP는 관점 지향 프로그래밍으로 AOP의 등장으로 더욱 OOP 다운 프로그래밍을 할 수 있게 되었습니다. AOP의 기능을 비즈니스 로직과 공통 모듈로 구분한 뒤에 개발자의 코드 밖에서 필요한 시점(point cut 설정)에 비즈니스 로직을 실행하여 공통적이 기능을 종단면에서 바라보고 처리할 수 있게 합니다. Filter와 Interceptor와는 다르게 비즈니스 로직을 처리할 때 사용되며, Filter와 Interceptor는 주소로만 대상을 구분하지만 AOP는 주소, 파라미터, 어노테이션 등 다양한 방법으로 대상을 지정할 수 있습니다.
참고
https://goddaehee.tistory.com/154
https://sallykim5087.tistory.com/158
항해 개발자 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.
IT 커리어 성장 코스 항해99, 개발자 취업부터 현직자 코스까지
항해99는 실무에 집중합니다. 최단기간에 개발자로 취업하고, 현직자 코스로 폭발 성장을 이어가세요. 실전 프로젝트, 포트폴리오 멘토링, 모의 면접까지.
hanghae99.spartacodingclub.kr
'멋진 개발자 > Java & Spring' 카테고리의 다른 글
개발자 취준 기록 34 - Hash(Table·Map·Set) (0) | 2024.03.28 |
---|---|
개발자 취준 기록 33 - Java 제네릭 (Generic) (0) | 2024.03.27 |
[항해 취업코스] 개발자 취준 기록 18 - Spring bean container의 생명주기 (0) | 2024.03.12 |
[항해 취업코스] 개발자 취준 기록 17 - 즉시로딩, 지연로딩 (3) | 2024.03.12 |
[항해 취업코스] 개발자 취준 기록 16 - N + 1 발생 이유와 해결방법 (0) | 2024.03.12 |