면접대비

[번역글] AOP는 무엇인가?

코딩하는흑구 2021. 4. 15. 23:03

DZone이라는 사이트에서 번역해서 가져온 글입니다. 간단히 읽어보시고 원문을 읽어보고싶으시면 아래 url로 들어가셔서 바로 보시면 될것 같습니다. 참고문 정도로 보시면 좋겠습니다.

 

원문 : dzone.com/articles/what-is-spring-aop-1

 


 

AOP에 대해서는 자주 논의되지는 않지만 스프링에서 굉장히 많은 부분에 걸쳐서 사용되고 있습니다. 이번 포스팅을 통해서 AOP에 대해서 익숙해지고 현업에서도 활용할 수 있을 것입니다.

여러분은 AOP에 대해서 알고 계신가요?? 혹시 들어보셨다면 현재 진행하고있는 프로젝트에 쓰고 계신가요?? 만약 아니라면 집중해주세요!

 

요즘 스프링부트나 최첨단 프레임워크를 활용해서 진행하는 프로젝트들이 굉장히 많습니다. 한편으로는 매우 잘된일같지만 다른 한편으로는 개발자들이 그보다 앞선 기술을 더 제대로 활용하지는 못해진 것 같아요. 아무래도 전문적인 책이나 레퍼런스들이 이해하기 어렵게 꾸려졌기 때문이라고 생각됩니다. 그래서 필자는 관점 지향 프로그래밍에 대해서 잠시 이야기해보려고 합니다.




관점지향 프로그래밍(Aspect Oriented Programming)이 무엇인가??

관점지향 프로그래밍은 관심사의 분리의 문제를 해결하기 위해 만들어진 프로그래밍 패러다임입니다. 관점지향 프로그래밍(AOP)는 프로그램 구조에 대해 다른 방향성을 제시하면서 객체지향 프로그래밍(OOP)를 보완하고 있습니다.

OOP에서의 핵심 단위는 클래스입니다. 하지만 AOP에서의 핵심단위는 Aspect(관점, 관심) 입니다.

쉽게말하면, 필수적이지만 어쩔 수 없이 반복적으로 사용되는 코드들을 리팩토링할 수 있도록 해줍니다. 이로인해 여러곳에서 사용될만한 코드들이 한 곳에서 유지하고 관리할 수 있는 이점을 가지게 됩니다.

이러한 접근방식은 비즈니스 로직을 분리하여 좀더 쉽게 유지보수할 수 있도록 합니다. 다른 기능들을 다른 관점에 두어 분리하는 것입니다. 관점은 여러 클래스에 흩어져 있는 관심사들의 모듈화입니다. 가장 간단한 예를 들면 트랜잭션처리와 통합로깅 정도가 될 것 같습니다.

 



AOP를 활용하여 코드 단순화하기.

 

- 우선 아래의 코드를 확인하여 예시를 보겠습니다.

public void doSomething() {
    final String METHOD_NAME = "doSomething";
    logger.trace("entering " + CLASS_NAME + "." + METHOD_NAME);
    TransactionStatus tx = transactionManager.getTransaction(new DefaultTransactionDefinition());
    try {
    	// Business Logic
    } catch (RuntimeException ex) {
		logger.error("exception in " + CLASS_NAME + "." + METHOD_NAME, ex);    
        tx.setRollbackOnly();
        throw ex;
    } finally {
    	transactionManager.commit(tx);
        logger.trace("exiting " + CLASS_NAME + "." + METHOD_NAME);
    }
}

여기에는 많은 관심사들이 존재합니다. 해당 관심사들은 비즈니스 로직하고는 전혀 관계가 없는 부분이죠. 이것들을 다른 공간으로 분리할 수 있습니다. 그렇게 되면 오로지 비즈니스 로직만이 남게되죠. 마치 아래처럼요.

public void doSomething() {
    // Business Logic
}

 


거시적으로 AOP가 어떻게 동작하는가??

당신이 만약 프로젝트를 진행하면서 여러가지 패키지와 클래스 구조로 분리하였는데 AOP를 활용하지 않는다면 예를 들어 tracing(흐름 추적), 트랜잭션 처리, 예외 처리 등을 모든 클래스의 메소드에 처리해주어야 할 것입니다.

 

위와 같은 결과는 아래의 두가지 문제점을 내재합니다.

- 코드 꼬임(Code Tangling)

각각의 클래스와 메소드는 tracing, 트랜잭션처리, 예외 처리와 같은 부분을 비즈니스 로직과 함께 처리하게 됩니다. 그러한 경우 마치 스파게티 코드처럼 어느 부분이 실제 메소드의 본질적인 흐름인지 파악하기 어렵게 보입니다.

- 코드 분산(Code Scattering)

트랜잭션과 같은 관심사들이 여러 곳에 각각 독립적으로 존재하며 시스템에서 하나의 공통적인 부분으로 동작하지 않는다.

각각의 Transaction 처리 코드가 여러 클래스에 흩어짐

 

AOP를 활용하는 것은 이러한 문제를 해결해줍니다. 따라서 AOP가 하는 일은 트랜잭션 코드를 가져다가 하나의 트랜잭션 관심사로 몰아 넣는 것입니다. 그러고 나서 Tracing 코드를 가져다가 관심사에 몰아 넣습니다. 그리고 마지막으로 에러 처리 또한 별도의 관심사로 몰아 넣습니다.

 

결국에는 비즈니스 로직과 기타 부수적인 관심사들이 깔끔하게 분리된 프로그램이 만들어지게 됩니다.

관심사 분리를 통해 클래스가 선명해짐

 


 

관심사의 분리

AOP에서 가장 중요한 개념은 관심사의 분리이다. 위에서 간단히 tracing, Exception handling, Trancation 과 같은 관심사의 분리를 보았다. 몇몇의 클래스와 메소드들은 이를 구현해야합니다.

 

고전적인 객체지향 프로그래밍에서는 이러한 부분을 한 곳에서 처리할 수 가 없었습니다. 따라서 코드 분산이나 코드 꼬임과 같은 부분을 피할 수 없었습니다.

 

관점지향 프로그래밍은 하나의 공간에서 이러한 관심사들을 분리하여 실행할 수 있도록 해줍니다. 그래서 AOP를 사용한다면 비즈니스 로직을 먼저 구현한 다음 분리할 관심사들을 하나씩 구현하면 된다.

 

이러한 방법으로 인프라를 구성하면 트랜잭션을 추가하거나 로깅을 추가하기가 쉬워집니다. 그로 인해 당신만의 개인적인 커스텀 미들웨어를 만들수도 있습니다. 당신은 스프링 AOP를 사용하고 어플리케이션에 관심사를 추가하여 런타임시에 비즈니스 로직을 수행하고 각각의 관심사들을 수행하게 됩니다.