참조한 강의 : Spring & Hibernate For Beginners (www.udemy.com/course/spring-hibernate-tutorial/)
- AOP (Aspect-Oriented Programming)
: AOP 는 Aspect-Oriented Programming 의 약자이다.
객체 지향 프로그램 개발시에, 서로 다른 클래스라 할지라도, 비슷한 기능을 하는 부분이 존재할 수 있다.
반복해서 서로 다른 클래스에 나타나는 이런 코드나 메소드들을 각 클래스에 따로 따로 작성하기 보다는 하나의 모듈로 묶어서 처리한뒤, 개별 클래스에 위임(Delegation) 하는 방식이 더 유지보수가 쉬울것이다.
이런 공통되는 기능을 Cross-cutting Concern 이라 부른다.
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
스프링 기반으로 작성된 앱에서, 메인부분이 바로 대상 객체와 연결되는게 아니라, 아래 그림처럼 해당 대상 객체가 AOP 가 적용되어 있다면, 스프링에서는 별도의 Proxy 객체를 통해서 해당 객체에 접근한다.
반면에, 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
'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 |