spring

Spring AOP 가 필요한 경우, 무엇인가, 관련 용어

짱쭈니어 2025. 4. 15. 18:30
인프런 스프링 입문 - 김영한 강의를  참고하였습니다. 

 

 

 a. Spring AOP 가 필요한 경우

  • ex) 모든 메서드의 호출 시간을 측정 ( 인프런 스프링 입문 - 김영한 강의)
  • ex) 사용자 무슨 액션을 하는지 로그를 쌓는 경우
/**
* 사용자 상품 주문
* - 상황 : 사용자가 몇시에, 어떤 액션을 했는지 알기 위해서 사용자 로그를 쌓아야한다. 
* - 핵심 로직 (상품 주문) + 부가 로직 (로그 쌓기) 
*/

@Transactional
public List<Order> saveOrder(Long goodsId){
	
	log.debug("== 사용자 {} 상품 주문 시작 ==",goodsId);
	
	orderRepository.save(goodsId);
	
	log.debug("== 사용자 {} 상품 주문 저장 완료, 사용자 로그에도 저장 필요 ==",goodsId);
	
	userLogsRepository.save('order',goodsId);  //주문과 관련 없는 부가 로직을 메서드에 작성
	
}
  • 사용자 로그를 쌓아달라는 요청에 따라서, 위의 코드처럼 로직을 짜게 된다면 메서드내에서 핵심 관심 사항(core concern) 과 공통 관심 사항(cross-cutting concern) 이 혼용되게 된다
  • 사용자 로그 로직은 애플리케이션의 공통 관심 사항이다.
  • 핵심 관심 사항의 로직과 공통 관심 사항 로직이 섞이게 되면 유지보수가 어렵다.
    • 만약 코드가 복잡하다면, 핵심 관심 사항과 공통 관심 사항 구분하기 어려울 수도 있다.
    • 또한 공통 관심 사항 로직이 변경된다면, 작성한 모든 메서드를 찾아가서 수정해야한다.
  • 그래서 이런 경우에 필요한게 AOP ( Aspect Oriented Programming)

 

 

 b. AOP 는 무엇인가 

  • AOP는Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다
    • 모듈화 : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는것로직을 기준으로
      핵심 관점, 공통 부가 관점으로 나누어 즉 관점을 기준으로 모듈화 하겠다.
  • 이렇게 흩어진 관심사들을 핵심 로직에서 분리하여서 재사용 하겠다 ⇒ AOP의 취지
    • 흩어진 관심사 (Crosscutting Concers) : 소스 코드상 다른 부분에서 반복해서 사용되는 코드들
  • 주로 로깅, 보안, 트랜잭션과 같은 공통 기능들을 AOP 로 적용함

 

 

c. AOP 관련 용어 정리 

 

  • Aspect : 공통 관심사를 모듈화한 객체, 즉 AOP 를 적용할 객체
    • Spring AOP 에서 Aspect 를 구현하는 방식은 2가지
      • 스키마 기반 접근 :xml 기반 설정
      • @AspectJ 스타일 : 애노테이션 기반 설정
        • @AspectJ 방식이 Spring 생태계에서 표준처럼 자리 잡고 있는 상태
  • Target : 핵심 관심사를 담고 있는 모듈 (ex: 상품저장, 회원가입) ⇒ 핵심 기능
  • Advice: Aspect의 동작을 정의하는 실제 코드, Aspect가 어떻게 동작할 건지 정의한 코드
    • 내가 AOP 를 언제! 적용하고 싶다 설정하는건 ⇒ Advice + Point Cut 을 조합으로 정의
    • 실행 시점에 따라서 여러 종류로 나눔
      • @Before : 타겟 메서드 실행 이전에 동작
      • @After : 타겟 메서드 실행 후 성공 /실패 여부에 상관없이 동작
      • @AfterReturning : 타겟 메서드 정상 실행 완료시 동작
      • @AfterThrowing : 타겟 메서드 예외 발생하면 동작
      • @Around : 타겟 메서드 실행 전후에 모두 동작
        • 타겟 메서드 실행을 직접 제어 proceed() 메서드 통해서 할 수 있다.
        • 가장 강력한 어드바이스로 로깅, 성능 모니터링 등등에 사용
  • Join Point : Advice가 적용될 수 있는 특정 지점
  • Point Cut: Joinpoint 중에서 Advice를 실제로 적용할 대상을 필터링하는 조건을 표현식
    • ex) 나는 특정 컨트롤러가 실행될 때 Advice 부르겠다. ⇒ 이거를 표현식으로 표현
    • 포인트 컷 표현식 (외울 필요는 없고 사용할때 정의를 다시 찾아봐서 사용할 것)
  • ProceedingJoinPoint : Spring AOP 가 구현될 때 사용되는 중요한 인터페이스
    • JoinPoint 를 확장한 것으로, 메서드 호출 제어/실행을 할 수 있음
      • proceed() : 실제 타겟 메서드를 실행 // 호출하지 않으면 타겟 메서드 실행 안됌
    • 주로 @Around Advice 에서 사용함