Dev.끄적끈적

AOP 란? 본문

Spring

AOP 란?

YeouidoSexyDeveloper 2022. 6. 16. 13:02

AOP는 무엇일까?

AOP Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.

그리고 흩어진 Aspect를 모듈화할 수 있는 프로그래밍 기법이다.

 


아래 사진 예시를 보면 이해가 쉽다.

서로 다른 클래스라고 하더라도 비슷한 기능을 하는 부분(ex 비슷한 메서드, 비슷한 코드)이있다. 이 부분을 Concern이라고 한다.(옆 색칠 되어 있는 부분)

 

이 때 만약 노란색 기능을 수정하여야하면, 각각 클래스의 노란색 기능을 수정해주어야 하기 때문에, 유지 보수 면에서 불리하다.

 

이것을 해결한 방법이 AOP이다.

 

 

흩어진 기능들을 모을 때 사용하는 것이 Aspect이다. 각각 Concern 별로 Aspect를 만들어주고, 어느 클래스에서 사용하는 지 입력해주는 방식이다. 옆의 그림이 Aspect로 모듈화 한 것을 보여주는 것이다.

 

 

 


각 모듈에는 AdvicePointcut이 있다.

Advice란 해야할 일, 기능을 나타내는 것이다.
Pointcut이란 어디에 적용해야하는지를 나타내는 것이다.(ex A라는 클래스의 W라는 메서드)

Target이라는 개념도 있는데, Target이란 각각 클래스를 나타내는 것이다.(클래스 A, B, C) 즉, 적용이되는 대상을 뜻하는 용어이다.

Join point라는 용어는 끼어들 지점을 뜻한다.(ex 메서드를 실행할 때, 필드에서 값을 가져갈 때 등등)


AOP의 핵심 기능은 코드를 수정하지 않으면서 공통 기능의 구현을 추가하는 것이라고 강조하고 있다. 핵심 기능에 공통 기능을 추가하는 방법에는 아래와 같이 3가지 방법이 존재한다.

  • 컴파일 : 자바 파일을 클래스 파일로 만들 때 바이트코드를 조작하여 적용된 바이트코드를 생성
  • 로드 타임 : 컴파일은 원래 클래스 그대로 하고, 클래스를 로딩하는 시점에 끼워서 넣는다.
  • 런타임 : 스프링 AOP가 사용하는 방법이다. A라는 클래스를 빈으로 만들 때 A라는 타입의 프록시 빈을 감싸서 만든 후에, 프록시 빈이 클래스 중간에 코드를 추가해서 넣는다.

SpringBoot AOP 적용방법 

 

1. AspectJ 라이브러리 환경설정

 

아래와 같이 build.gradle 파일에 dependencies 영역에

implementation 'org.springframework.boot:spring-boot-starter-aop' 를 추가.

 

2. @Aspect 적용 클래스 생성

 

AspectJ는 신규 클래스에 @Aspect 어노테이션만 적용해주면 쉽게 사용가능.

 

아래 @어노테이션을 @AspectJ어노테이션에 선언된 클래스의 메소드에 선언해주면,

특정 함수 실행 전후의 특정 처리가 가능하다.

 

@Pointcut : aspectJ를 적용할 타겟을 정의해준다. 전체 컨트롤러의 함수대상, 특정 어노테이션을 설정한 함수대상, 

                특정 메소드 대상 등 개발자가 적용하길 원하는 범위를 정의하는 어노테이션

@Before : aspectJ를 적용할 타겟 메소드가 실행되기 '전' 수행됨

@AfterReturning : aspectJ를 적용할 타겟 메소드가 실행된 '후' 수행됨 (제일 마지막에 수행됨)

@Around : aspectJ를 적용할 타겟 메소드 실행 전 , 후 처리를 모두 할 수 있음

 

감사합니다.

 

'Spring' 카테고리의 다른 글

DTO는 무엇이고 왜 사용할까?  (0) 2022.06.23
JPA의 이해  (0) 2022.05.17
Bean과 스프링 IoC 컨테이너  (0) 2022.03.27
DI (의존성 주입) 의 이해  (0) 2022.03.27
Controller, Service, Repository 역할, 분리  (0) 2022.03.27