AOP - 2

Posted by sJun on December 04, 2020 ·

AOP의 약자는 Aspect Oriented Programming의 약자로써 한글로 직역하면

관점 지향 프로그래밍이다.

AOP를 이해하기 위해서는 핵심 기능과 부가 기능을 각각 모듈화 시키는 것에 대해서 알아야 한다.

핵심 기능과 부가 기능을 모듈화 할 때, 핵심 기능은 그 자체로 동작하는 기능이기 때문에 모듈화가 매우 쉽다.

하지만 부가 기능의 경우는 OOP의 기술만으로는 완벽하게 깔끔한 모듈화를 만들어내기란 불가능하다.

왜 그럴까?

부가 기능 은 항상 핵심 기능의 코드가 동작할 때 같이 동작해야한다. 여기서 부가 기능이란 각 핵심 기능의 시간을 재는 것으로 부터 트랜잭션 경계 설정 까지 매우 다양하다.

핵심 기능의 동작 이전에 항상 부가 기능을 동작 시키기 위해서는 클라이언트의 요청을 바로 핵심 기능의 클래스로 보내는 것이 아니라 중간에 그 요청을 가로채야하는데, 이러한 요청을 가로채는 대리자를 프록시라고 부른다.

이제 개발자는 프록시를 통해 부가 기능을 따로 분리해도 핵심 기능 클래스를 호출했을 때 부가 기능을 가진 프록시를 호출함으로써 동시에 실행되도록 만들었다.

다만 여기서 부가 기능을 사용하기 위해 적용 대상이 되는 빈마다 일일이 프록시 팩토리 빈을 설정해줘야한다는 부담이 생긴다.

핵심 기능을 가진 클래스가 몇천개, 몇만개가 넘어가면 그 갯수만큼의 핵심 기능의 클래스에 들어가 프록시 빈을 설정해줘야 한다는 뜻이다.

이를 해결하기 위해서는 스프링 컨테이너의 빈 생성 후 처리 기법을 활용해 컨테이너 초기화 시점에서 자동으로 프록시를 만들어주면 된다.

여기서 포인트 컷 이라는 용어가 나온다.

포인트 컷을 사용하면 프록시 대상을 일일이 지정하지 않고 패턴을 이용해 자동으로 선정이 가능하다. 즉 이 포인트 컷은 클래스를 선정하는 기능을 담고 있다.

최종적으로 개발자는 이런 프록시와 포인트 컷을 결합해 핵심 기능 코드와 부가 기능 코드를 낮은 결합도로 모듈화 시킬 수 있고, 기능의 추가와 삭제의 유지보수 측면에서도 굉장히 편해졌다.

부가기능은 전통적인 OOP의 설계 방법으로는 독립적인 모듈화가 불가능하다. 그래서 이러한 부가기능의 모듈은 기존의 OOP 설계 패러다임과는 다르기 때문에 다른 이름을 지어준 것인데 부가 기능이 담긴 모듈을 Aspect 라고 부르기 시작했고 여기서 AOP가 탄생하게 되었다.

위의 글을 읽으면 AOP에 여러가지 용어를 더 잘 이해할 수 있다.

대표적으로 Advice는 타깃(핵심 기능을 가진 오브젝트) 에게 제공할 부가기능을 담은 모듈이다.

JoinPoint는 Advice가 적용될 수 있는 위치를 말하고 Pointcut은 이런 JoinPoint를 “선별”하는 작업을 정의하는 모듈을 뜻한다.

어드바이저는 하나의 포인트 컷과 하나의 어드바이스를 가지고 있는 오브젝트이다. 즉 어떤 부가기능(Advice)를 어디에(Pointcut) 전달 할 것인가를 알고 있는 모듈이다.

Aspect AOP의 기본 모듈로써 하나 이상의 포인트 컷과 어드바이스의 조합으로 만들어진다. 앞에서 설명한 어드바이저는 가장 단순한 Aspect라고 볼 수 있다.