AOP(Aspect-Oriented Programming) 이해?

SEUNGJUN·2024년 3월 15일
post-thumbnail

AOP(Aspect-Oriented Programming)는 관점 지향 프로그래밍의 한 형태로, 프로그램을 여러 관점(Aspect)으로 나누어 개발하는 방법론이다. 이는 프로그램의 기능적인 부분과 횡단 관심사(Cross-cutting Concerns)를 분리함으로써 모듈화를 촉진하고 코드 재 사용성을 높이는데 목적을 두고 있다.

관점 지향: 프로그램을 여러 관점(Aspect)으로 나누어서 개발하는 것으로, 각 관점은 프로그램의 특정 부분에 관련된 기능들을 모아둔 것이다. 이를 통해 코드의 구조를 더 명확하게 만들고, 복잡성을 줄여주는 프로그래밍 접근 방식이다.

횡단 관심사: 여러 모듈 또는 객체에 걸쳐 반복적으로 나타나는 기능이나 요구 사항으로, 주로 로깅, 트랜잭션 관리, 성능 모니터링 등이 포함된다. 이런 횡단 관심사는 여러 부분에서 반복적으로 나타날수가 있기에 효율적으로 처리하기 위해 AOP가 사용된다.

로깅: 소프트웨어 시스템이 실행되는 동안 발생하는 이벤트나 정보를 기록하는 프로세스를 말한다. 이러한 정보들은 후에 시스템의 동작 분석, 디버깅, 오류 추적 등 다양한 목적으로 사용된다.

<로깅을 AOP로 구현하는 예시>

<Aspect 정의하기>

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.After;

@Aspect
public class MethodExecutionTimeAspect {

    @Before("execution(* com.example.service.*.*(..))")
    public void beforeMethodExecution() {
        System.out.println("Method execution started.");
    }

    @After("execution(* com.example.service.*.*(..))")
    public void afterMethodExecution() {
        System.out.println("Method execution completed.");
    }
}

위의 Aspect는 com.example.service 패키지 내의 모든 메소드 실행 전후에 메시지를 출력한다.
@Aspect: 어노테이션은 AspectJ 프레임워크에서 사용되는 어노테이션으로, 해당 클래스가 Aspect로 사용됨을 선언한다. @Before, @After에 Advice(조언)를 정의할때 사용된다.
Advice: 특정 지점에 실행되는 코드
execution(* com.example.service.*.*(..)): com.example.service 패키지 내의 모든 메소드 호출을 지정하는 Pointcut(지점)이다.
@Before: 메소드 실행전
@After: 메소드 실행후

<사용 예시>

package com.example.service;

public class MyService {

    public void doSomething() {
        System.out.println("Doing something...");
    }

    public void doSomethingElse() {
        System.out.println("Doing something else...");
    }
}
package com.example;

import com.example.service.MyService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Main {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(MethodExecutionTimeAspect.class);
        context.refresh();

        MyService service = context.getBean(MyService.class);
        service.doSomething();
        service.doSomethingElse();

        context.close();
    }
}

위의 예시에서 MyService 클래스에는 어떠한 Aspect 관련 코드도 들어가지 않는다. 하지만 Aspect를 정의한 MethodExcutionTimeAspect가 실행됨으로써 모든 메소드 호출에 대한 실행 시간을 측정하는 기능이 추가 되었다.

<실행결과>

Method execution started.
Doing something...
Method execution completed.
Method execution started.
Doing something else...
Method execution completed.

각 메소드 호출 전후에 Aspect에서 정의한 Advice가 실행되어 메소드의 실행 시간을 로깅하는 것을 볼수 있다.

AOP가 사용되는 예시

1. 로깅(Logging): 메소드 실행 시간, 메소드 호출 정보, 오류 로깅 등과 같은 로깅 요구사항을 처리할수 있다.

2. 트랜잭션 관리(Transaction Management): 데이터베이스 트랜잭션의 시작과 종료를 관점 지향적으로 처리하여 트랜잭션 관리를 단순화 할수 있다.

3. 보안(Security): 인증, 권한 부여, 암호화 등의 보안 관련 기능을 AOP를 사용하여 애플리케이션의 여러 지점에서 효율적으로 관리할수 있다.

4. 캐싱(Caching): 캐시 기능을 관점 지향적으로 적용하여 메소드의 실행 결과를 저장하고 재사용 할수 있다.

5. 예외 처리(Exception Handling): 예외 발생 시 로깅하거나 특정 동작을 수행하는 등의 예외 처리 로직을 AOP를 사용하여 중아에서 관리할 수 있다.

6. 성능 모니터링(Performance Monitoring): 메소드 실행 시간, 메모리 사용량 등의 성능 지표를 모니터링하고 분석 할수 있다.

이렇게 AOP의 이점은 코드의 재사용성을 높이고, 유지보수성을 향상시키며, 가독성을 향상 시킨다. 따라서 많은 프로젝트에서 AOP를 적극적으로 활용한다.

profile
RECORD DEVELOPER

0개의 댓글