Spring/카테캠 - TIL

TIL [0727] : 기능 구현, AOP 개념 정리

mint* 2023. 7. 27. 22:14
728x90

과제 수행 내용 (필수) : 강의를 들으며 모르는 개념 정리

  • 5주차 과제를 수행하였습니다. (기능 구현)
  • 내일 join fetch를 수행하는 것과 repository에서 조회하는 것의 쿼리를 비교해볼 생각입니다.
  • AOP 개념에 대해 확실히 공부하고 어느정도 감을 잡은 것 같아 좋았습니다.
  • 영속성 컨텍스트를 고려하여 DTO로 응답을 생성하였습니다.
  • 더티체킹이 수행되는 시점이 @Transactional메서드 종료 후이므로 그 전에 DB 조회시 영속성 컨텍스트의 내용과 달라져 위험이 발생할 수 있습니다.
    이때에는 명시적으로 DB에 반영하는 flush()를 사용함을 알 수 있었습니다.
    또한 부모 트랜잭션자식 트랜잭션의 관계에 대해 생각해보았습니다.

 

금일 과제 수행 (코드 작성) 하면서 어려웠던 점 (선택)

  • 지금까지 해온 코드를 정리하며 구현하는 과제였고, 조금 버벅거렸지만 기존 서비스 코드를 참고하여 과제를 수행하였습니다.
  • DTO 응답 생성시 지연 로딩을 고려해 어떤 entity까지 join fetch로 가져와야하는지 고민했습니다.

 

데일리 스크럼 내용 (필수)

Q1. AOP의 Pointcut AOP의 `Pointcut` 를 공부하면서 아래 두 설명이 이해되지 않아 질문 드립니다.

  1. 선택된(필터링된) 하나 또는 여러 JoinPoint - 실제 Weaving이 일어나 Advice가 적용되는 Join Point ⬅️ 이 부분과
  2. 부가기능을 적용할 핵심 로직 결정 ex)Advice가 실행될 Target의 특정 메서드 지정 ⬅️이 부분

 

위 두 부분 모두 Pointcut에 대해 설명하고 있는데, 두 부분이 다른 의미 같아 이해가 되지 않는데 설명해주실 수 있나요?

 

멘토님 👨‍💻 :

  • 부가기능을 적용할 핵심 로직을 결정한다는 것은 적용될 join point를 결정한다는 의미입니다.
  • pointcut은 공통기능(부가기능)을 적용할 시점인 join point를 여러개 지정할 수 있습니다.

 

Q2. AOP - Join point vs Pointcut 두 개념의 차이가 궁금합니다. 같은 `실행시점`인데 Join point가 더 자세한 것인지 확실하게 알고싶습니다.

멘토님 👨‍💻 :

  • Join point결합점이라는 뜻으로 Advice를 적용할 수 있는 시점을 말합니다.
  • pointcut교차점이라는 뜻으로 여러개의 join point를 설정할 수 있습니다. 공통 기능이 적용될 join point를 지정합니다.

 

코드로 정리해본 AOP 개념

@Aspect
@Component
public class MultipleJoinPointsAspect {
            //2개의 pointcut(join point 지정)
    @Pointcut("execution(* com.example.myapp.service.*Service.*(..))") //서비스의 모든 클래스 메서드
    public void serviceMethods() { //point cut 별칭
    }

    @Pointcut("execution(* com.example.myapp.repository.*Repository.*(..))")
    public void repositoryMethods() {
    }
            //3개의 advice
    @Before("serviceMethods() || repositoryMethods()")
    public void beforeExecution(JoinPoint jp) { //호출된 객체의 메서드(join point)
        System.out.println("Before method execution: " + jp.getSignature().toShortString());
    }

    @AfterReturning("serviceMethods() || repositoryMethods()")
    public void afterReturningExecution(JoinPoint jp) {
        System.out.println("After method execution: " + jp.getSignature().toShortString());
    }

    @AfterThrowing(pointcut = "serviceMethods() || repositoryMethods()", throwing = "ex")
    public void afterThrowingException(JoinPoint jp, Exception ex) {
        System.out.println("Exception thrown from method: " + jp.getSignature().toShortString());
        System.out.println("Exception message: " + ex.getMessage());
    }
}

2개의 pointcut과 3개의 Advice를 정의한 코드입니다.

📌 여러개의 join point들 중 Advice를 적용할 join point들을 선택하여 pointcut에 지정한다.

📌 Advice 동작시점에는 @Before, @After, @AfterReturning(메서드 정상 실행 후), @AfterThrowing(예외 발생 후), @Around(메서드 호출 이전, 이후, 예외발생 등 모든 시점에서 동작)이 있다.

📌 Advice에서 실제 호출된 메서드를 JoinPoint 파라미터가 가지고있고, 이를 이용해 공통 기능(Advice)을 수행한다.

 

 

728x90