관점지향 프로그래밍(AOP) vs 객체지향 프로그래밍(OOP)

Woojin·2022년 12월 17일
0

관점지향프로그래밍(AOP; Aspect-oriented Programming)은 관점(Aspect)에 따라 핵심 기능과 부가 기능을 분리하고, 그렇게 분리한 부가기능의 적용처를 선택하는 기능을 만드는 방식이다.

이와 같이 봐야 하는 개념은 객체지향 프로그래밍(OOP; Object-oriented Programming)이다. 공통의 목적이 있는 데이터와 동작을 묶어서 하나의 객체로 정의하는 것이다. 객체를 적극적으로 활용함으로써 기능을 재사용할 수 있는 것이 가장 큰 장점이다. 여기서 말하는 객체를 잘 활용하기 위해서는 관심사 분리(SoC; Seperation of Concerns)의 디자인 원칙을 준수해야 한다. Spring MVC에서는 @Controller, @Service, @Repository와 같이 관심사별로 계층을 나눠 객체를 관리하게 된다. 이 관심사의 분리는 모듈화의 핵심이 된다.

객체지향 프로그래밍은 많은 장점이 있지만 한계점이 있다. 특정 관심사 업무 코드에 트랜잭션, 로깅, 보안 등은 필수적인 부가기능이기 때문에 업무 기능과는 상관 없지만 각 클래스에 중복 코드가 존재하게 된다. 관심사 관점에서는 이런 코드들을 횡단관심사(부가기능)이라고 한다. 반대로 업무 관련 코드는 핵심 관심사/기능이라고 한다. 비즈니스 클래스에는 횡단 관심사와 핵심 관심사가 공존하게 된다.

OOP만으로는 횡단 관심사 코드를 핵심 기능과 깔끔하게 분리하기 어려웠고, 이런 관심사 분리적 한계를 해결하기 위해 AOP가 등장했다. AOP는 기존과 다른 프로그램 구조 사고방식을 제공함으로써 OOP의 부족한 부분을 보완한다.
OOP 모듈화의 핵심 단위는 클래스이고, AOP 모듈화의 핵심 단위는 관점이라는 차이점이 있다.

AOP의 핵심 기능과 부가 기능

  • 핵심 기능 (Core Concerns) : 객체가 제공하는 고유의 기능(업무 로직 등을 포함)
  • 부가 기능(Cross-cuttig Concerns) : 핵심 기능을 보조하기 위해 제공되는 기능이며, 단독으로 사용되지 않고 핵심 기능과 함께 사용된다. (로그 추적 로직, 보안, 트랜잭션 기능 등)

AOP가 필요한 이유

: 소프트웨어 개발에서 변경 지점은 하나가 될 수 있도록 모듈화하는 게 중요한데, 부가 기능처럼 특정 로직을 애플리케이션 전반에 적용하는 문제는 일반적인 객체지향 프로그래밍 방식으로는 해결이 어렵기 때문에 핵심 기능과 부가 기능을 분리하는 AOP 방식이 필요하다.

profile
개발 공부하는 일상

0개의 댓글