SEB_BE_43 / 23.02.08 - 02.09 회고

rse·2023년 2월 9일
0

코드스테이츠_BE_43

목록 보기
31/65

오늘

  • Spring AOP

Spring AOP

AOP란?

AOP = Aspect-Oriented Programming / 즉 관점 지향 프로그래밍이라는 뜻.

지난번 2/2일 블로그에 DI와 함께 작성했었다.
그래도 한번 더 보고 넘어가자.

애플리케이션 로직은 두가지로 나눠서 볼 수 있다.

핵심 기능(Core Concerns) : 업무 로직을 포함하는 기능

부가 기능(CROSS-CUTTING CONCERNS) : 핵심 기능을 도와주는 부가적인 기능

  • 로깅, 보안, 트랜잭션 등이 있다.

용어

Aspect

  • 여러 객체에 공통으로 적용되는 기능을 말한다.
  • 어드바이스 + 포인트컷을 모듈화하여 애플리케이션에 포함되는 횡단 기능.
  • 여러 어드바이스와 포인트컷이 함께 존재한다.

실제로 우리가 만들 부가기능을 말한다. (어드바이스, 포인트 컷이 합쳐진 것.)

그리고 @Slf4j는 아직 안배웠지만 로그를 남기기 위한 모듈이라고 한다.

@Around ("execution(* start.aop.order..*(..))")
는 start.aop.order.. 패키지와 하위 패키지를 지정한 것. 포인트 컷이 된다.

@Around의 메서드인 loggin은 어드바이스가 된다.

order 패키지에는 이렇게 있는데 OrderService와 OrderRepository의 모든 메서드는 AOP 적용 대상이 된다. 아까 포인트 컷을 지정해줌으로써.

포인트 컷 : 부가기능을 어디에 지정할 것 인지.

조인포인트 : 어드바이스가 적용 될 위치

어드바이스 : 부가 기능. 그 자체.

AOP로 사용하려면 반드시 spring bean으로 등록되어 있어야 함.
아까 만든 Aspect1 클래스를 Import를 통해 bean으로 등록.

결과화면

아까는 @Around를 이용해서 포인트컷을 넣었지만 @Pointcut을 이용해서 분리 할 수도 있다.

private & public 등의 접근 제어자는 내부에서만 사용하면 private, 다른 애스펙트에서 참고하면 public으로 사용하면 된다.

@Pointcut를 이용해 위치를 정해주고 allOrder에 넣어주고 있다. 그리고 @Around에서 allOrder라고 지정해주고 있다.

allService 포인트컷은 타입, 이름, 패턴이 Service를 대상으로 하는데 이름이 Service로 끝나는 것을 대상으로 한다. (타입, 이름, 패턴 이란 클래스 인터페이스 모두 적용된다는 뜻)

로그 출력 기능에 추가로 트랜잭션이 동작하는 것처럼 로그 남기는 기능을 추가.

과정
핵심 로직 실행 직전에 트랜잭션 동작. -> 핵심로직 실행 -> 핵심로직 문제 없으면 커밋 or 예외 있으면 롤백.

실행 결과

포인트컷을 공용으로 사용하기 위해 외부 클래스로 외부에 모아 둘 수 있음.

포인트컷을 여러 어드바이스에 험께 사용할 때 이 방법을 사용하면 된다.

test파일은 test 패키지에 넣어야한다!

어드바이스 종류 (Advice)

Advice = 순서 보장 안됨.

  • 순서 지정하고 싶다면 @Aspect 적용 단위로 org.springframework.core.annotation.@Order 애너테이션을 적용해야 함.
    - 클래스 단위로 적용 가능. (어드바이스 단위 x)
    • 하나의 Aspect에 여러 Advice가 있으면 순서 보장 x

@Around
@Before
@AfterRunning
@AfterThrowing
@After

Before

조인 포인트 실행 이전에 실행.
Before Advice 구현한 메서드는 일반적으로 리턴타입 void.
작업 흐름 변경 못함
메서드 종료 시 자동으로 다음 타켓 호출. (예외 발생시 다음 코드 호출 안됨.)

After returning

조인 포인트가 정상 완료 후 실행
메서드가 예외 없이 실행 된 이후 공통 기능 실행.

profile
기록을 합시다

0개의 댓글