728x90
애플리케이션은 핵심 기능과 부가 기능으로 로직을 구별할 수 있습니다.
- 핵심 기능 : 특정 객체가 제공하는 객체 고유의 기능
- 부가 기능 : 핵심 기능을 보조하는 기능. 로그, 트랜잭션 등
부가 기능은 주로 공통 로직입니다.
- 반복된 코드가 곳곳에서 나타납니다. 중복이 발생합니다.
- 변경이 일어날 때, 그만큼 수정해야 합니다.
AOP
- 관점 지향 프로그래밍(Aspect-Oriented Programming)
- 반복되는 부가 기능을 모아 모듈화하는 개발방법입니다.
- 객체 지향 프로그래밍에서 발생하는 중복을 제한하는 보조 방법입니다.
AspectJ Framework
- AOP를 구현한 프레임워크입니다.
- 오류 검사, 오류 처리, 동기화, 캐싱, 모니터링, 로깅 등을 모듈화할 수 있습니다.
- 스프링은 AspectJ의 문법을 차용하여 AOP 기능을 제공합니다.
JVM Application에 AOP를 적용하는 방법
- JVM에서 AOP를 적용하는 구간은 크게 3가지가 있습니다.
- 컴파일 시점, 클래스 로딩 시점, 런타임 시점
컴파일 시점
- java 소스코드를 가지고 컴파일러가 class 파일로 생성하는 시점에 AOP를 적용합니다. (Compile Time Weaving)
- AspectJ가 제공하는 컴파일러는 소스코드를 컴파일할 때, AOP가 구현된 코드를 붙여서 컴파일합니다.
- AspectJ 컴파일러는 해당 클래스가 AOP 적용대상인지 판단하고, 적용대상에 한해서 AOP 기능을 적용합니다.
- 컴파일 시점에 AOP 기능을 원본에 합성하기 때문에, 특별한 컴파일러를 사용해야 합니다.
클래스 로딩 시점
- 자바 프로그램을 실행하면 class 파일은 JVM의 class loader에 보관됩니다.
- class loader에 class 파일이 보관되기 이전에 AspectJ는 바이트코드를 조작해서 AOP 기능을 추가할 수 있습니다.(Load Time Weaving)
- 클래스 로딩 시점에 AOP를 적용하는 방법은 javaagent를 통해서 클래스 로더 조작기를 지정해야 합니다.
런타임 시점
- 자바 프로그램이 실행되고 나서 AOP 기능을 프록시 방식을 통해 제공할 수 있습니다. (Runtime Weaving)
- 스프링 프레임워크를 사용하는 경우, 애플리케이션이 실행될 때 스프링 컨테이너에 빈을 등록하는 과정이 있습니다.
- 빈을 등록하는 과정에서 Bean Post Processor를 사용하여 특정 인스턴스의 프록시를 대신 빈 컨테이너에 등록할 수 있는데, 런타임 시점에 AOP는 이러한 방식으로 제공됩니다.
- 프록시를 통해서 AOP를 제공하기 때문에 위 2가지 방법보다는 제한적으로 기능이 제공됩니다.
프록시 기반 AOP 제약사항
- AOP는 생성자, 필드 접근, static 메서드 접근, 메서드 실행 지점에서 적용할 수 있습니다. (Join Point)
- 프록시 AOP는 메서드 오버라이딩을 통해서 제공됩니다.
- 프록시 방식의 AOP는 오직 메서드 실행 시점에서만 제공됩니다.
- 스프링 AOP는 빈 컨테이너가 관리하는 빈에 대해서만 적용됩니다.
AOP 용어
- Advice : 부가 기능. AOP로 구현하는 로직
- Join Point : Advice가 적용될 수 있는 위치
- Pointcut : Advice가 적용될 Join Point를 결정하는 기능
- 스프링 AOP는 메서드 실행 시점만 포인트 컷으로 결정 가능
- Target : Advice 적용 대상
- Aspect : Advice + Pointcut
- Advisor : 1개의 advice와 1개의 pointcut으로 구성
- 스프링 AOP에서만 사용되는 용어
- AOP 프록시 : AOP 기능을 제공하는 프록시 객체
- 스프링에서 AOP는 JDK 다이나믹 프록시나 CGLIB 프록시로 구현
'Framework | Library | Tool > Spring Core' 카테고리의 다른 글
Spring Triangle : 스프링을 지탱하는 원리 (0) | 2021.06.06 |
---|---|
Spring Properties 주요 설정 (0) | 2020.03.30 |