1. AOP (Aspect Oriented Programming)
- 관점 지향 프로그래밍
- Spring에서 각각의 로직들은 비지니스 로직과 부가기능으로 구성된다.
- 어떤 로직을 기준으로 1) 핵심적인 관점 2) 부가적인 관점으로 관점을 나누어 각각을 모듈화 하겠다는 것!
- 핵심적인 관점 == 핵심 비지니스 로직
- 부가적인 관점 == 핵심 로직을 실행하기 위한 부가적인 기능들 (데이터베이스 연결, 로깅, 트랜잭션 처리, 데이터 보호를 위한 암호화, 일괄적인 예외 처리 등)
- 각각의 로직들에서 계속 반복되어 쓰여지는 코드들 == 흩어진 관심사 (= 횡단 관심사 / 주로 부가기능)
- 이러한 반복된 코드들을 모듈로 만들어 놓으면 개발 속도가 빨라지고, 유지보수성도 향상됨
- 이와 같이 흩어진 관심사들을 Aspect로 모듈화 하고, 핵심적인 비즈니스 로직에서 분리하여 재사용할 수 있게 만들겠다는 것이 AOP의 취지
AOP의 주요 개념들
- Aspect : 흩어진 관심사를 모듈화 한 것 (추상적인 명칭)
- Target : Aspect를 적용하는 곳, 비지니스 로직을 가지고 있는 실제 메서드 (클래스, 메서드 등..)
- Advice : 실질적인 부가기능을 담은 구현체 (join point, pointcut, 횡단 관심사 처리 코드로 구성됨 )
- Join Point : Advice가 동작되는 시점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용 가능
- PointCut : Join Point의 상세 스펙을 정의한 것. 더욱 구체적으로 Advice가 실헹될 지점을 정할 수 있음 (표현식)
- Weaving : Aspect를 비지니스 로직 코드에 적용하는 행위 자체를 의미
왜 모듈화 하는걸까?
- 반복되는 코드인 횡단 관심사들을 각각의 모듈로 만들어 놓으면 개발 속도가 빨라지고, 유지보수성이 향상되기 때문!
spring AOP는 프록시 기반의 AOP 구현체이다.
그럼 여기서 프록시란 무엇을 말하는걸까?
proxy pattern?
- 원래 객체를 감싸고 있는 객체
- 프록시 객체가 원래 객체를 감싸서, client의 요청을 처리하게 하는 패턴
- 특정한 interface를 노출시키지 않고, 외부로부터 감추고 싶을 때 사용하는 패턴
해당 그림의 흐름을 설명하자면..
- client가 해당 함수를 직접 호출하지 않고, proxy를 호출한다.
- proxy class가 실제 class를 호출한다.
- 실제 class에서 반환받은 값을 client에게 반환한다.
- 부수적인 업무들은 proxy에 코딩하고, 주 업무는 실제 class에 코딩한다.
proxy pattern의 장단점
장점
- 사이즈가 큰 객체가 로딩되기 전에 proxy를 통해 참조할 수 있다.
- 실제 객체의 public, protected 메서드들은 숨기고, 인터페이스를 통해 노출시킬 수 있다.
- 로컬에 있지 않고 떨어져 있는 객체를 사용할 수 있다. (분산처리)
- 원래 객체의 접근에 대해 사전 처리가 가능하다.
단점
- 객체를 생성할 때 한단계를 거치게 되므로, 빈번한 객체 생성이 필요한 경우 성능이 저하될 수 있다.
왜 proxy를 이용해 AOP를 구현할까?
- OCP를 지키기 위해서
OCP?
OCP란 개방 폐쇄 원칙으로 소프트웨어 확장에 대해서는 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 하는 원칙이다.
OCP는 객체지향 설계 원칙 중 하나이고, JAVA는 객체지향 언어이며 Spring은 객체지향 언어인 JAVA를 기반으로 한 웹 프레임워크이다.
앞서 설명한 proxy를 보면 인터페이스를 사용해 변화는 허용하지 않게 해준다. 따라서 spring은 proxy를 통해 OCP를 지키고 있다고 할 수 있다.
spring에서의 proxy
결론적으로 spring에서 proxy는 실제 target의 기능을 대신 수행하면서, 기능을 확장하거나 추가하는 실제 객체이다.
예를 들어 DB를 사용할 때 쓰는 @Transactional 어노테이션은 proxy를 사용하고 있다.
우리가 @transacrtional 어노테이션이 적용된 메서드를 호출하면 proxy가 먼저 호출되고, 그 다음 transacrion 코드 그리고 내가 실행시킨 메서드가 실행되는 것을 볼 수 있다.
2. Filter
- spring의 독자적인 기능이 아닌 servlet에서 제공하는 기능이다.
- 클라이언트로부터 오는 요청과 servlet 사이에 위치한다.
- 클라이언트의 요청 정보와, 요청 결과를 알맞게 변경할 수 있다.
Filter의 특징
- Filter chain을 통해 여러 필터가 연쇄적으로 동작하게 할 수 있음
- 주로 요청에 대한 인증, 권한 체크 등을 하는데 쓰임
- 들어온 요청이 servlet으로 전달되기 전에 헤더를 검사해 인증 토큰이 있는지 없는지, 올바른지 올바르지 않은지 등을 검사함
- Post로 요청을 받을 때 인코딩 설정에 쓰임
3. Interceptor
인터셉터는 client에서 server로 들어온 request를 controller의 handler로 도달하기 전 가로채서 원하는 추가 작업이나 로직을 수행한 후, handler로 보내주는 것이다.
여기서 handler는 사용자가 요청한 url에 따라 실행되어야 할 method이다.
- 여러 컨트롤러에서 공통적으로 사용되는 기능을 정의한다. (request에 대한 검사, response header 설정 등)
- 주 목적은 컨트롤러의 수정 없이 컨트롤러 수행 전/후처리 동작을 추가해 컨트롤러의 반복적인 코드를 제거하기 위함이다.
인터셉터는 filter와 유사하지만, 필터의 기능중
1) 핸들러 자체의 실행을 금지하는 옵션
2) 후처리 기능
이 두가지만 허용하기 때문에 실제로는 필터가 더 강력한 기능이다.
(인터셉터는 조금 더 세분화된, 컨트롤러의 반복 코드 제거나 권한 확인시에 사용하는 것을 권장함
필터는 모든 요청과 응답에 관한처리, 특정 컨텐츠에 필터를 매핑하는 경우 사용됨)
인터셉터 사용 예시
인터셉터는 주로 로그인 처리에 이용할 수 있다.
- 특정 웹 페이지에 접근할 때, 이미 로그인한 사용자인지 확인하고 로그인 하지 않은 경우는 로그인 페이지로 유도할 때 사용할 수 있다.
- 만약, 인터셉터를 적용하지 않는다면 게시물 작성, 수정, 삭제 등 모든 요청마다 controller에서 session을 통해 로그인 정보가 남아있는지 확인하는 코드를 작성해야 한다.
AOP vs Interceptor vs Filter
이 셋의 공통점은
- 공통된 부분을 모듈화 함
- 어떤 행동을 하기 전 먼저 실행하거나, 실행한 후에 추가적인 행동을 할 때 사용되는 기능이다.
차이점
셋의 차이점은 우선 동작 시점이 다르다.
filter, interceptor, aop의 순서대로 실행된다.
- filter는 사용자의 request를 받아서 servlet에 가기 전에 실행된다.
- interceptor는 controller에 가기 전에 실행된다.
- aop는 어드바이스에 따라 비즈니스 메소드가 호출될 때, 호출된 후, 예외가 발생하는 시점등에서 적용된다.
또 다른 차이점은
- Filter : spring과 무관한 servlet의 기술, url 기반으로 동작한다.
- Interceptor : spring의 기술, url 기반으로 동작, 빈 객체에 접근 가능하다.
- AOP : spring의 기술, pointcut 기반으로 동작, 웹과 무관하게 business logic과 연결해서 사용됨, 빈 객체에 접근 가능하다.
'Computer Science > Web programming' 카테고리의 다른 글
[CS] MSA 구조 정리 (0) | 2022.08.04 |
---|---|
[Web] TDD 방법론 (1) | 2022.05.24 |
[Web] REST vs RESTful vs REST API(RESTful API) (2) | 2021.12.31 |
[Web] DTO와 VO의 차이 (1) | 2021.12.17 |
[Web] servlet & jsp의 개념 / MVC pattern, Front Controller Pattern (2) | 2021.10.09 |