본문 바로가기

Spring

[Spring] AOP(Aspect Oriented Programming)가 필요한 이유


기본 개념


이전 글인 [Spring] Spring Framework란?(3)에 정리해 두었습니다.

 

 

객체 지향 프로그래밍(Object Oriented Programming:OOP)


  • 객체지향 프로그래밍은 공통된 목적을 띈 데이터와 동작을 하나의 객체로 정의하는 것입니다.
  • 객체를 활용함으로써 코드의 재사용을 할 수 있는 것이 큰 장점입니다.
  • 객체를 잘 활용하기 위해선 관심사 분리 (Separation of Concerns, SoC)의 디자인 원칙을 준수하여야 합니다.

 

문제점

  • 특정 관심사 업무 코드에 트랜잭션, 보안, 로깅 등의 코드가 존재하게 됩니다.
  • 트랜잭션, 보안, 로깅 코드는 업무와는 관련이 없지만 애플리케이션에 필수적인 부가 기능입니다.
  • 트랜잭션, 보안,로깅 기능은 불특정 다수의 클래스에서 존재하게 됩니다.
  • 관심사 관점에서는 트랜잭션, 보안, 로깅 코드들을 횡단 관심사(Cross-cutting Concerns: 부가 기능)라고 합니다.
  • 업무 관련 코드는 핵심 관심사(Core Concerns:핵심 기능)라고 합니다.
  • 비즈니스 클래스에 횡단 관심사와 핵심 관심사가 공존하게 됩니다.
    • 메서드 복잡도 증가 -> 비즈니스 코드 파악이 어렵게 됩니다.
    • 부가 기능의 불특정 다수 메서드가 반복적으로 구현 -> 횡단 관심사의 모듈화가 어렵습니다.

 

AOP의 등장


AOP(Aspect Oriented Programming) 이전 객체지향프로그래밍만을 사용해선 횡단 관심사 코드를 깔끔하게 분리하고 비즈니스 코드에 적용하기 어려웠습니다.

이러한 객체지향프로그래밍의 관심사 분리에 대한 한계적인 부분을 해결하고자 AOP가 등장하게 되었습니다.

 

AOP란?

AOP는 기존과 다른 프로그램 구조 사고방식을 제공함으로써 객체 지향 프로그래밍의 부족한 부분을 보완하였습니다.

객체지향프로그래밍의 모듈화의 핵심 단위는 클래스이고, AOP의 모듈화의 핵심 단위는 관점입니다.

Aspect는 여러 유형과 객체 간에 발생하는 문제의 모듈화를 가능하게 합니다.

 

AOP의 핵심 기능과 부가 기능

  • 핵심 기능(Core Concerns)
    • 객체가 제공하는 고유의 기능(업무 로직 등을 포함)입니다.
  • 부가 기능(CROSS-CUTTING CONCERNS)
    • 핵심 기능을 보조하기 위해 제공되는 기능입니다.
    • 로그 추적 로직, 보안, 트랜잭션 기능 등이 있습니다.

 

  • 핵심 기능인 로직과 부가 기능인 로그 추적 로직이 하나의 객체로 들어가게 됩니다.
  • 부가 기능이 필요한 경우엔 위와 같은 형태로 합쳐져서 하나의 로직을 완성하게 됩니다.
  • 서비스를 실행하면 핵심 기능과 부가 기능이 함께 실행됩니다.

 

공통으로 사용하는 부가 기능

  • 부가 기능을 여러 곳에 적용하려면 번거롭고 중복 코드가 생기게 됩니다.
  • 부가 기능에 수정이 필요하게 되면 사용되는 클래스에 모두 하나씩 찾아 수정하여야 합니다.

 

AOP가 필요한 이유

  • 소프트웨어 개발에서 변경 지점은 하나가 될 수 있도록 모듈화 되면 좋습니다.
  • 부가 기능처럼 특정 로직을 애플리케이션 전반에 적용하는 문제는 일반적인 OOP 방식으로는 해결이 어렵기 때문에 핵심 기능과 부가 기능을 분리하는 AOP 방식이 필요합니다.