728x90

1. AOP (Aspect Oriented Programming)

  • 관점 지향 프로그래밍
  • Spring에서 각각의 로직들은 비지니스 로직과 부가기능으로 구성된다.사진
  • 어떤 로직을 기준으로 1) 핵심적인 관점 2) 부가적인 관점으로 관점을 나누어 각각을 모듈화 하겠다는 것!
  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를 노출시키지 않고, 외부로부터 감추고 싶을 때 사용하는 패턴

https://sourcemaking.com/design_patterns/proxy

해당 그림의 흐름을 설명하자면..

  1. client가 해당 함수를 직접 호출하지 않고, proxy를 호출한다.
  2. proxy class가 실제 class를 호출한다.
  3. 실제 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과 연결해서 사용됨, 빈 객체에 접근 가능하다.
728x90
복사했습니다!