본문 바로가기
백엔드/Spring Framework

AOP 에서 aspect와 advisor를 사용할 때의 차이점 / Joinpoint와 pointcut의 차이

by maverick11471 2024. 7. 14.
언제 @Aspect와 Advisor를 사용할지 결정하는 방법
전역적인 횡단 관심사를 다루는 경우: @Aspect를 사용합니다. 예를 들어, 로깅, 성능 모니터링, 보안 등.
트랜잭션 관리와 같이 특정 프레임워크를 통해 제공되는 기능을 사용하는 경우: Advisor를 사용합니다.
횡단 관심사(cross-cutting concern)는 소프트웨어 시스템 전반에 걸쳐 여러 모듈에서 
공통적으로 필요로 하는 기능이나 로직을 말합니다. 
이러한 횡단 관심사는 특정 모듈이나 계층에 국한되지 않고, 
시스템의 여러 부분에 걸쳐 존재하기 때문에 이를 효율적으로 관리하기 위해 
AOP(Aspect-Oriented Programming)와 같은 기법이 사용됩니다.

예시
횡단 관심사의 대표적인 예로는 다음과 같은 것들이 있습니다:

1. 로깅(Logging):

애플리케이션의 여러 부분에서 로그를 기록하는 기능.
예: 메서드 호출 시점, 실행 시간, 예외 발생 시 로그 기록 등.

2. 보안(Security):

접근 제어와 권한 관리를 통해 시스템의 보안을 유지하는 기능.
예: 특정 메서드나 리소스에 접근하기 전에 인증 및 인가 확인.

3. 트랜잭션 관리(Transaction Management):

데이터베이스 작업의 원자성을 보장하기 위해 트랜잭션을 시작하고 커밋하거나 롤백하는 기능.
예: 데이터베이스 작업이 성공하면 커밋하고, 실패하면 롤백.

4.캐싱(Caching):

자주 사용되는 데이터를 메모리에 저장하여 성능을 향상시키는 기능.
예: 결과값을 캐시에 저장하고, 동일한 요청이 있을 때 캐시에서 데이터 반환.

5. 모니터링 및 성능 측정(Monitoring and Performance Measurement):

시스템의 성능을 모니터링하고, 병목 현상을 파악하는 기능.
예: 메서드 실행 시간 측정, 리소스 사용량 모니터링.

[횡단 관심사의 문제점]
횡단 관심사는 시스템의 여러 부분에 분산되어 있기 때문에, 
이를 각 모듈에서 개별적으로 관리하면 코드의 중복이 발생하고 유지보수가 어려워질 수 있습니다. 
이러한 문제를 해결하기 위해 AOP를 사용하여 횡단 관심사를 모듈화하고, 
한 곳에서 일괄적으로 관리할 수 있게 합니다.

[AOP(Aspect-Oriented Programming)의 역할]
AOP는 이러한 횡단 관심사를 별도의 구성 요소로 분리하여 코드의 중복을 최소화하고, 
관심사의 분리를 통해 코드의 가독성과 유지보수성을 향상시킵니다. 
AOP의 핵심 개념은 다음과 같습니다:

Aspect: 횡단 관심사를 모듈화한 것.
Join Point: 횡단 관심사가 적용될 수 있는 지점(예: 메서드 호출).
Advice: 특정 Join Point에서 실행되는 코드(예: Before, After, Around).
Pointcut: Advice가 적용될 Join Point를 정의하는 표현식.
이를 통해 횡단 관심사를 효율적으로 관리하고, 시스템의 각 모듈이 본연의 역할에 집중할 수 있도록 돕습니다.

 

예시 : aspect

<aop:config>
    <!--aop:pointcut 공통적인 기능이 실행될 클래스와 메소드를 지정한다.-->
    <aop:pointcut id="allpointcut" expression="execution(* com.bit.springboard.service..FreeBoardServiceImpl.*(..))"/>
    <!--aop:aspect 공통 기능의 메소드와 실행될 메소드를 매핑하는 작업-->
    <aop:aspect ref="afterReturning">
        <aop:after-returning method="afterReturningLog" pointcut-ref="allpointcut"
                             returning="returnObj"/>
    </aop:aspect>
</aop:config>

// 여기서 joinpoint (클래스의 모든 메소드가 실행되는 지점)
// FreeBoardServiceImpl 클래스의 모든 메소드가 실행되는 지점
<aop:pointcut id="allpointcut" expression="execution(* com.bit.springboard.service..FreeBoardServiceImpl.*(..))"/>

// 여기서 advice
afterReturningLog

// 여기서 pointcut
com.bit.springboard.service 패키지 내의 FreeBoardServiceImpl 클래스에 있는 모든 메소드가 
joinpoint임을 나타냅니다.

 

joinpoint와 pointcut의 차이점

AOP에서 pointcut과 joinpoint는 서로 다른 개념을 나타냅니다. 각각의 차이를 설명하자면 다음과 같습니다:

Joinpoint (조인포인트)
정의: 프로그램 실행 중에 어드바이스(advice)가 적용될 수 있는 지점입니다.
예시: 메소드 호출, 객체 생성, 필드 접근 등 다양한 실행 지점이 될 수 있습니다.
특징: Joinpoint는 실제로 실행되는 지점입니다.
예를 들어, 클래스의 특정 메소드가 호출되는 순간이 Joinpoint가 될 수 있습니다.

Pointcut (포인트컷)
정의: Joinpoint를 선별하는 표현식입니다. 어떤 Joinpoint에 어드바이스를 적용할지를 정의합니다.
예시: execution(* com.bit.springboard.service..FreeBoardServiceImpl.*(..)) 같은 표현식이 
포인트컷입니다.
특징: Pointcut은 하나 이상의 Joinpoint를 지정할 수 있는 규칙이나 패턴입니다. 
이를 통해 특정 메소드나 클래스에 어드바이스를 적용할 수 있습니다.

요약
Joinpoint: 실제 실행 지점 (예: 특정 메소드 호출).
Pointcut: Joinpoint를 선별하는 규칙이나 패턴.
따라서, Pointcut은 여러 Joinpoint를 포함할 수 있으며, 
어떤 Joinpoint에 어드바이스를 적용할지를 결정하는 역할을 합니다.

이 예제에서:

Joinpoint: FreeBoardServiceImpl 클래스의 각 메소드 호출 지점.
Pointcut: execution(* com.bit.springboard.service..FreeBoardServiceImpl.*(..))라는 표현식을 통해 정의된 모든 Joinpoint.

 

더 자세히

Joinpoint (조인포인트)
Joinpoint는 프로그램 실행 중에 어드바이스가 적용될 수 있는 특정 지점을 의미합니다. 
이는 AOP의 가장 기본적인 개념 중 하나입니다.

예시:

메소드 호출
메소드 실행
생성자 호출
필드 접근
즉, 프로그램 실행 중에 발생할 수 있는 다양한 이벤트들이 모두 Joinpoint가 될 수 있습니다.

Pointcut (포인트컷)
Pointcut은 특정 Joinpoint들을 선택하는 규칙이나 조건을 정의하는 것입니다. 
Pointcut은 AOP에서 어떤 Joinpoint에 어드바이스를 적용할지를 결정하는 역할을 합니다.

예시:

execution(* com.example.service..*.*(..)): com.example.service 패키지 내의 모든 메소드 호출.
within(com.example.service.*): com.example.service 패키지 내의 모든 클래스.
Pointcut은 특정 패턴을 통해 여러 Joinpoint를 선택할 수 있습니다.

차이점 요약
Joinpoint는 어드바이스가 적용될 수 있는 실제 실행 지점입니다.
Pointcut은 어떤 Joinpoint에 어드바이스를 적용할지를 정의하는 규칙이나 표현식입니다.
예제 설명

xml


<aop:config>
    <!-- aop:pointcut 공통적인 기능이 실행될 클래스와 메소드를 지정한다. -->
    <aop:pointcut id="allpointcut" expression="execution(* com.bit.springboard.service..FreeBoardServiceImpl.*(..))"/>
    <!-- aop:aspect 공통 기능의 메소드와 실행될 메소드를 매핑하는 작업 -->
    <aop:aspect ref="afterReturning">
        <aop:after-returning method="afterReturningLog" pointcut-ref="allpointcut" returning="returnObj"/>
    </aop:aspect>
</aop:config>

Joinpoint:

FreeBoardServiceImpl 클래스의 모든 메소드 호출 지점이 Joinpoint가 됩니다.
예를 들어, FreeBoardServiceImpl 클래스에 createPost(), deletePost()라는 메소드가 있다면, 
이 메소드들이 호출되는 순간이 각각의 Joinpoint가 됩니다.

Pointcut:

<aop:pointcut id="allpointcut" 
expression="execution(* com.bit.springboard.service..FreeBoardServiceImpl.*(..))"/>
이 Pointcut은 com.bit.springboard.service 패키지 내의 
FreeBoardServiceImpl 클래스의 모든 메소드 호출을 선택합니다.
이 Pointcut은 여러 Joinpoint를 포함할 수 있습니다. 
예를 들어, createPost(), deletePost() 등의 메소드 호출 지점들이 
모두 이 Pointcut에 포함될 수 있습니다.

결론
Joinpoint는 실제로 어드바이스가 적용되는 실행 지점입니다.
Pointcut은 어떤 Joinpoint에 어드바이스를 적용할지를 결정하는 규칙입니다.

'백엔드 > Spring Framework' 카테고리의 다른 글

템플릿(1) / 공통사항 설정  (0) 2024.07.15
MyBatis  (0) 2024.07.15
트랜잭션 처리  (0) 2024.07.12
JDBC Template  (0) 2024.07.12
AOP(Aspect Oriented Programming) / 관점 지향 프로그래밍 / JoinPoiont 인터페이스  (0) 2024.07.11