스프링 AOP

최권민·2023년 7월 16일
0

CS스터디

목록 보기
8/8
post-thumbnail

AOP란?

  • AOP는 Aspect Oriented Programming의 약자. ⇒ 관점 지향 프로그래밍
  • 관점 지향이란, 어떤 로직을 핵심적인 관점부가적인 관점으로 나누어 보고 그 관점을 기준으로 로직을 모듈화하는 것
  • AOP의 목적은 흩어진 관심사(Crosscutting Concerns)를 하나로 모듈화 하는 것

  • 위 그림에선, 클래스 A와 B, 그리고 C에서 공통적으로 사용되는 코드들이 존재

  • 이러한 코드들을 방치하면, 주황색 하나의 내용을 변경하기 위해선 A,B,C 클래스 모두를 수정해야 함
    => SOLID 원칙 위배

  • 이렇게 흩어진, 소스 코드에서 반복적으로 사용되는 부분을 흩어진 관심사(Crosscutting Concerns)라고 함

  • AOP에서는 이러한 흩어진 관심사를 Aspect라는 하나의 블럭으로 모듈화시켜줌

용어설명
Aspect흩어진 관심사를 모듈화 한 것
TargetAspect를 적용하는 곳.
Advice실질적으로 어떤 일을 해야 할 지에 대한 것, 실질적인 부가기능을 담은 구현체
Join PointAdvice가 적용될 위치 혹은 끼어들 수 있는 시점. 메서드 진입 시점, 생성자 호출 시점, 필드에서 꺼내올 시점 등 다양한 시점에 적용할 수 있음
Point CutJoin Point의 상세한 스펙을 정의한 것

AOP 적용 방법

  1. 컴파일 타임 적용
    : 컴파일 시점에 바이트 코드를 조작하여 AOP가 적용된 바이트 코드를 생성하는 방법
  2. 로드 타임 적용
    : 순수하게 컴파일 한 뒤, 클래스를 로딩하는 시점에 클래스 정보를 변경하는 방법
  3. 런타임 적용
    : Spring AOP가 주로 사용하는 방법. A라는 클래스 타입의 Bean을 만들 때 A 타입의 Proxy Bean을 만들어 Proxy Bean이 Aspect 코드를 추가하여 동작하는 방법

Spring AOP의 특징

  • 프록시 패턴 기반의 AOP 구현체. 프록시 객체를 통해 접근 제어 및 부가 기능 추가
  • Spring Bean에만 AOP 적용 가능
  • 모든 AOP 기능을 제공하는 것이 아니라, 어플리케이션에서 가장 흔한 문제(중복 코드 방지, 로깅, 프록시 클래스 작성) 등을 해결하기 위한 것이 목적

실제 사용

  • Spring AOP를 사용하려면 Gradle에 관련 의존성을 추가해주어야 함

  • Controller단의 모든 메서드에 적용되도록 포인트컷 설정

    • @Slf4j를 통해 log 출력
    • @Aspect를 통해 이 클래스가 Aspect를 나타내는 클래스임을 명시
    • @Component를 붙여 스프링 빈으로 등록
  • 실행 및 종료, 에러 시 작동하도록 AOP 설정
    • @Before : 어드바이스 타겟 메소드가 호출되기 전 어드바이스 기능 수행
    • @AfterReturning : 타겟 메소드가 성공적으로 결과값을 반환 후 어드바이스 기능 수행
    • @AfterThrowing : 타겟 메소드가 수행 중 예외를 던지게 되면 어드바이스 기능 수행
      • 위 세가지 어노테이션으로 Controller단 메서드가 실행될 때 마다 입•출력값을 확인 및 시작, 종료 시간 측정
    • 위 어노테이션 이외에도
      • @After : 타겟 메소드의 결과에 관계없이 타겟 메소드가 완료되면 어드바이스 기능을 수행
      • @Around : 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출 전과 후에 어드바이스 기능을 수행
    • 라는 어노테이션이 존재

참고

https://docs.spring.io/spring-framework/reference/core/aop.html
https://engkimbs.tistory.com/746
https://code-lab1.tistory.com/193

profile
하나의 궤적을 따라서

0개의 댓글