Spring

Spring_Chapter07_A.O.P

강용민 2022. 5. 2. 14:09

AOP를 들어가기에 앞서 다음 3가지의 용어를 알 필요가 있다.

  • 관심사(Concern)
    • 어플리케이션을 개발하기 위한 구현 기능들을 관심사(Concern)라 한다.
    • 어플리케이션의 비즈니스 중요 기능들을 핵심 관심사(Core Concern)이라 한다.
  • 횡단 관심사(Cross-Cutting-Concern)
    • 여러 모듈에 걸쳐 공통적이고 반복적으로 필요로 하는 처리 내용을 횡단 관심사라 한다.
  • 횡단 관심사 분리
    • 횡단 관심사를 한 곳으로 모으는 것을 횡단 관심사의 분리(Separation Of Cross-Cutting Concern)이라 하며,
      이를 실현하는 방법을 관점지향 프로그래밍이라 한다.

AOP 정의

AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이다.

관점 지향은 앞서 말했듯 여러 비즈니스 모듈에서 공통으로 사용되는 횡단 관심사를 중심으로 설계, 개발하는 프로그래밍 기법을 뜻한다.

AOP는 이를 통해 횡단 관심사와 이에 영향을 받는 객체 간 결합도를 낮추는 것을 목적으로 두고 있으며,
궁극적으로 전체 코드에 흩어져 있는 관심사들이 하나의 장소로 응집되기에 본질적인 처리들을 위한 핵심 기능에 대한 코드만 기술할 수 있게 되어 코드가 깔끔해진다.

또한 개발자들은 횡단 관심 모듈을 가각 독립된 모듈로 중복 없이 작성하고, DI 설정을 통해 핵심 관심 모듈의 적합한 위치에 결합시킬 수 있다.

 

AOP 주요 용어

구성 요소 설명
Advice 조인 포인트에 삽입되어 실행되는 코드. 횡단 관심사 구현 부분
Join Point 횡단 관심사가 실행되는 지점 또는 시점으로 Advice 적용 가능한 지점들로,
조인포인트 중에서 포인트컷이 되기때문에 포인트컷의 후보로 생각할 수 있다.
Pointcut 수많은 Join Point 중에서 실제 적용될 지점들
표현식으로 선별하며, 포인트 컷 설정은 XML, 애노테이션 방식을 사용한다.
Aspect(Advisor) 공통 관심사의 추상적 명칭
Advice와 PointCut 정보를 조합하여 합친 개념으로, 어떤 포인트컷 메소드에 대해 어떤 어드바이스 메소드를 실행할지 결정한다.
Target 핵심 로직을 구현하는 클래스.
횡단 관심사를 적용 받게 되는 대상으로 어드바이스가 적용되는 객체
Introduction Target에는 없는 새로운 메서드나 인스턴스 변수들을 추가하는 것
Weaving Advice와 Target이 결합되어서 Proxy 객체를 만드는 과정
Proxy Advice가 적용되었을 때 만들어지는 객체

 

Spring이 제공하는 Advice 유형

형태 설명
before 조인포인트가 실행되기 이전 시점에 실행되는 어드바이스,
예외가 발생되지 않는 한 조인포인트의 실행을 막을 수는 없다.
after 조인포인트 뒤에서 실행할 어드바이스,
조인포인트가 정상적으로 종료된지 여부에 관계없이 항상 실행된다.
after returning 조인포인트가 완전히 종료된 다음에 실행되는 어드바이스,
조인포인트가 정상적으로 종료되지 않고 예외발생 시 실행되지 않는다.
around 조인포인트 앞뒤에서 실행되는 어드바이스
조인포인트가 정상적으로 종료된지 여부에 관계없이 항상 실행된다.
after throwing  조인포인트에서 정상적으로 종료되지 않고 예외발생하고 종료된 다음 실행되는 어드바이스

 

Spring AOP 설계 방식

Spring AOP는 Proxy 패턴 방식을 통해 구현했다.

프록시(Proxy)를 번역하면 대리자, 대변인의 의미를 갖고있다. 즉 누군가를 대신해서 그 역할 을 수행하는 존재이다.

Proxy 패턴이란 어떤 객체를 사용하고자 할때, 객체를 직접적으로 참조 하는 것이 아니라, 그 객체를 대행(대리, Proxy)하는 객체를 통해 대상객체에 접근하는 방식이다.

Spring 컨테이너 초기화 과정에서 스프링 빈 객체를 대행할 프록시 객체를 생성한다.

이를 통해 객체 핵심 코드에 대한 영향없이 객체의 접근 전/후(Aspect)에 대한 중요 처리가 가능해진다.

 

AOP 구현 방법

AOP 구현을 하는 방법은 XML기반, Annotation기반, Java기반으로 총 3가지 방법이 존재한다.

또한 AOP를 구현하기 위해서 spring-aop와 aspectjrt,aspectjtools 라이브러리를 pom.xml에 추가해야한다. spring-aop는 spring-context라이브러리 추가 시 생략가능하다.

 

XML기반

빈 정의 파일의 AOP태그는 다음과 같다.

태그 설명 속성
aop: config aop 정의를 위한 최상위 엘리먼트
aop: aspect aspect를 정의한다. id(구별자),ref(bean태그 지정된 id)
aop: pointcut pointcut을 정의한다. id(구별자), expressioon(포인터컷 기술)
aop: before before 어드바이스를 정의한다. pointcut-ref, method(적용 메서드이름)
aop: after after 어드바이스를 정의한다. pointcut-ref, method(적용 메서드 이름)
aop: after-returning after-returning 어드바이스를 정의한다. pointcut-ref, method(적용 메서드 이름)
aop: around around 어드바이스를 정의한다. pointcut-ref, method(적용 메서드 이름)
aop: after-throwing after-throwing 어드바이스를 정의한다. pointcut-ref, method(적용 메서드 이름)

Pointcut 기술 방법 : 

  • execution() 표현식
    • 대표적인 포인트컷의 지시자이다.
    • <aop:pointcut id = "포인트컷 명" expression="execution(메서드 수식자(public private), 패키지.클래스.메서드 명(인수 ..) throws"/>로 작성한다.
      메서드의 수식자와 throws는 생략 가능하며, 메서드의 반환값 패키지와 클래스명은 와일드 카드 '*'를 이용가능하다.
      패키지와 클래스 명은 생략이 가능하며, 해당 패키지 및 하위 패키지를 포함하여 일치시키려면 '..'를 이용한다.
  • within() 표현식
    • 특정 타입에 속하는 메소드를 포인트컷으로 설정할 떄 사용한다.
    • exucution()의 여러 조건 중에서 타입 패턴 만을 적용하기 떄문에 execution 표현식 문법보다 간단하다.

[참조]

https://engkimbs.tistory.com/746

https://velog.io/@newtownboy/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-%ED%94%84%EB%A1%9D%EC%8B%9C%ED%8C%A8%ED%84%B4Proxy-Pattern

https://shortstories.gitbooks.io/studybook/content/aop.html

'Spring' 카테고리의 다른 글

SpringBoot_Chapter01_개요  (0) 2022.10.05
Spring_Chapter08_Transaction  (0) 2022.05.12
Spring_Chapter06_스프링+MyBatis  (0) 2022.04.29
Spring프레임워크_Chapter05_스프링 MVC  (0) 2022.04.08
Spring_chapter04_스프링 JDBC  (0) 2022.03.28