본문 바로가기
Back-End/Spring Boot

AOP(Aspect Oriented Programming) - 관점 지향 프로그래밍

by 달의 조각 2022. 3. 2.
이 글은 김영한 님의 스프링 입문 강의(https://inf.run/hcic)를 수강하며 학습한 내용을 정리한 글입니다.

 

  관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것을 말한다. 

 

AOP가 필요한 상황

예를 들어 모든 메소드의 호출 시간을 측정하고 싶다고 가정해 보자. 시간을 측정하는 기능은 핵심 관심 사항이 아닌 공통 관심 사항이다. 이 로직이 핵심 비즈니스 로직과 섞이면 유지보수가 어려워질 것이다.

우: 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리

 

시간 측정 AOP 등록하기

1. aop패키지, TimeTraceAop클래스 생성

@Aspect

 

2. AOP 클래스를 스프링 빈 등록

  1. @Component 어노테이션 사용
  2. 스프링 빈에 등록: AOP 같은 경우는 정형화되지 않은 클래스이므로 이 방법이 더 선호된다. (SpringConfig)
    @Bean
    public TimeTraceAop TimeTraceAop() {
        return new TimeTraceAop();
    }

 

3. 공통 관심 사항 적용 범위 지정 (타겟팅)

@Around("execution(* hello.hellospring..*(..))") //패키지 하위에 다 적용

 

💡 해결

  1. 회원 가입, 회원 조회 등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다
  2. 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다
  3. 핵심 관심 사항을 깔끔하게 유지할 수 있다
  4. 변경이 필요하면 이 로직만 변경하면 된다
  5. 원하는 적용 대상을 선택할 수 있다. - @Around

 

스프링의 AOP 동작 방식

AOP 적용 전 의존관계 / AOP 적용 후 의존관계

프록시라는가짜 memberService를 생성한다. 가짜 스프링 빈이 끝나면 실제 memberService를 실행한다. 프록시가 주입되는지 확인하려면 getClass()를 통해 콘솔에 출력하여 확인할 수 있다. (CGLIB은 복제하여 코드를 조작하는 기술이다.)

AOP 적용 전 / 후

댓글