AOP란?
•
'핵심기능': 각 API 별 수행해야 할 비즈니스 로직이다.
◦
현재 프로젝트로는 회원 가입, 가게 등록, 주문, 가게 키워드 검색, 메뉴 등록 등 기본적인 서비스의 기능들이다.
•
‘부가기능’: 부가적인 기능
◦
어플리케이션의 여러 부분에서 반복적으로 발생하는 기능으로 메인 기능 이전 또는 이후에 실행되야 하는 것이다.
◦
AOP는 이러한 부가 기능을 모듈화하고 추상화한 것으로 주요 관심사는 보안, 로깅, 트랜잭션 관리 등과 같은 것들을 포함할 수 있다.
핵심 기능과 부가 기능을 구분하는 기준은?
이것이 AOP의 방향이다. AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다.
어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 각각 모듈화하겠다는 것이다.
간단히 말하면 다른 부분에 계속 반복해서 쓰는 코드들을 발견할 수 있는 데 이것을 흩어진 관심사 (Crosscutting Concerns)라 부른다.
위와 같이 흩어진 관심사를 Aspect로 모듈화하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지다.
AOP 주요 개념
•
Aspect : 위에서 설명한 흩어진 관심사(부가기능)를 모듈화 한 것. 주로 부가기능을 모듈화함.
•
Target : Aspect를 적용하는 곳 (클래스, 메서드 .. )
•
Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
•
JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
◦
PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
스프링 AOP 특징
•
프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서임
•
스프링 빈에만 AOP를 적용 가능
•
모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가 ...)에 대한 해결책을 지원하는 것이 목적