프로그래밍 노트/SPRING

[Spring] Spring AOP(Aspect Oriented Programming)1

깡냉쓰 2018. 7. 1. 20:02
728x90
반응형

AOP(Asepect Oriented Programming) 기능

기존의 비즈니스로직 외 작성해야 하는 코드를 별도로 분리함으로써 개발자가 좀 더 비즈니스 로직에만 집중해서 처리할 수 있는 방법을 제공

=> 비즈니스로직이 아닌 공통적이고 반족적인 코드를 처리하기 위한 방법


AOP와 트랜잭션 처리를 통해서 다음과 같은 기능을 완성 할 수 있음

  • 개발자가 원하는 코드를 실행하는데 얼마나 시간이 소모되는지 쉽게 알 수 있다.
  • 개발자는 메소드에 전달되는 파라미터나 리턴 값에 대해서 로그를 기록할 수 있다.
  • 데이터베이스 상에서 트랜잭션 처리를 설정하여, 성공하는 경우에만 모든 데이터가 완전하게 처리되는 방법 적용할 수 있다.


AOP에서 'Aspect'란

=> '비즈니스 로직은 아니지만, 반드시 해야하는 작업', '반드시 해야 하고 공통된 작업' 정도로 해석할 수 있다. 

(개발에선 이런 행위를 '횡단 관심사(cross-concern)'라고 함)


ex) 보안, 성능 모니터링, 로그


그렇다면, 어떻게 기존의 코드를 수정하지 않고 코드의 앞이나 뒤에서 필요한 기능이 동작하도록 작성할 수 있을까?

=> 개발자가 작성한 코드와 컴파일되거나 실행 시에 동작하는 코드가 다르기 때문에 가능

이에 대한 구현 방식은 소위 '프록시(Proxy) 패턴'이라는 방식을 통해서 구현

(그림 출처 : www.java9s.com)

=> 외부에서 특정한 객체(Target)를 호출하면, 실제 객체를 감싸고 있는 바깥쪽 객체(Proxy)를 통해서 호출이 전달. Proxy객체는 AOP의 기능이 적용된 상태에서 호출을 받아 사용되고, 실제 객체와 동일한 타입을 자동으로 생성할 수 있기 때문에 외부에서는 실제 객체와 동일한 타입으로 호출 가능


AOP를 이해하기 위한 필수 AOP 용어 정리

 용어

설명 

 Aspect

 공통 관심사에 대한 추상적인 명칭(로깅, 보안, 트랜잭션과 같은 기능 자체에 대한 용어)

 Advice

 실제로 기능을 구현한 객체

 JointPoints

 공통 관심사를 적용할 수 있는 대상. (각 객체의 메소드가 이에 해당)

 (작성된 Advice가 활약할 수 있는 위치를 의미)

 Pointcuts

 여러 메소드 중 실제 Advice가 적용될 대상 메소드

 (여러 Join Points 중에서 Advice를 적용할 대상을 선택하는 정보)

 Target

 대상 메소드를 가지는 객체

 Proxy

 Advice가 적용되었을 때 만들어지는 객체

 Introduction

 Target에는 없는 새로운 메소드나 인스턴스 변수를 추가하는 기능

 Weaving

 Advice와 Target이 결합되어서 프록시 객체를 만드는 과정

좀 더 자세한 설명

  • Advice : 실제 적용시키고 싶은 코드 자체, 개발자가 만드는 것은 Aspect가 아닌 클래스를 제작하고 @Advice를 적용시키는 것(로그, 파라미터 체크 같은 것을 Aspect라고 부르지만, 실제 구현 시에는 Advice를 작성한다고 표현)
  • Target : 실제 비즈니스 로직을 수행하는 객체를 의미. 용어 그대로 Aspect를 적용해야 하는 대상 객체를 의미
  • JoinPoints : 작성된 Advice가 활약할 수 있는 위치를 의미(예를 들어 ContractService에 계약서 등록, 수정, 삭제만을 골라서 Advice를 적용할 수 있는데, 이 때 ContractService의 모든 메소드가 JoinPoint가 됨
  • Pointcuts : 여러 JoinPoints 중에서 Advice를 적용할 대상을 선택하는 정보. 이를 통해서 특정 메소드는 Advice가 적용된 형태로 동작함

아래 그림을 참고하면 이해가 쉬울 듯 하다.


(그림 출처 : http://seanzhou1023.blogspot.com/2015/10/4-spring-in-action-aspect-oriented.html)


Advice의 종류

Advice는 실제 구현된 클래스이며, 타입은 아래와 같이 분류 됨

타입 

기능 

 Before Advice 

 Target의 메소드 호출 전에 적용

 After returning

 Target의 메소드 호출 이후에 적용

 After throwing

 Target의 예외 발생 후 적용

 After

 Target의 메소드 호출 후 예외의 발생에 관계없이 적용

 Around

 Target의 메소드 호출 이전과 이후 모두 적용(가장 광범위하게 사용됨)


참고 서적 :코드로 배우는 스프링 웹 프로젝트

728x90
반응형