AOP 관점 지향 프로그래밍

yookyungmin·2023년 5월 27일
0
post-thumbnail

AOP

  • 관점 지향 프로그래밍
  • OOP를 더 발전시키기 위한 개념
    하나의 소프트웨어가 거대한 하나의 OOP로써 설꼐, 프로그래밍 되었다면 이 것을 각 기능별로 모듈화해서 분리 시키는 개념
  • 공통 관심 사항 vs 핵심 관심 사항 분리

AOP가 필요한 상황

  • 모든 메소드의 호출 시간을 측정하고 싶다면?
  • 공통 관심 사항 vs 핵심 관심 사항
  • 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?
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");
        }
    }
  • 메서드 별로 시간 측정 로직이 들어가는게 아닌

사진과 같은 개념으로 바꿔줘야 한다는 것이다.

  • 컴포넌트로 스프링 빈 등록
@Aspect // AOP 로 쓰기 위해 등록
@Component
public class TimeTraceAop {
    @Around("execution(* hello.hellospring..*(..))") // hellospring 패키지 하위 전부 적용
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        System.out.println("START: " + joinPoint.toString());
        try {
            // 변수 인라인 화 (Ctrl + Shift + Alt + T)
            return joinPoint.proceed();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("END: " + joinPoint.toString() +" " + timeMs + "ms");
        }
    }
}

정리

  • 회원가입, 회원 조회와 같은 핵심 관심 사항 분리와 유지
  • 시간 측정과 같은 공통 로직을 공통 관심사항으로 분리하여 관리하고, 변경이 필요하면 해당 로직만 바꾸면 된다.

AOP 적용 전 의존 관계

AOP 적용 후 의존 관계

스프링은 프록시라는 가짜 memberService를 만든다.
스프링 컨테이너에 스프링 빈을 등록할 때 진짜 스프링 빈이 아닌 가짜 스프링 빈을 앞세운다.
가짜 스프링 빈이 joinPoint.proceed()를 끝나면 그때 진짜 스프링 빈이 호출된다.
즉, memberController가 호출하는 것은 가짜 memberService 인 것이다.


AOP 가 적용되고 나서의 전체적 그림과
아래는 memberService를 복제해서 코드를 조작하는 프록시이다.

스프링 컨테이너에서 DI(의존성 주입이) 이라는 것이 있기에 AOP 기능을 사용할수 있는것이다

참고문헌
https://velog.io/@rladuswl/AOP%EA%B0%80-%ED%95%84%EC%9A%94%ED%95%9C-%EC%83%81%ED%99%A9%EA%B3%BC-AOP-%EC%A0%81%EC%9A%A9

0개의 댓글