Spring에는 AOP(Aspect Oriented Programming)이라는 개념이 있다.
말 그대로 관점 지향 프로그래밍이라는 건데, 이건 또 어떤 것일까.
일반적으로 OOP(Object Oriented Programming)은 모듈화의 핵심 단위가 클래스인데,
AOP는 모듈화의 핵심 단위가 바로 Aspect다.
즉 OOP에서는 객체를 기준으로 모듈화를 한다면 AOP에서는 관점에 따라 모듈화를 진행한다.
Aspect는 여러 타입과 객체에 걸쳐서 사용되는 기능 등의 모듈화라고 생각하면 된다.
A,B,C의 클래스가 있다고 가정해보자.
A에서는 a 코드와 b 코드,
B에서는 b코드와 c 코드,
C에서는 a코드와 c코드가 작성되어 있다면
a코드는 A와 C 클래스 사이의 공통 관심사항(Cross Cutting Concerns)이고
b코드는 A와 B 클래스 사이의 공통 관심사항이다.
c코드는 역시 B와 C 클래스 사이의 공통 관심사항이며,
각 클래스 내부에는 각각의 핵심 관심사항(Core Concern)이 있을 것이다.
간단하게 생각하면 공통 관심사항은 여러 클래스나 타입에서 사용되는 공통되는 부분,
핵심 관심사항은 각 클래스가 가지는 고유의 중요한 기능을 말할 수 있다.
예금 인출, 송금 기능을 작성한 클래스가 각각 존재한다고 봤을 때,
로그인과 보안 검토, 상호 작용 등은 두 클래스 모두 사용하는 기능들이기에 공통 관심사항일 것이고,
돈을 인출하는 것과 송금하는 것은 두 클래스 각각이 가지는 고유의 기능들일 것이다.
이것이 바로 핵심 관심사항이라고 생각하면 된다.
AOP는 여기서 공통의 관심사항에 대한 모듈화를 실행할 수 있다.
AOP와 관련된 용어도 알아보자.
Aspect - 여러 클래스에서 공통적으로 구현되는 관심사의 모듈화하는 것이다. 주로 부가 기능을 모듈화한다.
Join Point - 메서드 실행이나 예외 처리와 같은 프로그램 실행 중의 특정한 지점을 말한다.
끼어들 수 있는 지점이라는 것인데, 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양하다.
Pointcut - Join Point에 Aspect를 적용하기 위한 조건을 서술하는 것.
Joint Point의 상세한 조건을 정의한 것이라 볼 수 있다.
Advice - 특정 Join Point에서 Aspect에 의해서 취한 행동을 말한다. 실질적인 부가 기능 로직을 정의하는 것이다.
Around, Before, After 등의 Advice 타입이 존재한다.
Target - 하나 이상의 Advice가 적용될 객체를 말한다.
Spring AOP는 Runtime Proxy를 사용해서 구현되므로 객체는 항상 Proxy 객체가 된다.
AOP Proxy - AOP를 구현하기 위해 AOP 프레임워크에 의해서 생성된 객체다.
Spring Framework에서 AOP 프록시는 JDK dynamic proxy 또는 CGLIB proxy이다.
Weaving - Aspect를 다른 객체와 연결하여 Advice 객체를 생성, 런타임 또는 로딩 시 수행할 수 있지만
Spring AOP는 런타임에 위빙을 수행한다.
라고 이해했다.
'프레임워크 > Spring' 카테고리의 다른 글
Spring applicationContext class path resuource 에러 (0) | 2023.04.13 |
---|---|
Spring AOP Proxy (0) | 2023.04.12 |
의존성 주입(Dependency Injection)(의존성 주입_Annotation@) (0) | 2023.04.11 |
의존성 주입(Dependency Injection)(의존성 주입_XML) (0) | 2023.04.11 |
의존성 주입(Dependency Injection)(강하고 느슨한 결합 관계) (0) | 2023.04.11 |