학습목표
- AOP(Aspect-Oriented Programming)
TIL
- AOP(Aspect-Oriented Programming)
Q.
Spring AOP란 무엇이야??
A.
Spring AOP (Aspect-Oriented Programming)은 프로그래밍 패러다임 중 하나로, 교차하는 관심사(cross-cutting concerns)의 분리를 통해 모듈성을 증가시키는 것을 목표로 합니다. 기존 코드 (join points)에 수정 없이 추가적인 행동 (advice)을 부여함으로써 이를 달성하며, 어떤 코드가 수정되는지는 별도로 'pointcut' 명세를 통해 지정합니다. 이러한 관심사의 분리는 이해하고 유지 관리하기 더 쉬운 코드를 만듭니다.
Spring 프레임워크의 맥락에서 AOP는 dependency injection과 함께 사용되어 엔터프라이즈 자바 어플리케이션에 대한 포괄적인 프로그래밍 및 설정 모델을 제공합니다.
Spring AOP의 주요 개념들은 다음과 같습니다:
- Aspect (관점): 여러 객체에 걸쳐있는 관심사의 모듈화입니다. Aspect는 advice와 pointcuts을 포함할 수 있습니다.
- Join Point (조인 포인트): 메소드 실행이나 예외 처리와 같은 프로그램 실행 중의 시점입니다. Spring AOP에서는 조인 포인트가 항상 메소드 실행을 나타냅니다.
- Advice (조언): 특정 조인 포인트에서 Aspect가 취하는 행동입니다. Advice의 다양한 유형에는 "around," "before" 및 "after" advice가 있습니다.
- Pointcut (포인트 컷): 조인 포인트와 일치하는 술어입니다. Advice는 pointcut 표현식과 연관되며, 포인트 컷에 의해 일치하는 어떤 조인 포인트에서든 실행됩니다.
- *arget object (대상 객체): 하나 이상의 Aspect에 의해 조언 받는 객체입니다. 또한 advised object라고도 합니다.
- Weaving (위빙): Aspect를 다른 애플리케이션 타입이나 객체와 연결하여 advised object를 만드는 과정입니다. 이 작업은 컴파일 시간 (예: AspectJ 컴파일러), 로드 시간, 또는 런타임에 수행될 수 있습니다. Spring AOP와 같은 순수 자바 AOP 프레임워크는 런타임에 위빙을 수행합니다.
Spring AOP를 애플리케이션에서 사용하려면, 먼저 Aspect와 그 Advice를 설정해야 합니다. XML 또는 Java 기반 설정을 사용할 수 있습니다. 그런 다음 Aspect가 애플리케이션 컨텍스트
Q.
계속 말해줘 ㅎ
A.
애플리케이션 컨텍스트에서 사용 가능하도록 해야 합니다. 애플리케이션 컨텍스트는 Spring이 객체를 관리하는 데 사용하는 것입니다.
다음은 Java 기반 설정을 사용하는 Spring AOP aspect의 간단한 예입니다:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class MyAspect {
@Before("execution(* com.example.myapp.MyClass.myMethod(..))")
public void beforeMyMethod() {
System.out.println("Before myMethod");
}
}
이 예에서, `beforeMyMethod` advice는 `MyClass`의 `myMethod`가 실행되기 전에 실행됩니다. `@Before` 어노테이션의 문자열 인수는 어떤 메소드에 advice가 적용되는지 결정하는 pointcut 표현식입니다. `"execution(* com.example.myapp.MyClass.myMethod(..))"` 표현식은 "이름이 `myMethod`인 `com.example.myapp.MyClass`의 모든 메소드"를 의미하며, `(..)`는 매개변수의 수와 유형에 관계없음을 의미합니다.
이렇게 설정한 뒤, Spring의 애플리케이션 컨텍스트에서 이 Aspect를 사용할 수 있도록 등록하면 `myMethod` 메소드가 실행되기 전에 `beforeMyMethod`가 실행되는 방식으로 AOP가 동작하게 됩니다. 이를 통해, 메소드의 실행 전에 특정 작업을 수행하거나, 후처리를 하는 등의 교차 관심사를 별도의 코드로 분리하여 관리할 수 있습니다. 이는 코드의 가독성과 유지보수성을 향상시키는 데 도움이 됩니다.
Q.
자바 AOP와 스프링 AOP는 다른 거야?
A.
AOP (Aspect-Oriented Programming)은 프로그래밍 패러다임 중 하나로, 자바와 같은 특정 언어에 종속되지 않습니다. AOP는 시스템 전체에 걸쳐 분포되어 있는 기능들을 모듈화하는 것을 목표로 합니다. 예를 들어, 로깅이나 보안과 같은 기능은 애플리케이션 전반에 걸쳐 사용될 수 있고, 이런 기능들은 AOP를 통해 별도의 모듈로 분리하여 관리할 수 있습니다.
Spring AOP는 AOP 패러다임을 Java로 구현한 것 중 하나로, Spring Framework의 일부입니다. Spring AOP는 순수 자바로 작성되었으며, Spring Framework의 다른 부분과 매끄럽게 통합되어 있습니다. 그러나 Spring AOP는 비교적 기능이 제한적인 편으로, 메소드 실행과 같은 프로그래밍 실행 흐름에서 특정 지점에만 적용될 수 있습니다.
반면에, AspectJ와 같은 다른 AOP 구현체들은 메소드 호출, 필드 접근, 클래스 초기화 등 매우 다양한 조인포인트를 지원합니다. 이런 구현체들은 보통 별도의 컴파일 과정을 필요로 하며, 자바의 기본 문법을 확장하는 방식으로 사용합니다.
따라서, '자바 AOP'는 자바로 구현된 모든 AOP 기술을 일컫는 말로 볼 수 있으며, 'Spring AOP'는 이 중에서 Spring Framework에 포함된 AOP 기능을 가리킵니다. Spring AOP는 사용이 쉽고 통합이 잘 되어 있지만, 기능이 제한적이라는 특징이 있으며, 더 광범위한 AOP 기능을 원하는 경우 AspectJ와 같은 라이브러리를 사용할 수 있습니다. 실제로, Spring은 AspectJ와의 통합도 지원하고 있습니다.
Q.
스프링 AOP 작동 과정 알려줘
A.
Spring AOP는 다음과 같은 과정을 통해 작동합니다:
1. 정의 단계: 먼저, advice, pointcut, 그리고 aspect를 정의합니다. Aspect는 advice와 pointcut을 결합한 것으로, 어떤 메소드에 어떤 advice가 적용되어야 하는지를 결정합니다. Spring에서는 이를 XML 기반의 설정이나 어노테이션 기반의 설정을 통해 할 수 있습니다.
2. 컴파일 및 로드 단계: 애플리케이션을 컴파일하고 실행합니다. Spring은 런타임 시점에 AOP 프록시를 생성합니다.
3. 실행 단계: 해당 메소드를 호출하는 요청이 발생하면, Spring AOP는 먼저 해당 메소드가 aspect의 pointcut에 정의된 메소드와 일치하는지 확인합니다.
4. 위빙 단계: 만약 일치한다면, Spring AOP는 해당 메소드 실행 전후에 aspect의 advice를 적용합니다. 이 과정을 '위빙'이라고 부릅니다. 위빙이란, aspect의 advice를 원래의 메소드 실행 흐름에 '엮어 넣는' 것을 말합니다.
5. 메소드 실행: advice가 적용된 후, 실제로 메소드가 실행됩니다. before advice의 경우, 메소드 실행 전에 advice가 적용되며, after advice의 경우 메소드 실행 후에 advice가 적용됩니다. around advice는 메소드 실행 전후 모두에 적용됩니다.
6. Advice 실행: 위빙 과정에서 설정된 advice가 실행됩니다. 예를 들어, 로깅을 위한 advice가 있다면, 메소드 호출 시점에 로그 메시지가 출력될 것입니다.
Spring AOP는 프록시 기반의 AOP를 제공합니다. 즉, 실제로 우리가 작성한 비즈니스 로직 코드는 건드리지 않고, 그 앞에 프록시 객체를 두어 이 프록시를 통해 우리의 메소드가 실행될 때 AOP 기능을 수행하게 됩니다. 이렇게 함으로써, AOP가 적용되는 메소드의 코드 자체를 수정하지 않고도 원하는 AOP 기능을 수행할 수 있습니다.
'[F-Lab 66해빗 페이백 챌린지 ]' 카테고리의 다른 글
| [F-Lab 모각코 페이백 33일차] Spring Entity, DTO, DAO, VO (0) | 2023.07.13 |
|---|---|
| [F-Lab 모각코 페이백 32일차] Spring ComponentScan (0) | 2023.07.13 |
| [F-Lab 모각코 페이백 29일차] ORM (Object-Relational Mapping) (0) | 2023.07.11 |
| [F-Lab 모각코 페이백 27일차] 스프링 시큐리티 (Spring Security) (0) | 2023.06.15 |
| [F-Lab 모각코 페이백 26일차] 스프링 트랜잭션 (Spring Transaction) -2 (0) | 2023.06.13 |