KKanging

자바 개발자가 AOP를 공부 해야하는 이유 본문

백엔드/아키텍처 & 패러다임 & 디자인 패턴

자바 개발자가 AOP를 공부 해야하는 이유

천방지축 개발자 2024. 9. 26. 23:53

자바 개발자가 AOP를 공부 해야하는 이유

관점 지향 프로그래밍 기법이란

핵심 기능과 부가 기능

우리가 개발할 때를 생각해보자

도메인 로직을 개발할 때 보면 항상 “도메인 로직만” 개발할 수 있을까?

컴포넌트 로깅을 위해 모든 메서드에 로그를 찍는다거나

DB와 트랜잭션을 연결하기 위해 트랜잭션 connection 을 한다던가 하는

일련의 핵심기능을 위해 해야하거나 부가적인 필요 때문에 해야하는 부가기능 로직이 항상 들어가게 된다.

  • 핵심 기능 : 해당 객체가 제공하는 고유의 기능
  • 부가 기능 : 핵심 기능을 보조하기 위해 제공되는 기능 ( ex: 로그 추적 기능, 트랜잭션 기능 )

이러한 부가 기능을 바로 횡단 관심사라고 한다.

객체 지향 프로그래밍으로 어느 정도 SRP를 따르면서 클래스의 책임을 분리할 순 있어도 도메인 로직에 부가기능에 대한 의존도는 완전히 없엘 수는 없다.

그래서 등장한게 AOP, 관점 지향 프로그래밍이다.

AOP ( 관점 지향 프로그래밍) 이란 무엇일까

AOP의 핵심은 관점이다.

핵심기능 과 부가기능 을 각각 하나의 관점으로 보고 관점을 모듈화하는 기법이다.

관심사를 분리하여 각각의 모듈의 의존도를 낮출 수 있다.

AOP 관련 용어

  • Aspect : 흩어진 관심사를 모듈화 한 것.
  • Target : Aspect를 적용하는 곳. 클래스, 메서드 등..
  • Advice : 실질적으로 어떤 일을 해야 할 지에 대한 것, 실질적인 부가기능을 담은 구현체
  • Join Point : Advice가 적용될 위치 혹은 끼어들 수 있는 시점. 메서드 진입 시점, 생성자 호줄 시점, 필드에서 꺼내올 시점 등 끼어들 시점을 의미. 참고로 스프링에서 Join Point는 언제나 메서드 실행 시점을 의미 한다.
  • Point Cut : Join Point의 상세한 스펙을 정의한 것. "A란 메서드의 진입 시점에 호출할 것"처럼 구체적으로 Advice가 실행될 시점을 정함.

어떻게 구현하는데?

AOP는 대충 글로만 보면 어떤 의미인지 알거 같다.

그럼 어떻게 흩어진 관심사를 클래스 간에 의존도 없이 모을 수 있을까

여기에는 BCI 기법과 같은 바이트 코드 조작 기술이나 프록시 기법을 사용할 수 있다(프록시 또한 BCI를 사용할 수 있다)

어떤 기법을 적용할지는 각 상황과 도메인에 따라 다를 수 있으며 적용하는 시점에 차이가 있다.

 


BCI란 바이트 코드 조작 (Byte Code Instrument) 기술의 약자이다.

해당 기술은 우리가 작성한 자바 파일에 바이트 코드를 조작하는 기법을 의미한다.

 

AOP 적용 시점

  1. 컴파일 타임 적용
  2. 로드 타임 적용
  3. 런타임 적용

굳이 AOP를 사용해야하나?

글쓴이는 자바기반의 Spring 을 공부하는 개발자이다.

Spring 공부하는 초기에 AOP의 기능의 존재는 알고 있었지만 공부할려고도 안했고, 사용을 해야할 필요성을 몰랐다.

하지만 여러 프로젝트를 경험하고 많은 사람들과 협업했을 때 항상 결합도 높은 관심사는 프로젝트 유지보수 관점에서 항상 어려움을 느꼈다.

또한 새로운 기능을 개발한다고 하더라도 부가기능을 의존하는 로직을 또 반복적으로 생성하고 의존했다.

처음에는 로깅 같은 가벼운 작업도 AOP를 공부하기도 귀찮고 제대로 공부도 안했어서 그냥 핵심기능과 같이 구현하였다. 이러한 기술 부채는 쌓여서 나중에는 채무를 갚느라 몇일을 낭비하였다.

이런 반복적인 유지보수와 기능 개발을 하면서 핵심기능과 부가기능의 모듈화의 필요성을 느끼게 되었다.