BACK/SPRING

[Spring] Spring AOP란

연듀 2023. 1. 2. 21:06

Spring AOP

 

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

 

AOP는 관점을 기준으로 묶어 개발하는 방식을 말한다.

관점(aspect)이란, 어떤 기능을 구현할 때 그 기능을 핵심 기능부가 기능으로 구분해 각각을 하나의 관점으로 보는 것을 의미한다.

핵심 기능은 주로 핵심 비지니스 로직이고,

부가 기능은 핵심 로직을 실행하기 위한 데이터베이스 연결, 로깅, 파일 입출력 등이 있다.

 

여러 비지니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식을 AOP라고 한다.

 

 

=> 흩어져 있는 부분들을 Aspect를 이용해 모듈화 시킨 것을 볼 수 있다.

모듈화 시킨 Aspect를 어느 곳에 사용해야 하는지 정의해주면 된다.

 

AOP 목적

  • 소스 코드에서 여러 번 반복해서 쓰는 코드를 Aspect로 모듈화하여 핵심 로직에서 분리 및 재사용
  • 개발자가 비지니스 로직을 구현하는 데만 집중 할 수 있게 함

 

AOP 용어

  • Aspect: 흩어진 관심사를 모듈화 한 것
  • Target: Aspect를 적용하는 곳
  • Advice: 실질적인 부가 기능을 담은 구현체
  • Join Point: Advice가 적용될 위치 혹은 끼어들 수 있는 시점. 스프링에서는 언제나 메서드 실행 시점을 의미
  • Point Cut: Join Point의 상세한 스펙을 정의한 것으로 구체적으로 Advice가 실행될 시점을 정함

 

AOP 구현 방법

  1. 컴파일 타임: 자바 파일을 클래스 파일로 만들 때 바이트 코드를 조작하여 AOP가 적용된 바이트 코드를 생성
  2. 로드 타임: 컴파일은 원래 클래스 그대로 하고, 클래스를 로딩하는 시점에 클래스 정보를 변경
  3. 런타임: A라는 클래스를 빈으로 만들 때 A라는 타입의 프록시 빈을 감싸서 만든 후, 프록시 빈이 클래스 중간에 Aspect 코드를 추가해서 넣음

스프링에서는 프록시를 이용한 세번째 방법을 사용한다. 스프링 AOP는 프록시 객체를 자동으로 만들어 준다.

 

 

스프링 AOP 특징

  • 스프링 AOP는 프록시 패턴 기반의 AOP 구현체이다.
    • 프록시 패턴: 프록시 객체(원래 객체를 감싸고 있는 객체)가 클라이언트의 요청을 처리하게 하는 패턴이다.
    • 기존 코드 변경 없이 접근을 제어하고 싶거나, 부가 기능을 추가하고 싶을 때 사용한다.
  • 스프링 Bean에만 적용할 수 있다.

 

 

 

* 프록시 패턴

 

프록시 패턴에는 interface가 존재하고 클라이언트는 이 interface 타입으로 proxy 객체를 사용한다. 

proxy 객체는 원래 객체와 같은 인터페이스를 구현해줘야 한다. 

proxy 객체는 기존의 타겟 객체를 참조한다. 원래 객체를 주입받아서 인터페이스의 메서드들을 위임받아 사용한다.

proxy 객체와 기존의 타겟 객체의 타입은 같고, proxy는 원래 할 일을 지닌 Real Subject를 감싸서 client의 요청을 처리한다. 

 

 

구현한 인터페이스의 메소드들에 동일한 기능을 하는 코드를 넣고 싶을 때, 각각 메서드에 넣어주는 것은 효율성이 떨어지기 때문에

프록시 패턴을 사용해 원래 객체를 주입받고, 인터페이스의 메서드들을 위임받아 원하는 코드를 넣어주는 것이다. 

그런데 여러 클래스에 동일한 기능을 사용하고자 할 때 중복이 생겨 비효율적이다. 

이 문제를 해결하기 위해 나온게 스프링 AOP 인것이다. 런타임시 동적으로 프록시 객체를 만들어준다. 

 

 

 

 

 

 

 

 

 

 

참고

https://code-lab1.tistory.com/193

https://velog.io/@max9106/Spring-%ED%94%84%EB%A1%9D%EC%8B%9C-AOP-xwk5zy57ee