본문 바로가기

Development/Spring Framework

스프링 삼각형과 설정 정보 (2) AOP

AOP [ Aspect-Oriented Programming ]

직역하자면 '관점 지향 프로그래밍'이다. DI는 의존성에 대한 주입이라면, 스프링 AOP는 로직(code) 주입이라고 할 수 있다.

프로그램을 작성하다 보면 다수 모듈이 공통적으로 나타나는 부분이 존재하는데, 이를 횡단 관심사(Cross-cutting concern)이라고 한다.

 

이 말이 이해가 되지 않는다면 DB와 연결할 때 코드를 생각하면 된다. ( 책 284 페이지 참고 )

 

코드 = 핵심 관심사 + 횡단 관심사

 

이 말은 무엇이냐, 공통적으로 나타나는 횡단 관심사와 모듈별로 다르게 나타나는 핵심 관심사로 이루어져있다는 것이다.

앞서 AOP는 로직 주입이라고 설명하였는데, 로직을 주입한다면 어디에 주입할 수 있는가?

 

 

위 그림처럼 총 다섯 군데에 주입할 수 있다. Around, Befroe. After, AfterReturning, AfterThrowing 이렇게 말이다. 

 


예제. 집에 돌아 온 뒤 하는 일

 

게임이 취미인 중학생 아들은 집에 돌아와 하는 일이 아래와 같다.

문을 열고 집에 들어간다.
컴퓨터로 게임을 한다.
소등하고 잔다.
문을 잠그고 집을 나선다.

요리가 취미인 중학생 딸이 집에 들어와 하는 일은 아래와 같다.

문을 열고 집에 들어간다.
요리를 한다.
소등하고 잔다.
문을 잠그고 집을 나선다.

AOP를 적용하며 Boy.java에 단일 책임 원칙(SRP)를 자연스럽게 적용할 수 있다. Aspect를 사용함으로 구현하고자 하는 핵심 관심사만 구현하면 되기 때문이다.

 

 

AOP의 핵심은 아래 세 가지로 요약할 수 있다.

  • 스프링 AOP는 인터페이스(interface) 기반이다.
  • 스프링 AOP는 프록시(proxy) 기반이다.
  • 스프링 AOP는 런타임(runtime) 기반이다.

JoinPoint

Pointcut의 후보가 되는 모든 메서드들이 JointPoint. 즉, Aspect 적용이 가능한 지점이 된다. 고로, JoinPoint란 Aspect 적용이 가능한 모든 지점이라고 이야기할 수 있다.

 

스프링 AOP에서 JoinPoint란 스프링 프레임워크가 관리하는 Bean의 모든 메서드에 해당하며, 이를 광의의 JoinPoint라고 한다.