memostack
article thumbnail
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형

AOP

AOP는 Aspect Oriented Programming의 약자로, 번역하면 관점 지향 프로그래밍이다.

 

AOP

AOP는 주 비지니스 로직 앞, 뒤로 부가적인 기능을 추가하고 싶을때 사용하는데

  • 예를들어, 로그처리, 보안처리, DB 트랜잭션 처리 등이 있다

 

관점을 횡단으로 바꿔서 바라보는 것을 횡단 관심 사항이라 하며,

부가적인 로직을 Cross Cutting Concern, 주 비즈니스 로직을 Core Concern 이라 한다.

 

AOP를 사용하는 이유?

  • 코드의 중복을 줄일 수 있다.
  • 주 업무 로직과 부가적인 로직을 분리할 수 있다.

 

Java로 AOP 구현

AOP는 디자인 패턴 중 프록시 패턴(Proxy Pattern)을 이용해서 구현할 수 있다.

  • 스프링에서는 어노테이션으로 더 쉽게 구현할 수 있음

 

성능 측정을 위해 아래와 같이 코드를 작성했다고 하면, 비즈니스 로직과 부가적인 로직이 구분없이 함께 구현이 된다.

public interface CoreConcern {
    int coreLogic(int totalCount);
}

public class CoreConcernImpl implements CoreConcern {

    @Override
    public int coreLogic(int totalCount) {
        System.out.println("비즈니스 로직 실행");

        int count = 0;
        for(int i=0; i<totalCount; i++)
            count++;

        return count;
    }

}

// ...

@Test
@DisplayName("AOP 테스트")
void aopTest() {
    // 부가적인 로직 ------------
    StopWatch sw = new StopWatch();
    sw.start();
    // -----------------------

    // 비즈니스 로직 -----------
    CoreConcern coreConcern = new CoreConcern();
    int result = coreConcern.coreLogic(10000);
    // -----------------------

    // 부가적인 로직 ------------
    sw.stop();
    System.out.println("소요 시간: " + sw.getTotalTimeSeconds());
    // -----------------------
}

 

위 코드를 AOP로 구현해보자

  • 구현하기 위해 Proxy 패턴을 이용한다.
  • Java에는 Proxy.newProxyInstance로 프록시를 생성할 수 있다
@Test
@DisplayName("AOP 테스트 2")
void aopTest2() {
    CoreConcern coreConcern = new CoreConcernImpl();

    CoreConcern proxyCoreConcern = (CoreConcern) Proxy.newProxyInstance(
            CoreConcernImpl.class.getClassLoader(),
            new Class[]{CoreConcern.class},
            // 앞, 뒤 부가로직 구현
            new InvocationHandler() {
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    // 부가적인 로직 ------------
                    StopWatch sw = new StopWatch();
                    sw.start();
                    // -----------------------

                    int result = (int) method.invoke(coreConcern, args);

                    // 부가적인 로직 ------------
                    sw.stop();
                    System.out.println("소요 시간: " + sw.getTotalTimeSeconds());
                    // -----------------------

                    return result;
                }
            }
    );

    // 실행
    // - 비즈니스 로직을 실행하면, 프록시 패턴에 의해 앞뒤로 부가기능이 실행된다.
    // - 부가기능을 제거하거나 내용을 변경하면서 일괄적으로 적용된다
    proxyCoreConcern.coreLogic(1000);
    proxyCoreConcern.coreLogic(2000);
    proxyCoreConcern.coreLogic(3000);
}
비즈니스 로직 실행
소요 시간: 7.53E-5
비즈니스 로직 실행
소요 시간: 3.77E-5
비즈니스 로직 실행
소요 시간: 3.98E-5

 

Spring Boot에서 AOP 구현은 아래 글 참고

2021.03.11 - [Spring/Spring Boot] - Spring Boot에서 AOP 구현 (Aspect Oriented Programming)

 

Spring Boot에서 AOP 구현 (Aspect Oriented Programming)

AOP 구현 AOP 개념은 아래 글 참고 2021.03.11 - [Spring] - Spring의 AOP 개념 (Aspect Oriented Programming) Spring의 AOP (Aspect Oriented Programming) AOP AOP는 Aspect Oriented Programming 의 약자로,..

memostack.tistory.com

 

다른 글

2021.03.10 - [Spring] - Spring의 DI 개념 (Dependency Injection)

 

Spring의 DI 개념 (Dependency Injection)

객체를 생성하는 2가지 방법 객체를 생성하는 방법에는 2가지가 방법이 있다. 필요한 곳에 직접 생성하는 방법 외부에서 미리 생성해두고 필요한 곳에 할당(주입)하는 방법 위 그림은 직접 객체

memostack.tistory.com

2021.03.10 - [Spring] - Spring의 IoC 컨테이너 (Inversion of Control)

 

Spring의 IoC 컨테이너 (Inversion of Control)

IoC (Inversion of Control) IoC는 Inversion of Control 의 약자로 한국어로 번역하는 '제어의 반전' 이라는 뜻을 가짐 재사용 라이브러리의 흐름이 반대라고 말할 수 있음 내용을 살펴보기 전에 DI(Dependency I..

memostack.tistory.com

 

반응형
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
profile

memostack

@bluemiv_mm

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!