🍳

초보 개발자의 일상

자료 모음

AOP 관련 내용과 예시 - chat gpt

dev.jelee 2024. 11. 25. 11:52

AOP (Aspect-Oriented Programming)란?

AOP는 관점 지향 프로그래밍이라고 하며, 주로 공통적인 관심사(cross-cutting concerns)를 분리하여 코드의 유지보수성을 높이고, 코드 중복을 줄여주는 프로그래밍 기법입니다.

AOP의 핵심 개념은 핵심 로직(비즈니스 로직)과 공통 기능(로깅, 트랜잭션 관리 등)을 분리하여, 공통 기능을 재사용 가능한 "aspect"로 정의하는 것입니다.

AOP의 주요 구성 요소:

  • Aspect: 공통적으로 처리해야 할 관심사를 모은 모듈. 예: 로깅, 보안, 트랜잭션.
  • Join Point: 코드 내에서 AOP가 적용될 수 있는 지점. 예를 들어, 메소드 호출, 메소드 실행 전후, 예외 발생 시 등이 될 수 있습니다.
  • Advice: 실제로 적용될 행동. 예를 들어, 메소드 실행 전에 로그를 찍거나, 메소드 실행 후에 추가 작업을 하는 등의 동작.
  • Pointcut: Advice가 적용될 Join Point를 정의하는 표현식.
  • Weaving: AOP를 실제 코드에 적용하는 과정. 이는 컴파일 시점, 로딩 시점 또는 실행 시점에 이루어질 수 있습니다.

AOP 예시 3가지

1. 로깅 (Logging)

  • 문제: 애플리케이션의 각 메소드에 로깅을 추가하려면 매번 로깅 코드를 작성해야 합니다. 이렇게 하면 코드 중복이 발생하고, 유지보수가 어려워집니다.
  • 해결: AOP를 사용하여 메소드 호출 시 자동으로 로깅이 이루어지도록 합니다.

예시:

@Aspect
@Component
public class LoggingAspect {

    // 모든 메소드 실행 전에 로깅을 찍는다
    @Before("execution(* com.example.service.*.*(..))")
    public void logBefore(JoinPoint joinPoint) {
        System.out.println("Calling method: " + joinPoint.getSignature().getName());
    }
}

 

설명: 이 코드는 com.example.service 패키지의 모든 메소드가 실행되기 전에 로깅을 출력합니다. @Before는 메소드가 실행되기 전의 advice를 정의합니다.

2. 트랜잭션 관리 (Transaction Management)

  • 문제: 데이터베이스 작업에서 트랜잭션을 수동으로 관리해야 하는 경우, 매번 트랜잭션 시작과 종료 코드를 반복하게 됩니다.
  • 해결: AOP를 사용하여 특정 메소드에서 자동으로 트랜잭션을 시작하고 종료할 수 있습니다.

예시:

@Aspect
@Component
public class TransactionAspect {

    @Around("execution(* com.example.service.*.*(..))")
    public Object manageTransaction(ProceedingJoinPoint joinPoint) throws Throwable {
        // 트랜잭션 시작
        System.out.println("Transaction started");
        try {
            Object result = joinPoint.proceed(); // 메소드 실행
            // 트랜잭션 커밋
            System.out.println("Transaction committed");
            return result;
        } catch (Exception e) {
            // 트랜잭션 롤백
            System.out.println("Transaction rolled back");
            throw e;
        }
    }
}

 

설명: 이 코드는 com.example.service 패키지 내 모든 메소드에 대해 트랜잭션을 자동으로 관리합니다. @Around advice는 메소드 실행 전후에 트랜잭션을 시작하고 끝내는 동작을 처리합니다.

3. 보안 (Security)

  • 문제: 특정 메소드에 접근하기 전에 사용자의 권한을 체크하는 코드를 매번 작성해야 합니다.
  • 해결: AOP를 사용하여 특정 메소드가 실행되기 전에 자동으로 권한을 확인하는 로직을 삽입할 수 있습니다.

예시:

@Aspect
@Component
public class SecurityAspect {

    @Before("execution(* com.example.service.*.*(..)) && @annotation(RequiresPermission)")
    public void checkPermission(JoinPoint joinPoint) {
        // 예시: 사용자가 특정 권한을 가지고 있는지 확인
        if (!userHasPermission()) {
            throw new SecurityException("Permission denied");
        }
    }

    private boolean userHasPermission() {
        // 권한 체크 로직 (간단한 예시)
        return true; // 실제로는 사용자 권한을 확인하는 로직이 필요
    }
}

 

설명: 이 코드는 @RequiresPermission이라는 사용자 정의 애너테이션이 붙은 메소드에 대해 실행되기 전에 권한을 체크합니다. 만약 권한이 없다면, SecurityException을 던져서 접근을 차단합니다.


AOP의 장점

  1. 코드 분리: 공통적인 관심사를 별도의 모듈로 분리하여 핵심 비즈니스 로직이 간결해지고, 코드 중복을 줄일 수 있습니다.
  2. 유지보수성 향상: 로깅, 트랜잭션 관리, 보안 등의 공통 기능을 한 곳에서 관리하므로 수정이 용이하고, 코드의 일관성을 유지할 수 있습니다.
  3. 재사용성: AOP를 사용하면, 공통 기능을 여러 클래스나 메소드에서 재사용할 수 있습니다.

결론

AOP는 코드의 관심사를 분리하고, 공통 기능을 효율적으로 처리할 수 있게 도와주는 강력한 도구입니다. 로깅, 트랜잭션 관리, 보안 등 다양한 기능을 AOP를 통해 간결하게 구현할 수 있습니다. 이를 통해 코드의 유지보수성재사용성을 크게 향상시킬 수 있습니다.