프로그래밍/java

[spring] spring AOP

znvlcm 2023. 1. 19. 01:49

스프링 AOP Aspect oriented Programming 관점지향 프로그래밍

스프링 AOP란 관점지향 프로그래밍을 말한다. 

 


AOP가 필요한 이유 

핵심기능과 부가기능

핵심기능

REST API를 보면 resource의 표현을 통해 통신을 하는데 보통 해당 리소스의 어떤 처리를 하게된다. 

해당 처리, 즉 해당 요청에 대한 기능을 핵심기능이라고 한다. 

예를 들어 POST방식으로 주문 데이터를 전송한다면 해당 리퀘스트의 핵심기능은 주문의 등록일 것이다. 

부가기능 

그러나 우리가 로직을 짤 때 해당기능을 수행하기 위해 부가되는 기능이 있다. 

예를 들어 로그를 남긴다거나, 처리시간을 넣거나 혹은 DB와 통신을 위한 코드이다. 

 

반복되는 부가기능

로그를 남기거나 처리시간을 계산하는 로직이 하나의 핵심기능의 객체에만 필요하진 않을 것이다. 

수많은 리소스마다 각기 DB에 접속하고 닫고 예외처리를 하는 부가기능을 작성해야한다면, 

작성하는 개발자도 힘들고, 코드는 길어지고 

가장 중요한 것은 변경점이 생겼을 때 해당 코드들을 모두 찾아서 변경해야하는 것이다.

DRY원칙을 지키자 ! do not repeat yourself

 

횡단관심사

특히 어떤 요청이 왔을 때 우리가 핵심기능을 순서대로 수행할 때 해당 프로세스를 

관통하면서 수행해야 하는 기능을 횡단관심사라고 한다. 

프로세스를 횡단하기 때문이다. 

예를 들자면, 서비스에 트랜젝션 애노테이션을 달아두면, 서비스에서 DB를 통신하는 리파지토리까지 횡단하며 트랜젝션이 적용된다. 

AOP의 필요한 이유

AOP가 필요한 이유는 바로 이 횡단관심사의 해결에 있다. 

반복되어 중복코드를 양성하는 부가기능은 적용대상을 수정할 때도, 부가기능의 내용을 수정할 때도 

엄청난 수정을 해야한다. 

같은 내용을 수정하는데 코드가 반복되고 중복되는 것을 없애고, 

변경지점이 하나가 되도록 모듈화하기 위해 AOP가 도입되었다.


그래서, AOP란 

AOP란 핵심기능과 부가기능을 분리해서 

핵심 기능 모듈의 흐름을 거치는 동안 반복해서 필요한 부가기능, 즉 횡단관심사를 분리하고 적용을 원하는 대상 핵심기능모듈에 적용하기 편리하게 하기 위한 기능이다. 

Aspect모듈 = 부가기능 + 적용대상선택기능

-> Advisor도 부가기능인 advice와 적용대상을 선택하는 pointcut이 있으니 개념적으로 Aspect의 조건을 만족한다.

 다시 말해 Aspect 란 어디에 어떤 부가기능을 적용할 것이지를 정의하는 것이다. 

이런 Aspect를 사용한 프로그램 방식을 AOP 관점지향방식이라고 한다. 

기존의 OOP방식은 객체들이 메세지를 주고 받으며 협력을 하기에 기능 즉, 하나하나의 객체들을 지향하는 프로그래밍이었다면 AOP는 이 객체들이 기능을 할 때마다 반복되며 필요한 부가기능의 관점으로 프로그래밍을 하는 것이다. 

즉,  OOP에서 하기 어려운 부분들을 보조하기 위해 나온 프로그래밍 방식이다. 


AOP 적용방식 

AOP적용방식은 적용시점에 따라 아래와 같이 나눌 수 있다. 

적용시점 컴파일시점 클래스로딩시점 런타임시점
방식 대상코드에 직접 붙임
.class생성시점
대상코드에 직접 붙임
jvm의 클래스 로더 저장 전에 .class파일 바이트코드조작
애플리케이션 실행될 때 프록시를 통해 조작
단점 특별한 컴파일러(AspectJ)필요 클래스 로더 조작기 설정 복잡 프록시 생성이 필요, 일부제약 상속문제, 생성자 조작불가 등
원본코드 유지 부가기능 호출코드 추가됨 부가기능 호출코드 추가됨 원본코드 유지
적용가능위치 생성자, 필드값접근, static메서드 접근, 메서드 실행 메서드 실행만 가능

 

스프링 AOP는 런타임 시점에 프록시를 통한 AOP만 지원한다. 

컴파일이 다 끝나고 클래스 로더에 클래스가 올라간 후 애플리케이션 실행시점에 적용되기 때문에 

다른 두 방식이 직접 바이트 코드를 조작하는 것과 달리 프록시를 도입해서 AOP를 적용한다. 

다른 두 방식에 비해 환경설정이 필요없지만, AOP를 적용가능한 위치가 

스프링 빈의 메서드 실행 부분으로 제한된다.

프록시는 메서드 오버라이딩 개념이기에, 생성자나 static메서드, 필드값 접근 등에는 적용할 수 없기 때문이다.

또한 스프링 컨테이너가 빈을 생성하고 컨테이너에 등록하는 중간에 post processor에 의해 

프록시 적용대상 기능확인 및 프록시적용이 이뤄지기 때문에 스프링 빈으로 등록된 객체만 프록시 적용이 가능하다.

 


주요 용어 

조인포인트 :

  • AOP를 적용가능한 모든 지점,
  • 스프링AOP는 스프링빈의 메소드실행시점으로 제한
  • 비유를 들자면 아파트 우편함 같은 개념

포인트 컷 

  • 조인 포인트 중에서 실제 어드바이스 적용될 위치 
  • 여러 포인트 컷 방식이 있으나 AspectJ방식 선호
  • 스프링 AOP는 메서드 실행 지점만 정의할 수 있음 
  • 조인포인트가 아파트 우편함이라면 포인트 컷은 편지의 목적지인 동,호수이다.

타겟 

  • 포인트 컷에 의해 결정된 어드바이스를 받는 객체

어드바이스 

  • 부가기능
  • Aspect에 의해 수행되는 기능
  • 종류 :  Around, Before, Afer 

Aspect 

  • 어드바이저를 모듈화한 것 
  • @Aspect 
  • 하나의 Aspect에 여러 어드바이저 존재가능

위빙

  • 포인트컷으로 결정된 타겟의 조인포인트에 어드바이스를 적용하는 것 
  • 이를 통해 핵심기능에 영향없이 부가기능 추가가능
  • AOP적용을 윟 에스팩트를 객체에 연결한 상태 

 

728x90