BackEnd/Spring

[Spring] AOP란?

개발자들아제발자 2022. 7. 28. 21:29

AOP(Aspect Oriented Programming)란?

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

핵심적인 기능에 부여되는 부가 기능을 효과적으로 모듈화하는 방법을 찾다가, 어드바이스와 포인트컷을 결합한 어드바이스가 발전하여 AOP가 만들어지게 되었다. 이렇게 애플리케이션의 핵심적인 기능에서 부가적인 기능을 분리하여 독특한 모듈화로 만들고 설계하는 방법을 AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)라고 부른다. 

가로 영역의 공통된 부분을 잘라냈다고 하여, 크로스 컷팅(Cross-Cutting)이라고 부르기도 한다.

 

AOP를 이해하기 위해서 우선 핵심적인 어드바이스와 포인트컷을 이해해야한다.

  • 어드바이스(Advice): 타겟 오브젝트에 적용하는 부가 기능을 담은 오븐젝트
  • 포인트컷(PointCut): 메소드 선정 알고리즘을 담은 오브젝트

 

Spring의 Proxy란?

프록시 객체는 원래 객체를 감싸고 있는 같은 타입의 객체이다. 프록시 객체가 원래 객체를 감싸서 client의 요청을 처리하게 하는 패턴이다. 사용 이유는 접근을 제어하고 싶거나, 부가 기능을 추가하고 싶을 때 주로 사용한다.

 

AOP가 필요한 상황

  • 모든 메소드의 호출 시간을 측정하고 싶다면?
  • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
  • 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?

 

 

각각 메서드에 시간 측정 로직 추가

위와 같이 메서드마다 시간을 측정하는 로직이 추가되면 여러가지 문제점이 생긴다.

  • 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다.
  • 시간을 측정하는 로직은 공통 관심 사항이다.
  • 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
  • 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.

이러한 문제점들을 해결해주는게 런타임시, 동적으로 프록시 객체를 만들어주는 것인데, 그것이 스프링 AOP이다.

 

 

 

AOP 적용 로직

위와 같이 AOP를 적용한 후 문제점이 해결된 상황이다.

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

 

우선 AOP 클래스로 설정하기 위해 @Aspect 어노테이션을 추가했으며, Spring의 빈으로 등록하기 위해 @Component 어노테이션을 추가했다. 그리고 어느 위치에 적용해야 할지 정해주기 위해 @Around 어노테이션을 추가했다. 해당 의미는 hello.hellospring 패키지 내에 있는 모든 곳에 부가 기능을 추가해준다는 의미이다. Around(execution)뿐만 아니라 bean/@annotation, @Before 등 다양한 방법으로 적용 위치를 정해주는 방법이 있다.

 

Spring AOP 용어

  • Aspect: Point Cut + Advice를 의미한다.
  • Joint Point: Advice가 적용될 위치
  • Point Cut: 다양한 Joint Point 중에 어떤 것을 사용할지 선택한다.
  • Advice: 실질적인 부가기능을 담은 구현체 Joint Point에 삽입되어 동작할 수 있는 코드를 의미한다.
  • Weaving: Advice를 핵심 로직 코드에 적용하는 것이다.

 

Advice 종류

  • Before: 업무 로직 전에 실행
  • After retunning: 업무 로직 후에 실행
  • After throwing: 예외 처리
  • Around: 업무 로직 앞 뒤 모두 실행

'BackEnd > Spring' 카테고리의 다른 글

[Spring] POJO란?  (0) 2022.06.19
[Spring] DAO, DTO, VO란?  (0) 2022.06.10
[Spring] IoC와 DI란?  (0) 2022.06.09
[Spring] 스프링(Spring)이란?  (0) 2022.06.09