본문 바로가기

Java/Spring Framework

AOP

반응형
  • `Aspect Oriented Programming 의 개념과 주요 용어
  • 포인트컷 문법
  • @Aspect 어노테이션

 

객체지향 기본원칙을 적용해서 핵심기능과 부가기능을 분리해서 모듈화하는 것은 매우 어렵습니다.

스프링AOP는 OOP를 보완하는 수단으로 흩어진 Aspect를 모듈화할 수 있는 기법입니다. 

 

 

핵심기능과 부가기능

업무 로직을 포함하는 기능을 핵심기능(core concerns)

핵심 기능을 도와주는 부가적인 기능(로깅, 보안 등) --> 부가기능(cross-cutting concerns)

핵심 기능에서 부가기능을 분리해서 모듈화하는 프로그래밍 기법이 AOP 입니다.

 

Aspect는 Crosscutting Concerns 를 모듈화한 것을 의미합니다.

모듈안에는 advice (해야할 일들), Join point(method 실행 시점 등 어디에서 합류할 것인지를 정해두는 것입니다) 와 pointcut(어디에 적용할 것인지)가 포함됩니다.

target은 적용이 되는 대상이라 할 수 있습니다.

 

자바에서 AOP 구현체는 AspectJ 와 스프링 AOP가 있습니다.

 

AOP를 적용하는 방법은 아래와 같습니다.

1. 컴파일시점에 하는 방법 : 자바 파일을 class 파일로 만들때 사용하는 방식

2. 로드타임 : 컴파일된 바이트 코드는 그대로 있지만 JVM에 의해 로드되는 그 시점에 끼워넣는 방식 

3. 런타임 : A라는 Bean을 감싼 Proxy Bean을 만들고 이 Proxy Bean이 A호출전에 처리하는 방식으로 스프링 AOP 에서 사용하는 방법입니다.

 

스프링 AOP 적용 방법

interface 타입의 subject 가 있고 이를 구현한 RealSubject 가 있습니다. 또한 이와 관련된 Proxy 를 만드는 형태입니다.

 

실제 적용한 형태를 보겠습니다.

EventService 인터페이스가 있고 이를 구현한 SimpleEventService 가 있습니다. 각 메소드 안에서 수행할 일들을 작성해두고 AppRunner 에서 메소드를 호출하는 형태입니다.

이때 각메소드의 기능과는 상관없지만 특정 일을 수행하는 부분을 추가하고싶으면 어떻게 해야할까요 ? 

단순히 SimpleEventService 클래스의 각 메소드에 코드를 추가하는 방법도 있겠지만, "Proxy"를 이용하는 방법도 있습니다!

 

첫번째 방법은  EventService를 구현한 Proxy 클래스를 @Primary 로 해주는 것입니다.

이렇게 만들게 되면 Proxy 클래스를 만드는 수고가 들게 되는 단점이 있습니다.

 

동적으로 Proxy 객체를 만들 수도 있습니다. 

AbstractAutoProxyConstructer 는 bean이 만들어진 다음에 이를 감싸는 AOP proxy bean을 만들어주는 역할을 수행합니다.

@AOP를 적용하기 위해서 pom.xml 에 dependency 추가를 해줘야합니다.

pom.xml

그리고 proxy 에 advice 와 pointcut 을 정의해야합니다. 

com.intro 패키지 밑의 모든 클래스에서 EventService 라는 인터페이스 하위의 모든 메소드에 아래 있는 기능을 수행한다는 의미입니다.

이렇게 하게 되면 모든 메소드에서 적용이 되므로 Annotation 방식을 이용한것도 살펴보겠습니다.

먼저 어노테이션을 만들어줍니다. 이때  Retention의 기본값이 CLASS입니다.

그런 다음  Service 클래스에 실행하고 싶은 메소드 위해 어노테이션을 붙여줍니다.

마지막으로  Around를 어노테이션으로 변경하면 됩니다.

반응형

'Java > Spring Framework' 카테고리의 다른 글

Servlet  (0) 2021.02.08
Null-safety  (0) 2021.02.07
SpEL  (0) 2021.02.07
Data binding  (0) 2021.02.04
Validation  (0) 2021.02.04