Aspect-Oriented Programming
객체 지향 프로그래밍(OOP)로 개발 하다보니 단점이 발견되었다. 분산된 중복 소스 , 소스간 의존성 증가 등등.
이런 문제를 해결하기 위해 등장한것이 AOP.
“Aspect” 란 로깅 , 보안, 트렌젝션 같은 비지니스 로직 사이에 공통으로 존재하는 “관심사”들이다. 이런 부분들이 객체지향프로그래밍에서는 전체 어플리케이션에서 중구난방으로 등장(횡단 관심사)해서 정리가 안되니 이런 부분을 따로 때서 개발하자 라는 것이다.
결국 객체지향 프로그래밍을 중심으로 거기서 발견된 문제를 관심사 분리를 통해 해결하자 라는 것이 AOP
AOP의 Aspect를 구현하기 위해서는 Advice(무엇을 해야하는가) point cut(어디서 해야하는가)를 정의해야한다. 정의된 것을 weaving(point cut 지점에 Advice를 삽입)한다.
일련의 작업을 통해 공통의 관심사를 분리하고 이로 중복 코드를 제거하여 유지보수에 큰 이점을 가질 수 있게 된다.
글로만 쓰면 무슨말인지 잘 모르니, Spring에서 구현된 AOP의 실전 예제를 통해 이해해보자.
Spring에서 AOP를 구현하기위한 방법은 여러가지인데 어노테이션(AspectJ)를 이용한 방법을 사용해보자
1 2 3 4 5 6 7 8 9 10 11 |
//Import 등 필요없는 부분 모두 생략 @Aspect //이 클래스가 Aspect 클래스임을 선언 public class LoggingAspect { @Before("execution public * package.name.println*(..)" //해당 패키지내의 println 메소드 실행전(pointCut) public void printBefore(JoinPoint joinPoint){ //Joinpoint 는 pointcut의 대상이되는 메소드들의 집합 System.out.println("This is Advice"); //실제 Advice는 @Before 어노테이션을 포함한 printBefore전체 메소드 } } |
Interface로 정의되고 Spring Bean으로 등록된 객체만이 Aspect가 실행되는 대상이된다.
해당 문법(@Before , @After 등)에 대해서는 AspectJ 문법을 찾아 사용하면 될것 같다.