Spring in Action (5판)
- 스프링 5의 강력한 기능과 생산성을 활용한 웹 애플리케이션 개발
- Walls, Craig 지음
- 제어펍 출판사
- 2020.05.14
스프링 인 액션 개인 스터디 내용을 정리하자.
AOP
Aspect Oriented Programming 관점 지향 프로그래밍
어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어 모듈화 하는 것이다.
OOP를 보완하는 수단으로, 흩어진 Aspect를 모듈화하여 비즈니스 로직을 헤치지 않고 재사용하는 기법이다.
위와 같이 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하는 것이 AOP의 목적이다.
Aspect
애플리케이션 내 흩어져 있는 코드/기능, 비즈니스 로직은 아니다. 여러 객체에 공통적으로 적용되는 관심 사항이 Aspect다.
Target
Aspect가 적용되는 Class, Method를 의미한다.
Advice
Aspect에 의한 동작을 의미한다. 대상 객체의 Joinpoint에 Weaving 되어 동작할 수 있는 코드를 의미한다.
Joinpoint
Advice가 적용될 위치, 끼어들 수 있는 지점을 의미한다. 메서드 실행, 생성자 호출, 필드 값 변경과 같은 특수한 지점을 의미한다.
Weaving
Aspect를 대상 객체에 연결시켜 관점지향 객체로 만드는 과정을 의미한다. Advice를 비즈니스 로직에 삽입하는 것을 의미한다.
Pointcut
Joinpoint의 정규 표현식, 상세 스팩을 의미한다. Joinpoint가 Pointcut에 일치할 때마다 해당 Pointcut에 관련된 Advice가 실행된다.
Cross-Cutting Concerns
횡단 관심 사항, 로깅, 트랜잭션, 보안과 같이 다수의 비즈니스 로직에서 반복적으로 발생하는 부분을 의미한다.
Spring AOP vs AspectJ
Spring AOP는 공통적인 문제를 해결하고자 Spring IoC를 통한 간단한 AOP 구현이 목적이다.
완전한 AOP를 의도한 것이 아니며, Spring Bean에만 적용이 가능하다.
Spring AOP는 Proxy 기반 AOP 프레임워크이다.
반면, AspectJ는 완전한 AOP를 제공하는 것이 목적이다.
Spring AOP보다 강력하지만 복잡하고, 모든 객체에 적용이 가능하다.
Weaving
- Spring AOP
- JDK 동적 Proxy, 언제든지 객체가 한 개의 인터페이스를 구현하면 JDK 동적 프록시를 사용할 수 있다.
- CGLIB Proxy, 대상 객체가 인터페이스를 구현하지 않는 경우 CGLIB 프록시를 사용할 수 있다.
- AspectJ
- 컴파일 시점 Weaving
- AspectJ 컴파일러가 Aspect 코드와 애플리케이션의 소스 모두를 입력받아 Weaving된 class 파일을 생성한다.
- 컴파일 전 Weaving
- 바이너리 Weaving으로 이미 존재하는 class 파일과 jar 파일을 Weaving하기 위해 사용한다.
- 로드 시점 Weaving
- 바이너리 Weaving과 유사하나, Weaving 시점이 class 파일이 JVM에 로드될때 까지 연기된다는 점이 다르다.
- AspectJ는 class들이 Aspect와 함께 바로 컴파일되기 때문에 런타임시에는 아무것도 하지 않는다.
- 컴파일 시점 Weaving
Joinpoint
Cross-Cutting Concerns과 Aspect는 final 클래스에 적용할 수 없다.
final 클래스는 오버라이딩될 수 없고 런타임 예외를 초래할 수 있기 때문이다.
Spring AOP는 Proxy 패턴을 기반으로 하기에 Java 클래스의 세분화와 Cross-Cutting Concerns 적용이 필요하다.
이런 한계 때문에 메서드 실행에만 Joinpoint를 지원한다.
반면, AspectJ는 런타임 이전에 실제 코드에 Cross-Cutting Concerns를 Weaving 한다.
즉, Spring AOP와 달리, 클래스 세분화를 필요로 하지 않기에 많은 Joinpoint를 지원한다.
Spring AOP에서 동일 클래스 내 메서드 호출을 대상으로 Aspect 적용이 지원되지 않는다.
동일 클래스 내 다른 메서드를 호출할 때 Spring AOP에서 제공하는 Proxy 메서드가 호출되지 않기 때문이다.
이럴 경우, 메서드를 각기 다른 Beans로 분리하거나 AspectJ를 사용해야 한다.
'Study > Spring in Action' 카테고리의 다른 글
[Spring in Action] Spring Security & LDAP & CSRF (0) | 2021.01.24 |
---|---|
[Spring in Action] JDBC & JPA 데이터로 작업하기 (0) | 2021.01.24 |
[Spring in Action] Spring Filter & Interceptor & AOP (0) | 2021.01.23 |
[Spring in Action] Spring AOP 예제 만들어 적용하기 (0) | 2021.01.23 |
[Spring in Action] Spring 이란? 구성요소 정리 (0) | 2021.01.20 |