Domain/Spring

[Spring] 관점 지향 프로그래밍 (AOP / Aspect Oriented Programming)

by Donghwan 2021. 7. 14.

AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불립니다.

 관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 공통적인 관점으로 나누고 그 관점을 기준으로 각각 모듈화하겠다는 것입니다. 쉽게 말하자면 흩어져 있는 코드를 한 곳으로 모으는 것 입니다. 

그림으로 설명하자면 아래와 같이 Controller, Service, Repository에 모두 시간 측정 로직이 존재할 경우 AOP를 활용하여 공통의 관심사항을 적용할 수 있습니다.


AOP 적용 전

@Transactional
@Service
public class MemberService {
    /**
     * 회원가입
     */
    public Long join(Member member) {
        long start = System.currentTimeMillis();
        try {
            validateDuplicateMember(member); //중복 회원 검증
            memberRepository.save(member);
            return member.getId();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("join " + timeMs + "ms");
        }
    }

    /**
     * 전체 회원 조회
     */
    public List<Member> findMembers() {
        long start = System.currentTimeMillis();
        try {
            return memberRepository.findAll();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("findMembers " + timeMs + "ms");
        }
    }
}

AOP 적용 후

@Component
@Aspect
public class TimeTraceAop {
    @Around("execution(* hello.hellospring..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        System.out.println("START: " + joinPoint.toString());
        try {
            return joinPoint.proceed();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("END: " + joinPoint.toString() + " " + timeMs +
                    "ms");
        }
    }
}
  • Aspect
    • AOP 클래스임을 지정합니다.
  • @Component
    • 스프링 컨테이너에 빈으로 등록해야 합니다.
    • Configuration에 Bean으로 직접 등록 가능합니다.
  • @Around
    • AOP의 공통 로직이 적용될 범위입니다.
    • PointCut 또는 Annotation을 전달 받아 해당 조건을 바탕으로 실행됩니다.

 


참고자료

  • 인프런 김영한 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
728x90
반응형

댓글