1. 소개

이 예제에서는 Spring과 함께 AOP (Aspect Oriented Programming)를 소개하고 실제 시나리오에서이 강력한 도구를 사용하는 방법을 이해하기 시작합니다.

Spring AOP를 사용하여 개발할 때 AspectJ의 어노테이션 을 활용할 수도 있지만이 기사에서는 핵심 Spring AOP XML 기반 구성에 초점을 맞추고 있습니다.

2. 개요

AOP는 교차 우려 사항을 분리하여 모듈화를 높이는 것을 목표로하는 프로그래밍 패러다임입니다. 코드 자체를 수정하지 않고 기존 코드에 추가 동작을 추가하여이를 수행합니다.

대신이 새 코드와 이러한 새 동작을 별도로 선언 할 수 있습니다.

Spring의 AOP 프레임 워크 는 이러한 교차 문제를 구현하는 데 도움이됩니다.

3. Maven 의존성

pom.xml 에 Spring의 AOP 라이브러리 의존성을 추가하여 시작하겠습니다 .

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.4.0</version>
</parent>
 
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

최신 버전의 의존성은 여기에서 확인할 수 있습니다 .

4. AOP 개념 및 용어

AOP와 관련된 개념과 용어에 대해 간단히 살펴 보겠습니다.

4.1. 비즈니스 객체

비즈니스 오브젝트는 일반 비즈니스 로직이있는 일반 클래스입니다. 두 개의 숫자 만 추가하는 비즈니스 객체의 간단한 예를 살펴 보겠습니다.

public class SampleAdder {
    public int add(int a, int b) {
        return a + b;
    }
}

이 클래스는 비즈니스 로직이 있고 Spring 관련 어노테이션이없는 일반 클래스입니다.

4.2. Aspect

측면은 여러 클래스에 걸쳐있는 관심사의 모듈화입니다. 통합 로깅은 이러한 교차 문제의 예가 될 수 있습니다.

간단한 Aspect를 정의하는 방법을 살펴 보겠습니다.

public class AdderAfterReturnAspect {
    private Logger logger = LoggerFactory.getLogger(this.getClass());
    public void afterReturn(Object returnValue) throws Throwable {
        logger.info("value return was {}",  returnValue);
    }
}

위의 예에서 우리는 Object 유형의 하나의 인수를 취하는 afterReturn 이라는 메소드가있는 간단한 Java 클래스를 정의 했으며 해당 값만 로그인합니다. AdderAfterReturnAspect 조차도 Spring 어노테이션이없는 표준 클래스입니다.

다음 섹션에서는이 Aspect를 Business Object에 연결하는 방법을 살펴 보겠습니다.

4.3. Joinpoint

joinpoint를는 이러한 방법의 실행 또는 예외 처리 등의 프로그램의 실행시의 포인트이다.

Spring AOP에서 JoinPoint는 항상 메소드 실행을 나타냅니다.

4.4. 포인트 컷

Pointcut은 특정 JoinPoint 에서 Aspect 가 적용 Advice일치시키는 데 도움이되는 술어입니다 .

Advice는 종종 Pointcut 표현식과 연관되어 있으며 Pointcut일치하는 모든 Joinpoint 에서 실행됩니다 .

4.5. Advice

조언은 특정 Joinpoint 에서 측면이 취한 조치 입니다. 다양한 유형의 조언에는 "주변", "이전""후" 조언이 포함됩니다.

Spring에서 AdviceJoinpoint 주위에 인터셉터 체인을 유지하는 인터셉터로 모델링됩니다 .

4.6. 비즈니스 객체 및 측면 연결

After-Returning 조언을 사용하여 비즈니스 객체를 Aspect에 연결하는 방법을 살펴 보겠습니다.

다음은 "<beans>" 태그 의 표준 Spring 구성에 배치 한 구성 발췌 부분입니다 .

<bean id="sampleAdder" class="org.baeldung.logger.SampleAdder" />
<bean id="doAfterReturningAspect" 
  class="org.baeldung.logger.AdderAfterReturnAspect" />
<aop:config>
    <aop:aspect id="aspects" ref="doAfterReturningAspect">
       <aop:pointcut id="pointCutAfterReturning" expression=
         "execution(* org.baeldung.logger.SampleAdder+.*(..))"/>
       <aop:after-returning method="afterReturn"
         returning="returnValue" pointcut-ref="pointCutAfterReturning"/>
    </aop:aspect>
</aop:config>

보시다시피 Business Object의 인스턴스를 나타내는 simpleAdder 라는 간단한 빈을 정의했습니다 . 또한 AdderAfterReturnAspect 라는 Aspect 인스턴스를 생성하고 있습니다.

물론 XML만이 우리의 유일한 옵션은 아닙니다. 앞서 언급했듯이 AspectJ 어노테이션도 완벽하게 지원됩니다.

4.7. 구성 살펴보기

태그 aop : config 는 AOP 관련 구성을 정의하는 데 사용됩니다. config 태그 내에서 측면을 나타내는 클래스를 정의합니다. 우리가 만든 "doAfterReturningAspect" aspect bean에 대한 참조를 제공했습니다 .

다음으로 pointcut 태그를 사용하여 Pointcut을 정의합니다 . 위의 예제에서 사용 된 Pointcut은 execution (* org.baeldung.logger.SampleAdder +. * (..))입니다. 이는 랜덤의 수의 인수를 받아들이고 모든 값 유형을 반환하는 SampleAdder 클래스 내의 모든 메서드에 대한 조언을 적용 함을 의미 합니다.

다음으로 적용 할 조언을 정의합니다. 위의 예에서는 애트리뷰트 메소드를 사용하여 정의한 afterReturn 이라는 메소드를 실행하여 Aspect AdderAfterReturnAspect정의 된 애프터 리턴 어드바이스를 적용 할 것 입니다.

Aspect 내의이 조언은 Object 유형의 하나의 매개 변수를 사용합니다 . 매개 변수는 대상 메소드 호출 전후에 조치를 취할 수있는 기회를 제공합니다. 이 경우 메서드의 반환 값만 기록합니다.

Spring AOP는 어노테이션 기반 구성을 사용하여 여러 조언을 지원합니다 . 여기여기 에서이 예제와 더 많은 예제를 찾을 수 있습니다 .

5. 결론

이 예제에서는 AOP에서 사용되는 개념과 Spring의 AOP 모듈 사용 예제를 설명했습니다. AOP에 대해 더 자세히 알고 싶다면 다음 리소스를 참조하세요.

이러한 예제의 구현은 GitHub 프로젝트 에서 찾을 수 있습니다. 프로젝트 는 Maven 기반 프로젝트이므로 그대로 가져 와서 실행하기 쉬워야합니다.