SEB_BE 38일차 - AOP

subimm_·2022년 10월 18일
0

코드스테이츠

목록 보기
38/83

Daily coding

indexOf(str.charAt(i)) // 맞다면 해당 인덱스 리턴 아니면 -1 리턴
Character.getNumericValue(i) // 숫자 형태의 char형을 int 형으로 변환
Math.round() 

💡 오늘의 학습목표

  • AOP
  • AOP 용어
  • 타입별 Advice

📔 AOP

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

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

    • 로깅, 보안 트랜잭션 등
  • Aspect : 부가 기능을 정의한 코드인 어드바이스와 어드바이스를 어디에 적용할 지 결정하는 포인트컷을 합친 말 (Advise + PointCut = Aspect)

  • OOP 관심사 분리에 대한 한계적인 부분을 해결하고자 AOP가 등장

  • AOP모듈화의 핵심 단위는 관점

  • 핵심 기능인 OO로직과 부가기능인 로그 추적 로직이 하나의 객체로 들어간다.

📔 AOP 용어

애스팩트(Aspect)

  • 여러 객체에 공통으로 적용되는 기능 (공통 기능)
  • 어드바이스 + 포인트컷을 모듈화하여 애플리케이션에 포함되는 횡단 기능

조인 포인트(join point)

  • 클래스 초기화, 객체 인스턴스화, 메소드 호출, 필드 접근, 예외 발생과 같은 특정 포인트를 의미
  • 애플리케이션에 새로운 동작을 추가하기 위해 조인포인트에 관심코드 추가 가능
  • 횡단 관심은 조인포인트 전/후에 AOP에 의해 자동으로 추가
  • AOP를 적용할 수 있는 모든 지점
  • 스프링AOP는 프록시 방식이라 조인 포인트는 항상 메소드 실행 지점으로 제한

어드바이스(Advice)

  • 조인포인트에서 수행되는 코드를 의미
  • Aspect를 언제 핵심 코드에 적용할 지 정의
  • 메소드 호출 전 각 상세 정보와 메소드를 로그로 남기기 위해 메소드 시작 전의 포인트인 조인포인트s를 선택
  • 부가 기능

포인트컷(PointCut)

  • 조인 포인트 중에서 어드바이스가 적용될 위치를 선별하는 기능
  • 프록시를 사용하는 스프링 AOP는 메서드 실행 지점만 포인트 컷으로 선별 가능

위빙(Weaving) : AOP가 구현되는 과정

  • 포인트컷으로 결정한 타겟의 조인 포인트에 어드바이스를 적용(핵심 코드에 적용하는것)
  • AOP 적용을 위해 애스펙트 객체에 연결한 상태
    • 컴파일 타임 : 컴파일 시
    • 클래스 로드 타임 : 컴파일 이후에 메모리가 올라가는 시점
    • 런타임(실행중일때) == 프록시 방식 (Spring AOP)

AOP프록시(proxy)

  • AOP 기능을 구현하기 위해 만든 프록시 객체 (스프링에서는 JDK동적 또는 CGLIB프록시)

타겟(Target)

  • 핵심 기능을 담고 있는 모듈 (부가기능을 부여할 대상) Advice를 받는 객체 (포인트컷으로 결정)

어드바이저(Advisor)

  • 하나의 어드바이스와 하나의 포인트 컷으로 구성 (스프링AOP에서만 사용되는 용어)

📔 타입별 Advice

  • Aspect를 언제 핵심 코드에 적용할 지 정의 (특정 조인 포인트에서 애스팩트에 의해 취해지는 조치)

📖 Advice 순서

  • 기본적으로 순서 보장x
  • 순서 지정 : @Aspect 적용 단위로 org.springframework.core.annotation.@Order 애너테이션 적용 ( 하나의 클래스 단위로 적용 )
  • 애스펙트를 별도의 클래스로 분리해야 한다.

📖 Advice 종류

  • Before
    • 조인 포인트 실행 이전에 실행
    • 타겟 메서드가 실행되기 전에 처리해야할 필요가 있는 부가 기능을 호출 전에 공통 기능 실행
    • Before Advice 구현한 메서드는 리턴타입이 void
    • 메서드에서 예외를 발생시킬 경우 대상 객체의 메서드가 호출되지 않게 된다.
      @Before("hello.aop.order.aop.Pointcuts.orederAndSerice()")
      public void doBefore(JoinPoint joinPoint) {
      	log.info("[before] {}", joinpoint.getSignature());
      }
    • 작업 흐름 변경 x 메서드 종료시 자동으로 다음 타켓 호출 (예외 발생 시 다음 호출x)

  • After returning
    • 조인포인트가 정상 완료 후 실행
    • 메서드가 예외 없이 실행된 이후에 공통 기능을 실행
    @AfterReturning(value = "hello.aop.order.aop.Pointcuts.orderAndService()", returning = "result")
    public void doReturn(JoinPoint joinPoint, Object result) {
    	log.info("[return] {} return={}", joinPoint.getSignature(), result);
    }
    • 메서드 실행이 정상적으로 반환될 때 실행

  • After throwing
    • 메서드가 예외를 던지는 경우에 실행
    • 메서드를 실행하는 도중 예외가 발생한 경우 공통 기능을 실행
    @AfterThrowing(value = "hello.aop.order.aop.Pointcuts.orderAndService()", throwing = "ex")
    public void doThrowing(JoinPoint joinPoint, Exception ex) {
    	log.info("[ex] {} message={}", joinPoint.getSignature(), ex.getMessage());
    }
    • 메서드 실행이 예외를 던져서 종료될 때 실행한다.

  • After(finally)
    • 조인포인트의 동작(정상/예외) 과 상관 없이 실행
    • 일반적으로 리소스 해제에 사용

  • Around
    • 메서드 호출 전후에 수행하며 가장 강력한 어드바이스
      • 조인 포인트 실행 여부 선택, 반환 값 변환, 예외 변환 등 가능
        • 조인 포인트 실행 여부 선택 - joinpoint.proceed()
        • 전달 값 변환 - joinPoint.proceed(args[])
        • try~catch ~ finally 가 들어가는 구문 처리 가능
    • 어드바이스의 첫 번째 파라미터는 ProceedingJoinPoint를 사용
    • proceed()를 통해 대상을 실행하며 여러번 실행할 수 있다.
profile
코린이의 공부 일지

0개의 댓글