Spring

Spring Framework - AOP Overview

728x90

참조한 강의 : Spring & Hibernate For Beginners (www.udemy.com/course/spring-hibernate-tutorial/)

 

 

 

 

- AOP (Aspect-Oriented Programming)

: AOP 는 Aspect-Oriented Programming 의 약자이다.

객체 지향 프로그램 개발시에, 서로 다른 클래스라 할지라도, 비슷한 기능을 하는 부분이 존재할 수 있다.

반복해서 서로 다른 클래스에 나타나는 이런 코드나 메소드들을 각 클래스에 따로 따로 작성하기 보다는 하나의 모듈로 묶어서 처리한뒤, 개별 클래스에 위임(Delegation) 하는 방식이 더 유지보수가 쉬울것이다.

이런 공통되는 기능을 Cross-cutting Concern 이라 부른다.

 

 

출처 : https://engkimbs.tistory.com/746

AOP 는 위 그림에서 알 수 있듯,

Cross-cutting Concern 을 Aspect(관점) 이라는 단위로 따로 분류해서 관리하는 프로그래밍 기법을 말한다.

 

 

- AOP 관련 주요 용어

AOP 와 관련된 몇가지 주요 용어가 있는데, AOP 를 이해하기 위해선 반드시 알고 가야한다.

 

    • Aspect
      : Cross-cutting Concern 을 모듈화한것을 말한다.
    • Advice
      : 각 Aspect 가 실행할 동작을 정의한 부분이다.
    • Pointcut
      : Join Point 를 좀 더 상세하게 기술해둔 부분으로, 구체적으로 어떤 메소드에 적용시킬지를 나타내는 부분이다.   
      (pointcut 을 사용할때는 AspectJ 가 제공하는 pointcut expression lanaguage 라는것을 이용해서 정의함)
    • Join Point
      : Advice 가 적용될 위치, 지점을 의미한다 (Advice 가 끼어들 위치를 의미함)
    • Target
      : Aspect 를 적용시킬 목표 대상을 말한다 (클래스, 메소드 등)
    • Weaving
      : Aspect 를 대상 객체에 연결시켜서 대상 객체를 관점 지향 객체로 바꾸는 과정을 의미한다 (즉 Advice 를 비지니스 로직코드에 넣는 과정을 의미함)

 

 

 

- Advice Type

: Advice 에는 아래와 같은 5개의 종류가 존재한다. (Spring AOP 에서 해당하는 내용임, method-level 에서만 적용되는 개념이기 때문에)

 

1) Before Advice

: 타겟 메소드가 실행되기 이전에 실행되는 advice 를 말한다 (@Before 어노테이션 사용)

 

2) After Finally Advice

: 타겟 메소드의 결과와는 상관없이 타겟 메소드가 실행을 마치면 사용되는 advice 를 말한다 (@After 어노테이션 사용)

 

3) After Returning Advice

: 타겟 메소드가 정상적으로 실행을 마치고 나서 실행되는 advice 를 말한다. (@AfterReturning 어노테이션 사용)

 

4) After Throwing Advice

: 타겟 메소드가 실행 도중 예외를 발생시킬때 실행되는 advice 를 말한다 (@AfterThrowing 어노테이션 사용)

 

5) Around Advice2

: Advice 가 타겟 메소드를 감싸서 타겟 메소드 호출 전후로 실행되는 Advice 를 말한다 (@Around 어노테이션 사용)

 

 

 

 

- AOP 를 왜 써야 하는가?

: 정확히는 Spring AOP 를 써야 하는 이유이긴하다.

가장 큰 이유는 비지니스 로직에만 더 집중하게 하기 위해서 이다.

또한, 위에 그림에서도 봤듯이 서로 다른 여러개의 클래스에 분산된 공통적인 코드들을 한군데로 묶는다는점에서, 코드의 유지 보수성을 높이고, 가독성을 높인다.

 

AOP 를 쓰는 가장 흔한 케이스는, 로깅 작업을 할때, 트랜잭션 작업을 할때 등이 해당한다

또한 추가적으로, 로그 기록에 대한 예외처리를 남겨둬서 DevOps 팀에게 더 손쉽게 알려줄수있다.

그리고 API 를 더 유연하게 관리할 수 있게 해줄 수 있다는 장점 등 여러가지가 존재한다.

 

아래는 Spring AOP 를 썼을때의 장단점을 간단하게 요약한 것이다.

장점 단점
모듈을 재사용 가능하게 만듦 너무 Aspect 를 남용하면, 프로그램의 흐름을 읽기 어려워짐

(협업시에 모두가 따로노는 Aspect 를 여러개 남발하면 알아보기 힘들어짐)
코드의 가독성을 높임
분산된 코드를 묶어둬서 코드의 유지보수를 쉽게 만듦 컴파일 Weavig 일때 보다 성능을 떨어트릴수있음
(Spring AOP 만 해당함)

 

 

 

 

- Spring AOP VS AspectJ

자바 기반의 관점 지향 프로그래밍을 구현한 관련 프레임워크로

제일 많이 쓰는 두가지는 Spring AOP 와 AspectJ 가 있다.

 

둘의 가장 큰 차이점은, AOP 의 구현의 정도가 얼마나 차이 있느냐 이다.

 

Spring AOP 는 오로지 스프링 프레임워크에 맞춰져서 설계된 AOP 이다. 

스프링 프레임워크가 제공하는 Spring Container 에 의해서 관리되는 Bean 에만 AOP 를 적용하는 방식이다.

 

그러나, AspectJ 는 오로지 순수하게 AOP 만을 완전히 구현하는것을 목표로 설계되었다.

따라서, Bean 이 아닌 POJO 에도 적용이 가능하다.

 

 

* Weaving Type

: 앞에서 Weaving 은 Aspect 를 타겟 객체에 넣어서 해당 객체를 관점 지향 객체로 만드는 과정이라 말했다

이 Weaving 은, AspectJ 와 Spring AOP 가 사용하는 종류가 다르다

 

먼저, AspectJ 는 다음과 같은 3개의 타입을 사용할 수 있다.

 

1) 컴파일 시점에 Weaving 하는 경우

: AspectJ 컴파일러가 Aspect 코드와 어플리케이션 소스를 모두 입력 받아서 Weaving 처리된 class 파일을 생성하는 케이스

 

2) 컴파일 이전에 Weaving 하는 경우

: Binary Weaving 이라고도 부르며, 이미 존재하는 class 파일과 jar 파일을 weaving 할때 사용하는 케이스

 

3) 로드 타임시기에 Weaving 하는 경우

: 2) 와 비슷하지만, weaving 시점이 class 파일이 JVM 에 로드 될때 까지 연기한다는 차이점을 가지고 있는 케이스

 

 

반면에 Spring AOP 는 오로지 런타임 시기에만 Weaving 이 이뤄진다.

 

 

* Proxy Pattern

: 또한 Spring AOP 가 AspectJ 와 다른 점 중 하나는, Proxy Pattern 을 기반으로 작성되었다는 점이다.

 

(참고) Proxy Pattern

jdm.kr/blog/235

 

프록시 패턴(Proxy Pattern) :: JDM's Blog

프록시 패턴 정의 실제 기능을 수행하는 객체Real Object 대신 가상의 객체Proxy Object를 사용해 로직의 흐름을 제어하는 디자인 패턴입니다. 프록시 패턴 특징 원래 하려던 기능을 수행하며 그외의

jdm.kr

 

스프링 기반으로 작성된 앱에서, 메인부분이 바로 대상 객체와 연결되는게 아니라, 아래 그림처럼 해당 대상 객체가 AOP 가 적용되어 있다면, 스프링에서는 별도의 Proxy 객체를 통해서 해당 객체에 접근한다.

 

출처 : https://www.udemy.com/course/spring-hibernate-tutorial/

 

반면에, AspectJ 는 어떠한 디자인 패턴도 따로 필요하지 않고, 런타임시에 실행하지 않고 컴파일시에 실행해도 처리가 가능하다.

 

 

* Joinpoint

: Spring AOP 가 가진 한계점 중 하나는, method-level 에서만 AOP 를 적용할 수 있다는점이다.

그 이유는, Spring AOP 가 런타임시에만 실행되기 때문에, final 클래스나, static 키워드를 쓴 경우, 런타임시에 오류를 초래 할 수 있기 때문이다.

 

그러나, AspectJ 는 런타임 이전에 Weaving 이 가능하기 때문에 이런 한계점이 없다

아래 표는 둘의 Joinpoint 차이점을 나타낸 것이다.

 

Joinpoint Spring AOP AspectJ
메소드 호출 X O
메소드 실행 O O
생성자 호출 X O
생성자 실행 X O
Static 초기화 실행 X O
객체 초기화 X O
필드 참조 X O
필드 값 변경 X O
핸들러 실행 X O
Advice 실행 X O

 

 

 

 

* 장단점

둘의 장단점을 대략적으로 정리하면 아래와 같다.

 

1) Spring AOP

장점 단점
AspectJ 보다 사용하기 간편하다 method-level 에서만 지원한다
Proxy Pattern 을 사용한다 Spring Container 에 의해 관리되는 Bean 에만 AOP 적용이 가능하다
@Aspect 어노테이션을 이용해서 AspectJ 로 migrate 가능하다 런타임시에 AOP 가 적용되므로 컴파일시에 적용되는 것보다 성능이 뒤떨어진다

 

 

2) AspectJ

장점 단점
모든 경우의 join point 를 제공한다
(지점에 무관하게 Aspect 를 접근시켜도 가능하다는 의미)
컴파일시에 Weaving 하려면 컴파일을 위한 별도의 컴파일러와 여러가지 툴을 가져와야 한다. (사용하기 복잡함)
POJO 에도 적용가능하다
(Bean 이 아닐지라도)
Spring AOP 보다 빠른 성능을 낼 수 있다 AspectJ 의 point cut 관련 문법이 다소 복잡할 수 있다.
AOP 의 모든 기능을 구현할 수 있다

 

 

 

여기까지 AOP 에 대해서 간단히 알아봤다

다음은, AOP 와 관련된 자바 코드를 직접 짜보면서 AOP 에 대해 좀 더 명확히 이해해본다.

 

 

 

- References)

1. AOP : engkimbs.tistory.com/746

2. Spring AOP VS AspectJ : www.baeldung.com/spring-aop-vs-aspectj

3. Proxy Pattern : jdm.kr/blog/235

 

 

 

 

 

 

 

 

 

 

728x90

'Spring' 카테고리의 다른 글

Maven 이란  (0) 2021.02.25
Spring Framework - AOP 코드 예제  (0) 2021.02.24
Spring Framework - Layered Architecture  (0) 2021.02.16
Spring Framework - 연관 관계 매핑  (0) 2021.02.13
Spring Framework - Eager, Lazy Loading  (0) 2021.02.11