Spring Framework - AOP

한승남·2024년 10월 16일
0

BackEnd

목록 보기
3/4

AOP - Aspect Oriented Programming

공통된 부가 기능(로깅, 보안 등)을 핵심 기능에서 분리

핵심 기능부가 기능을 분리하여 유지보수성을 높이고
코드의 중복을 줄이고 모듈화

AOP구성

AOP 적용 사례

보안 인증/권한 관리: 특정 서비스에 접근할 때, 사용자가 올바른 인증을 받았는지 또는 권한이 있는지를 확인하는 기능 구현


AOP 구성 용어에 대한 정의

  • Target : 부가 기능이 적용되는 핵심 기능을 가진 모듈.
  • Advice : 실제로 수행되는 부가 기능(로직), 언제 실행될지를 정의한 코드
  • Joinpoint : Advice가 적용될 수 있는 지점, 메서드 호출이나 예외 발생 등의 특정 실행 지점
  • Pointcut : 공통 관심 사항이 적용될 JoinPoint
  • Aspect : 여러 객체에서 공통으로 적용되는 공통 관심 사항(Advice)과 Pointcut의 겨합
  • Advisor : Advice + pointcut, Advice를 언제 어디서 사용할지 설정
  • Weaving : 공통 기능을 타겟에 삽입하는 과정

execution() 정의

특정 메서드에 대해 Pointcut을 정의하는 방식
메서드의 접근 제어자, 리턴 타입, 클래스 이름, 메서드 이름, 매개변수 조건으로 사용

execution(public * com.web.AdminUser.useApp(..))

public : 메서드의 접근 제어자
* : 리턴 타입
com.web.AdminUser : 클래스의 전체 경로
useApp(..) : 메서드 이름과 매개변수(..)

within() 정의

특정한 클래스나 패키지 기준으로 타입 기반으로 Pointcut 지정

within(com.web.*)

JoinPoint/Advice 의 종류

  • 메서드 호출 전 (before)
  • 메서드 실행 후 실행 될 (after-returning) - 정상적으로 값 반환 후 실행
  • 메서드 예외 발생시 (after-throwing) - 예외 발생
  • 메서드 정상 또는 예외 발생에 상관없이 실행 된 후 (after)
  • 모든 시점에서 적용 (around) - 전후 모두

AOP 관련 어노테이션

1. @Aspect

@Aspect
public class UserAspect {
//메서드 @Pointcut, @Before`, `@AfterReturning`, `@AfterThrowing`, `@After`, `@Around`
}

2. @Pointcut

@Pointcut("execution(* com.web.hw..*.*(..))")
public void myPointCut() {}

3. @Before

@Before("myPointCut()")
public void before() {
	System.out.println("애플리케이션을 시작합니다.");
}

4. @AfterReturning

@AfterReturning("myPointCut()")
public void afterReturn() {
	System.out.println("애플리케이션 사용을 끝냅니다.");
}

5. @AfterThrowing

@AfterThrowing("myPointCut()")
public void afterThrow() {
 	System.out.println("애플리케이션에 문제가 생겨 점검합니다.");
}

6. @After

@After("myPointCut()")
public void after() {
	System.out.println("애플리케이션을 상태와 관련없이 종료합니다.");
}

7. @Around

@Around("myPointCut()")
public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("메서드 실행 전");
    Object result = joinPoint.proceed();  // 실제 메서드 실행
    System.out.println("메서드 실행 후");
    return result;
}
profile
오미자를 좋아하는 개발자

0개의 댓글