AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)
- 특정 관점(Aspect)을 기반으로 프로그래밍 하는 방식
여기서 말하는 관점이란?
= 특정한 로직이나 기능을 말함.
== 이것이 전체 코드의 여러 부분에 걸쳐 반복적으로 나타나는 경우가 많다. 이런 반복적인 코드를 '흩어진 관심사(Cross-cutting Concern)'라고 부른다
예를 들어, 로깅, 보안, 트랜잭션 관리 등은 여러 개의 클래스나 메소드에 걸쳐 공통적으로 필요한 기능이다. 이런 기능들은 핵심 비즈니스 로직과는 별개지만 시스템의 전반적인 동작에 필요한 역할을 수행한다.
이런 경우 이 기능들을 각각의 클래스나 메소드로 구현하는 것이 아닌 별도의 관점(Aspect)로 분리하여 모듈화하고, 필요한 시점에 적용하는 것이 AOP의 핵심 아이디어다.
AOP의 장점
- 코드의 중복을 줄일 수 있다
- 핵심 비즈니스 로직과 각 기능의 구현을 분리함으로써 코드의 가독성과 유지 보수성을 향상시킬 수 있다
스프링 프레임워크에서는 이러한 AOP를 지원하기 위한 여러 도구를 제공하고, 개발자가 비즈니스 로직 및 공통 기능을 효율적으로 관리할 수 있게 도와준다
AOP의 주요 개념과 기능
Aspect
: 공통 기능을 정의한 모듈. Advice와 Pointcut을 합친 것으로 볼 수 있다
Aspect는 '관점'이라는 뜻을 가지고 있다. 이는 여러 객체에 걸쳐 사용되는 특성을 하나의 책임으로 모듈화 하는 것을 의미.
이 때, Aspect는 Advice와 Pointcut을 결합한 것으로, 실질적으로 AOP를 구현하는 코드의 단위이다
여기서 Advice는 공통 관심사가 구현된 코드를, Pointcut은 공통 관심사를 어느 JoinPoint에 적용할지 정하는 규칙을 의미한다. 이렇게 Aspect는 공통 관심사의 코드와 그 코드가 적용될 시점을 결정하는 역할을 수행한다
JoinPoint
: 프로그램 실행 중 Aspect의 코드가 적용될 수 있는 특정 위치를 의미한다
JoinPoint는 '결합점'을 의미하며, Advice가 적용될 수 있는 모든 위치를 가리킵니다. 이는 메소드 호출, 필드 값의 변경 등이 될 수 있습니다. 그러나 스프링 AOP에서는 메소드 호출만을 지원합니다
Pointcut
: JoinPoint의 부분 집합으로, 실제로 Advice가 실행되는 시점을 결정한다
Pointcut은 '절단점'을 의미하며, 실제로 Advice가 적용될 JoinPoint를 선별하는 역할을 수행. 이는 표현식을 사용하여 지정된다. *는 모든 것을 의미하고, ..는 모든 것이 될 수있는 범위를 의미한다.
예를들어, execution(* com.xyz.service.*.*(..))는 com.xyz.service 패키지의 모든 클래스의 모든 메소드가 실행될 때를 가리킨다.
within(com.xyz.service..*)라는 표현식은 com.xyz.service 패키지 및 모든 하위 패키지의 모든 클래스를 의미
bean(*Dao)는 스프링 컨테이너에 등록된 빈의 이름이 Dao로 끝나는 모든 빈을 의미
Advice
: 실제로 언제 어떤일을 할지에 대한 것으로 Aspect의 '무엇'과 '언제'에 해당한다 ( 공통기능 )
Advice는 '조언'이라는 뜻을 가지고 있으며, 실제로 어떤 작업을 수행할 것인지를 정의.
스프링 AOP에서는 5가지 유형의 Advice를 제공한다
- Before advice : 메소드 호출 이전에 실행되는 코드를 정의
- After returning advice : 메소드 호출이 성공적으로 완료된 이후에 실행되는 코드를 정의
- After throwing advice : 메소드 호출 중 예외가 발생했을 때 실행되는 코드를 정의
- After(finally) advice : 메소드 호출 성공 여부와 상관 없이 실행되는 코드를 정의
- Around advice : 이는 가장 강력한 Advice로, 메소드 호출 전 후에 코드를 실행할 수 있다. 이를 허용하면 다른 advice 들을 흉내낼 수 있다
Weaving
: Aspect와 Target 객체를 연결하는 과정. 이 과정에서 프록시 객체가 생성
Weaving은 '엮는다'는 뜻을 가지고 있으며, Aspect를 타겟 객체에 적용하여 프록시 객체를 생성하는 과정을 의미.
이는 컴파일 시점, 클래스 로드 시점, 런타임 시점 등에 수행될 수 있다. 스프링 AOP에서는 런타임 시점에 Weaving이 이루어진다
'Spring' 카테고리의 다른 글
Spring_Spring MVC, 첨부파일 업로드 (0) | 2024.03.15 |
---|---|
Spring_스프링 시큐리티 (0) | 2024.03.12 |
Spring_form 입력 값 유효성 체크, <form:form>태그 (3) | 2024.03.06 |
Spring_스프링 프레임워크(Spring framework), DI, IOC (0) | 2024.02.22 |
Model2_MVC패턴 (Spring 들어가기 전) (0) | 2024.02.15 |