DI 와 AOP 는 역함수의 관계

kitty·2021년 12월 7일
1

스프링에선 DI (Dependency Injection)를 먼저 설명한 이후에 AOP 를 연이어 설명합니다. 이유는 AOP의 동작원리도 DI스럽게 이루어지기 때문이기도 하지만.. 실은 속성주입과 타겟주입에 대한 개념 차이를 나타내기 위해서예요.

타겟에 속성을 주입한다 (DI)

DI는 타겟이라는 역할에 속성이라는 역할을 외래에서 주입하는 것을 의미합니다. 주입하는 형식은 컨테이너를 이용해 동적으로 대입하거나, 팩토리나 서비스 로케이터 같은 Create and Wiring 를 위해서만 존재하는 오브젝트를 별도로 만들어 이용하는 전략이 일반적입니다. 이 때 타겟은 속성에 '의존한다'라고 말하며, 속성은 타겟의 기능에 협력하게 됩니다.

스프링은 컨테이너를 이용하여 DI를 하며, 컨테이너를 제공하지 않는 생태계인 경우엔 각 언어의 코어가 가진 리플렉션등을 활용하여 서비스 로케이터 패턴 등을 꾸미거나, 여의치 않을 땐 정적팩토리 등을 사용하여 DI를 흉내낼 수 있습니다. 이 경우 팩토리는 철저히 상수화되어 변하지 않으며 움직이지 않아야 합니다.

결론적으로 DI를 함수로 표현하면 '타겟에 속성을 주입하는 함수 f' 라고 말할 수 있어욤. 그런데 주입하는 속성값이 해당 타겟이 아닌 다른 타겟에도 주입될 수 있고 그런 빈도가 많거나, 또는 해당 타겟과 반드시 연결하지 않고 필요한 경우에만 프록시를 통해 붙일 경우엔... 지금까지의 DI의 방향과 반대로 '타겟을 속성에 주입'하는 개념이 생겨나게 됩니다. DOM과 CODOM이 서로간에 역할이 교환된거죠.

속성에 타겟을 주입한다 (AOP)

다양한 타겟에 공통적으로 주입될 수 있는 속성이거나, 속성의 성질이 해당 타겟과 연관성이 떨어져 필요한 경우에만 프록시를 통해 들어가면 충분할때.. 컨테이너는 이번엔 오히려 이런 속성이 필요한 타겟들을 모아, 속성에 주입해버리는데 이것을 AOP라고 합니다. 타겟이 속성을 갖는 것이 아니라, 속성이 타겟을 갖는 그림으로 만들어버리는거예요. 이점을 함수로 보면 '속성에 타겟을 주입하는 함수 g' 라고 착안할 수 있습니다.

따라서 g는 f의 역함수 f⁻¹이 되며, 이점에 따라 DI의 역함수는 AOP라는 성질이 성립하게 됩니다. 주입할 속성이 크로스커팅의 성질을 가져 산재할땐, 속성을 오히려 DOM으로 인식하여 고정시키고 타겟들을 주입받는 방법으로 산재하는 속성 문제를 해결하는 패턴인 AOP는 이런 수학의 역연산 사고를 통해 기존의 연산으로 해결하기 난해했던 문제를 풀어버린 경우에 해당합니다.

profile
금손 꿈나무

2개의 댓글

comment-user-thumbnail
2022년 2월 2일

깔끔한 설명이네요. 😊

1개의 답글