Spring

[스프링의 삼각형] AOP - 횡단괌심

Sol b 2023. 10. 11. 18:05
AOP는 관점 지향 프로그래밍으로
DI가 의존성 주입이라면
AOP는 로직 주입이라고 할 수 있습니다.

이체, 입출금, 이자계산 로직에서 전부

로깅, 보안, 트랜잭션이 반복해서 동작하는것을 알 수 있습니다.

이것을 횡단 관심사라고 합니다. 

 

  1. 프록시 패턴으로 관심사의 로직 주입 설정대로 실행됩니다.
  2. 인터페이스 기반입니다.
    1. 메서드에만 적용 가능?
  3. 런타임 기반입니다.

 

AOP 적용, 로직 주입 방법

로직을 주입할 수 있는 곳은 총 5군데가 있습니다.

 

AOP 적용 방법

  1. @Aspect : Class에 사용하면 AOP에서 사용하게됩니다.
  2. JoinPoint : 호출된 객체의 메서드입니다.
    1. JoinPoint를 활용하여 메서드의 정보를 확인할 수 있습니다.
  3. @PointCut : 자르는 지점으로 Aspect의 적용 위치를정확히 지정합니다.
    1. 로직주입 메서드 5개와 같이 사용됩니다.  

 

로직 주입 메서드

  1. Before : 메서드 시작전
  2. After : 메서드 종료 후
  3. AfterReturning : 메서드 정상 종료 후
  4. AfterThrowing : 메서드 예외가 발생하고 종료 후
  5. Around : 메서드 전 구역

 

장점

한 클래스에 공통 로직을 AOP를 적용하여 핵심 로직만을 남겨

단일 책임의 원칙 SRP을 적용 할 수 있습니다.

 

즉, 횡단 관심사(공통 로직)는 신경쓰지 않고 핵심 관심사에만 집중하여 개발할 수 있습니다.

 

적용 코드

Vaildation 검사를 적용한 AOP의 코드입니다.

@Component
@Aspect
public class ValidationHandlerAspect {

    @Pointcut("@annotation(org.springframework.web.bind.annotation.PostMapping)")
    public void postMapping(){

    }
    @Pointcut("@annotation(org.springframework.web.bind.annotation.PutMapping)")
    public void putMapping(){

    }

    @Before("postMapping() || putMapping()")
    public void before(JoinPoint joinPoint) {
        for (Object arg : joinPoint.getArgs()) {
            if (arg instanceof BindingResult) {
                BindingResult br = (BindingResult) arg;
                if (br.hasErrors()) {
                    throw new BindingException(br.getFieldError().getDefaultMessage());
                }
            }
        }
    }
}

 

참고

스프링 입문을위한 자바 객체 지향의 원리와 이해