본문 바로가기
Programming/Spring

스프링 프레임워크 기초: AOP(관점지향 프로그래밍)

by vita12321 2023. 7. 30.
728x90
반응형

관점지향 프로그래밍(Aspect-Oriented Programming, AOP) 스프링 프레임워크의 중요한 기능 하나로, 코드 재사용과 모듈화를 개선하기 위한 기술입니다. 글에서는 AOP 개념, 필요성, 그리고 스프링 프레임워크에서 AOP 구현 방법을 자세하게 알아보겠습니다.


 

1. AOP 개념 필요성

 

AOP 객체지향 프로그래밍(OOP) 한계를 극복하고자 '관점'이라는 모듈을 통해 교차 관심사(Cross-cutting Concerns) 분리하는 패러다임입니다. AOP 적용하면 다음과 같은 이점을 얻을 있습니다.

 

  • 코드 재사용성 향상
    공통 로직을 Aspect(관점)에 구현하여 여러 클래스 또는 메서드에서 쉽게 재사용할 수 있습니다.

  • 모듈화 및 관심사 분리
    교차 관심사를 별도의 Aspect로 분리함으로써 비즈니스 로직과 기술 구현의 분리가 가능합니다. 이렇게 하면 코드 가독성과 유지 관리의 용이성이 향상됩니다.

  • 비즈니스 로직과 기술적 관심사 분리
    AOP를 통해 비즈니스 로직에만 집중 할 수 있으며, 성능 최적화, 로깅, 트랜잭션 처리와 같은 기술적 관심사를 Aspect에서 처리할 수 있습니다.

 

2. AOP 주요 용어 개념

 

AOP 이해하고 구현하기 위해 다음과 같은 주요 용어와 개념을 알아야 합니다.

 

  • Aspect(관점)
    특정한 관심사의 코드 모듈입니다. 공통 기능을 정의하며 스프링 프레임워크에서는 빈(Bean)으로 등록됩니다.

  • Joinpoint(조인포인트)
    프로그램 실행 중 Aspect가 적용될 수 있는 지점입니다. 메소드 호출이나 예외 처리와 같은 실행 시점을 의미합니다.

  • Pointcut(포인트컷)
    포인트컷은 어느 조인포인트에서 Aspect가 적용되는지 결정하는 표현식입니다.

  • Advice(어드바이스)
    포인트컷에 정의된 조인포인트에서 실행되어야 하는 실제 코드로 공통 기능의 구현체입니다. 스프링에서 제공하는 주요 Advice 종류로는 Before, After, Around, AfterReturning, AfterThrowing이 있습니다.

 

3. 스프링 프레임워크에서 AOP 구현하기

 

스프링 프레임워크에서 AOP 구현하는 가지 방법이 있습니다.

 

  • 스프링 AOP를 사용하여 프록시 기반의 AOP 구현

  •  AspectJ를 사용하여 명시적 AOP 구현

 

3.1 스프링 AOP 사용한 구현

 

스프링 AOP 스프링 프레임워크에 포함된 프록시 기반의 AOP 구현체로, 자바 프록시와 CGLIB 기반으로 동작합니다. 스프링 AOP 사용한 구현 예시는 다음과 같습니다.

@Configuration

@EnableAspectJAutoProxy // AOP 프록시 활성화

public class AppConfig {

    @Bean

    public MyAspect myAspect() {

        return new MyAspect();

    }

}

 

@Aspect

public class MyAspect {

    @Before("execution(* com.example.service.UserService.*(..))")

    public void logBefore(JoinPoint joinPoint) {

        System.out.println("Method call: " + joinPoint.getSignature().getName());

    }

}


3.2 AspectJ
사용한 구현

 

AspectJ 관점지향 프로그래밍을 지원하는 자바 확장 프레임워크로, 별도의 도구와 컴파일러가 필요합니다. AspectJ 사용하여 AOP 구현하는 예시는 아래와 같습니다.

xml

<!-- pom.xml에 AspectJ 라이브러리 추가 -->

<dependency>

  <groupId>org.aspectj</groupId>

  <artifactId>aspectjweaver</artifactId>

  <version>1.9.7</version>

</dependency>

 

@Aspect

public class MyAspect {

    @Pointcut("execution(* com.example.service.UserService.*(..))")

    public void userServiceMethods() {}

 

    @Before("userServiceMethods()")

    public void logBefore(JoinPoint joinPoint) {

        System.out.println("Method call: " + joinPoint.getSignature().getName());

    }

}


4. AOP
예시: 로깅

 

아래는 스프링 프레임워크에서 AOP 사용하여 로깅을 구현한 예시입니다.

@Aspect

@Component

public class LoggingAspect {

    @Pointcut("within(com.example.service.*)")

    public void allServiceMethods() {} // 모든 service 패키지 내의 메서드를 포인트컷으로 설정

 

    @Around("allServiceMethods()")

    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {

        long startTime = System.currentTimeMillis();

        Object result = joinPoint.proceed(); // 실제 메서드 실행

        long elapsedTime = System.currentTimeMillis() - startTime;

        System.out.println("Method " + joinPoint.getSignature().getName() + " executed in " + elapsedTime + "ms");

        return result;

    }

}

 

이처럼, 스프링 프레임워크의 외부 자원 처리 기능을 활용하면 유연하게 다양한 위치에서 자원을 불러와서 작업을 수행할 있습니다. 이를 통해 효율적인 개발 환경을 구축할 있게 됩니다. 결과적으로 코드의 재사용성과 모듈화가 향상되며 유지 보수가 용이해집니다.

728x90
반응형