[Spring] AOP란?

Intro

AOP에 대해서 정리한다.

AOP란

AOP(Aspect-Oriented Programming)이란 관점 지향 프로그래밍이라 불린다.
어떤 로직을 핵심적인 관점과 부가적인 관점(로그, 유효성 검사 등)으로 나눠서 보고 부가적인 관점을 잘라내서 모듈화 하는 것을 의미한다.
예를 들어, 회원가입이라는 로직을 실행하려 하는데 회원가입을 하기 전에 유효성 검사와 세션 체크를 하게 된다고 가정한다.
이 때, 회원가입은 핵심관점으로 보고 유효성 검사와 세션 체크를 부가적인 관점으로 본다.
부가적인 관점인 유효성 검사와 세션 체크를 AOP를 통해 별도로 관리한다고 생각하면 된다.

AOP는 부가적인 관점에서 공통적으로 사용되는 코드가 있다면 해당 코드를 모듈화하여 공통 관심사로 분리한다.
그리고 공통 관심사를 Aspect로 정의하고 Aspect를 적용할 메소드나 클래스에 Advice를 적용하여 공통 관심사와 핵심 관심사를 분리할 수 있다.
이렇게 AOP에서는 공통 관심사를 별도의 모듈로 분리하여 관리하며, 이를 통해 코드의 재사용성과 유지 보수성을 높일 수 있다.

AOP 예시

img

사진에서 보는 것과 같이 A,B,C 에 주황색 블록이 동일하게 존재한다. 이는 A,B,C 클래스에서 모두 동일하게 사용되는 코드를 의미한다.

이 때, 주황색 블록 코드를 수정할 때 모든 클래스의 주황색 블록 코드를 수정해야 하기에 유지보수성이 안좋다는 것을 의미한다.

주황색 블록을 Aspect X로 묶어서 모듈화 시킨 후 관리한다면 앞에서 설명한 문제점이 사라지고 유지보수성이 강화된다.

위 예시와 같이 AOP(관점 지향 프로그래밍)는 소스코드에서 반복되는 코드들을 하나로 묶어 모듈화하여 재사용성과 유지보수성을 높인다는 강점이 있다. 또한 컨트롤러 단에서 코드들이 굉장히 깔끔해진다는 점도 있다.

또 다른 예시로는 Controller단에서 공통적으로 유효성 검사(id 입력여부, passwd 대소문자 특수문자여부)를 했던 부분을 공통으로 처리하는 클래스를 만들어서 처리한다.

AOP 의존성 설정(maven)

1
2
3
4
5
<!-- AOP -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

위 설정을 해주면 @Aspect, @Around, @Before 등 AOP 관련 어노테이션 사용이 가능하다.

AOP 용어

Target

  • advice가 되는 객체, 부가 기능을 부여할 대상

Advice

  • Aspect 기능을 정의한 것으로, 공통 관심기능(메서드)을 의미한다.
  • 실질적으로 어떤 일을 해야할 지에 대한 것과 실질적인 부가기능을 담은 구현체이다.
  • 타깃에게 제공할 부가 기능을 담은 모듈로, 타깃이 필요 없는 순수한 부가 기능이다.
    • ex) 메소드 실행 시간 체크, 유효성 검사 등

Joinpoint

  • Advice를 적용 가능한 지점(위치)을 의미(before, after)

Pointcut

  • Advice를 적용할 위치(JoinPoint)를 선별하는 작업을 의미한다.
  • 어떤 메서드에 Advice를 적용할 것인가? 라고 생각하면 된다.
  • 수 많은 JoinPoint 중에서 특정 메서드에서만 공통기능을 수행시키기 위해 사용한다.
  • Pointcut 표현식
    • execution(접근제어자 패키지경로.클래스.메서드)
      • ‘*’ : 모든 것
      • ’..’ : 0개 이상
      • *Controller(..) -> Controller로 끝나는 모든 메서드 중 인자 값이 0개 이상인 모든 것으로 해석된다.

Aspect

  • advice + pointcut을 모듈화 한 것. (AOP 기능과 기능을 적용하는 지점을 모듈화 해둔 것.)
  • 부가 기능을 정의한 Advice와 Advice를 어디에 적용할 지 결정하는 Pointcut을 함께 가진다.
  • 동작 시점을 5가지로 지정함.
    • before, after, after-running, after-throwing, around

Weaving

  • Advice가 핵심 기능에 삽입되는 과정을 말한다.

AOP 특징

  • AOP는 스프링 Bean에서만 적용이 가능하기에 @Component를 통해서 Bean으로 등록해야 함.

AOP 어노테이션

@Aspect

  • AOP로 등록해주는 어노테이션
  • Aspect 모듈임을 명시하고, Bean에 등록한다.

@Around

  • 메서드 실행 전 후 모두 제어(Before/After)

@Before

  • 비즈니스 메서드 실행 전에 동작

@After

  • 비즈니스 메서드 실행 후에 동작

참고 사이트

AOP 참고 사이트1
AOP 참고 사이트2
AOP 참고 영상1
AOP 참고 영상2