중요한 기본 개념
핵심 기능(Core Concerns) : 업무 로직을 포함하는 기능
부가 기능(CROSS-CUTTING CONCERNS) : 핵심 기능을 도와주는 부가적인 기능
Aspect : 부가 기능을 정의한 코드인 어드바이스(Advice)와 어드바이스를 어디에 적용할지 결정하는 포인트컷(PointCut)을 합친 개념. (Advice + PointCut ⇒ Aspect)
분리한 부가 기능과 그 기능들을 어디에 적용할지 선택하는 기능을 합해서 하나의 모듈로 만든 것이다.
AOP는 기존에 사용하던 OOP를 대체하기 위한 것이 아닌 횡단 관심사를 깔끔하게 처리하기 위해 OOP의 부족한 부분을 보조하는 목적으로 개발되었다.
이전과 현재에 많은 프로젝트는 객체 지향 프로그래밍(Object Oriented Programming:OOP) 패러다임을 지향하며 프로그래밍을 하고 있다.
정의된 기능들을 재사용하기 위해 동작보다는 객체를 중심으로 프로그래밍하는 OOP가 등장했다.
OOP의 핵심은 공통된 목적을 띈 데이터와 동작을 묶어 하나의 객체로 정의하는 것이다.
객체를 적극적으로 활용함으로써 기능을 재사용할 수 있는 것이 큰 장점이다.
객체를 잘 활용하기 위해선 관심사 분리 (Separation of Concerns, SoC)의 디자인 원칙을 준수해야 한다.
주요 개념
Spring MVC 구조는 @Controller, @Service, @Repository와 같이 관심사 별로 계층을 나눠 객체를 관리하게 된다.
관심사의 분리는 모듈화의 핵심이다.
문제점
특정 관심사 업무 코드에 트랜잭션, 보안, 로깅 등의 코드가 존재하게 된다.
트랜잭션, 보안, 로깅 코드는 업무와는 관련이 없지만 애플리케이션에 필수적인 부가 기능이다.
트랜잭션, 보안, 로깅 기능은 불특정 다수의 클래스에서 존재하게 된다.
관심사 관점에서는 트랜잭션, 보안, 로깅 코드들을 횡단 관심사(Cross-cutting Concerns: 부가 기능)라고 한다.
업무 관련 코드는 핵심 관심사(Core Concerns: 핵심 기능)라고 한다.
비즈니스 클래스에 횡단 관심사와 핵심 관심사가 공존하게 된다.
메소드 복잡도 증가 → 비즈니스 코드 파악이 어렵게 된다.
부가 기능의 불특정 다수 메소드가 반복적으로 구현 → 횡단 관심사의 모듈화가 어렵다.
AOP(Aspect-Oriented Programming)는 기존과 다른 프로그램 구조 사고 방식을 제공함으로써 객체 지향 프로그래밍(OOP)의 부족한 부분을 보완한다.
OOP의 모듈화의 핵심 단위는 클래스이고, AOP의 모듈화의 핵심 단위는 관점이다.
Aspect는 여러 유형과 객체 간에 발생하는 문제 (ex - 트랜잭션)의 모듈화를 가능하게 한다.
애플리케이션 로직은 크게 핵심 기능과 부가 기능으로 나눌 수 있다.
핵심 기능(Core Concerns)
부가 기능(CROSS-CUTTING CONCERNS)
핵심 기능을 보조하기 위해 제공되는 기능이다.
로그 추적 로직, 보안, 트랜잭션 기능 등이 있다.
단독으로 사용되지 않고 핵심 기능과 함께 사용된다.
핵심 기능인 OO 로직과 부가 기능인 로그 추적 로직이 하나의 객체로 들어가게 된다.
부가 기능이 필요한 경우엔 위와 같은 형태로 합쳐져서 하나의 로직을 완성하게 된다.
서비스를 실행하면 핵심 기능과 부가 기능이 함께 실행된다.
소프트웨어 개발에서 변경 지점은 하나가 될 수 있도록 잘 모듈화 되어야 한다.
부가 기능처럼 특정 로직을 애플리케이션 전반에 적용하는 문제는 일반적인 OOP 방식으로는 해결이 어렵기 때문에 핵심 기능과 부가 기능을 분리하는 AOP 방식이 필요하다.
OOP 방식의 프로그래밍을 했을 때 여러 곳에서 공통적으로 사용되는 부가 기능의 중복 코드가 발생하게 된다.
중복되는 부가 기능에 수정 및 삭제가 필요하게 되면 사용되는 모든 곳에 수정 및 삭제 동작을 해줘야한다.
관심 지향 프로그래밍(AOP)은 OOP 방식의 불필요한 반복을 해결하기 위한 방법이다.