AOP - 01. 객체지향과 AOP

Seok-Hyun Lee·2022년 5월 31일
0

AOP

목록 보기
1/3

AOP(Aspect-Oriented Programming)

오늘은 제가 스프링 AOP 를 공부하면서 생각한 것들에 대해서 공유해보려고 해요
일단 AOP는 스프링의 3대 요소 DI, AOP, PSA(Portable Service Abstractions) 중 하나일 정도로 매우 중요한 개념이라고 해요. 그런데 이걸 직역하면 "관점지향 프로그래밍(?)" 이 되는데, 참 모호한 의미죠?

그래서 저는 객체지향을 기반으로 이걸 이해해보려 했습니다.

객체지향

객체지향은 역할과 구현의 구분에서부터 시작합니다.
이때 역할은 추상적인 의미이고 구현은 실체적인 의미를 가지고 있습니다.

예를 들어, 제가 작곡가이고 제가 만든 노래를 부를 가수를 찾고 있습니다.
그러면, 이때의 가수는 저에게 있어 노래를 부를 수 있는 사람이라는 추상적인 개념입니다.
하지만, 이 노래를 부를 가수들은 실제로 노래를 부르는 구체적인 행위를 합니다.

즉, 사용자인 저의 입장에선 "가수"라는 사람(역할)이 필요한 것이고,
"가수"가 직업인 사람들은 이 노래를 불러주는 실체(구현)입니다.

이렇게 역할과 구현을 구분 짓는 이유는,
역할에 맞는 구현체를 여러개를 만들 수 있고,
상황에 맞는 구현체를 역할에 사용할 수 있기 때문입니다.

그럼 여기서 의문이 드는 것은 "여러 구현체" 그리고 "상황"입니다.
이걸 앞의 예시를 통해 설명하자면,
저는 지금 "가수"라는 역할을 해줄 하나의 사람을 찾고 있죠,
그런데 "가수"들은 모두 본연의 스타일(R&B, Pop...)을 가지고 있습니다.
이처럼 모두 똑같이 노래를 부르는 행위를 하지만 다른 특징을 가지고 있죠
그래서 제가 필요에 따라 이 가수 저 가수를 사용할 수 있게 됩니다.

그리고 제가 "R&B 스타일의 가수" 가 필요하다며 역할에 구체적인 특징을 추가한다면,
다른 스타일의 가수들은 지원조차 못하게 되지만 저는 가수를 뽑는데 효율적이겠죠?
하지만, 이 노래가 밝게 부르는 것이 더 좋을 것 같아 POP 스타일의 가수를 뽑고 싶은 상황이 발생해도 이미 지원자들이 모두 R&B 스타일이기 때문에 어찌할 도리가 없는 문제도 발생합니다.

이처럼 역할을 어떻게 설정할 것인지에 따라 사용자는 편리함과 확장성을 얻기도 하지만,
반대로 특정 상황에 강하게 엮여서 유연성이 결여되는 문제
도 있습니다.

그래서 객체지향에서는 역할을 잘 설계하는 것이 중요합니다.

그래서 AOP가 뭔데

앞에 한참 객체지향의 기본 개념에 대해서 얘기를 했는데
그럼 AOP 돌아와서 이게 그래서 어떤 중요한 의미가 있는거야?라고 의문이 드실거에요

그럼 이걸 도표로 한 번 설명해보겠습니다.

자 위의 도표에서 첫번째 객체는 어떤 비즈니스 로직의 역할을 담당하는 구현체인데
매번 비즈니스의 핵심적인 로직을 담당하는 부분 위 아래에 로깅을 하는 코드가 있습니다.

근데, 다양한 비즈니스 로직에 대응하기 위해 많은 객체들이 이와 같은 구조로 되어있다면,
로깅 관련 코드의 중복이 정말 많이 일어나겠죠?

근데 이걸 우측에 있는 도표처럼,
"비즈니스"와 "비즈니스의 로깅" 으로 역할을 나누면 어떻게 될까요?

"비즈니스"만 담당하는 객체는 자신이 해야하는 업무 관련 로직만 가지면 되고
모든 로깅은 "비즈니스의 로깅"을 구현한 객체를 통해서 일어나게 됩니다.

그리고 "비즈니스"와 "로깅"을 변수로 생각해보면 아래와 같이 다양한 관계가 나올 수 있죠

  • "{결제}" / "{결제}의 {예외 처리}"
  • "{구매}" / "{구매}의 {처리 시간 측정}"

이렇게 하면 저희는 개발을 할 때 두 종류의 관점을 가지게 됩니다.

  • 업무
  • 업무 이외 부가 기능(로직, 예외처리 등)

이것이 가지는 장점은 아래와 같아요

  1. 업무 관련된 코드만 집중적으로 개발 가능
  2. 당장의 업무와 관련 없는 코드들은 업무 관련 코드 외부에서 개발
  3. 어떤 업무라도 상황에 맞게 부가 기능 적용 가능

그래서 AOP는

이렇게 객체지향과 함께 AOP 를 알아봤는데 이걸 정리하자면,
AOP란 사용자가 필요로 하는 역할과 이것을 대상으로 부가적인 행위를 하는 역할을 구분 짓는 것이에요

이를 통해 저희는 각 역할이 수행해야 하는 행위들에만 집중해서 개발을 할 수 있는 장점이 생기죠

마무리

지금까지 객체지향을 기반으로 AOP 를 설명하면서 제가 생각한 내용을 공유드렸는데,
여러분들의 생각은 어떤지 궁금하네요 ㅎㅎ 댓글에 달아주세요~

그리고 다음 시간에는,
"그래서 이 AOP 는 어떻게 구현하는거야?"
라는 궁금증을 해소하기 위해 공부하고 공유하도록 하겠습니다!

profile
Arch-ITech

0개의 댓글