AOP

jkjan·2022년 3월 28일
0

글의 일부는 공식 문서를 참고하였다.

AOP란

AOP는 Aspect Oriented Programming 의 약자이다. Aspect는 측면이란 뜻이다. AOP의 한글 번역은 관점 지향 프로그래밍이다.

객체 지향 프로그래밍, 절차 지향 프로그래밍 등 개발 방법론들은
개발자가 아닌 사용자, 개발에 필요한 로직이나 효율적인 설계에 중점을 두었다.
때문에 로직마다 중복되는 일들 (로깅, 트랜잭션, 보안 등)을 라이브러리나 다른 인터페이스로 구현하고 이것이 필요한 메소드에서 호출해왔다.

개발자들은 귀찮다.
귀찮아서 (일하기 싫어서) 그렇기도 하지만
귀찮다는 것은 수동적이라는 것,
수동적이라는 것은 실수가 있기 마련이다.
그래서 이것을 일일히 메소드 앞 뒤로 구현해서 메소드의 코드를 더럽히지 않고
자동으로 필수 기능들을 실행해주는 방식이
이 관점 지향 프로그래밍의 목적이다.

여태 메소드나 로직을 로직이 진행되는 방향으로만 바라봤었는데
이젠 관점을 바꾸어서 로직마다 중복되는 작업을 해결하는 것이다.

위키 백과에 따르면 관점 지향 프로그래밍은 횡단 관심사(cross-cutting concern)의 분리를 허용함으로써 모듈성을 증가시키는 것이 목적인 프로그래밍 패러다임이다.

AOP의 요소

AOP는 여러 요소를 가지고 있다.

관점

Aspect 라고 한다. 개발자가 보는 관점이다.
로깅이나 보안, 트랜잭션 등 개발자가 공통으로 묶고자 하는 기능이다.
한 개 이상의 포인트컷과 어드바이스의 조합으로 만들어진다.

여러 클래스를 횡단하는 관심사의 모듈화이다.
트랜잭션 관리는 기업용 자바 어플리케이션의 클래스를 횡단하는 관심사의 좋은 예이다.
스프링 AOP에서 관점들은 일반적인 클래스로 구현하거나 @Aspect 어노테이션을 붙인 @AspectJ 스타일의 클래스로 구현할 수 있다.

어드바이스

관점의 구현체로 조인포인트에 삽입되어 동작하는 것을 의미한다.
스프링에서 사용하는 어드바이스는 동작하는 시점에 따라 다섯 종류로 구분된다.

특정 조인포인트에서 관점이 실행할 행동이다. "around", "before", "after" 등 다양한 종류의 어드바이스가 있다.
스프링과 같은 많은 AOP 프레임워크는 어드바이스를 인터셉터로 구현하고 조인포인트 주변의 인터셉터 체인을 관리한다.

  1. @Before - 메소드 실행 전에 호출된다.
  2. @AfterReturning - 메서드가 성공적으로 끝나서 값을 반환할 때 호출된다.
  3. @AfterThrowing - 메소드 진행 도중 예외가 발생했을 때 호출된다.
  4. @After - 메소드가 끝나면 무조건 호출된다.
  5. @Around - Before + Around

After가 붙은 게 많은데,
무조건 After가 마지막으로 호출된다.
한 메소드(조인포인트)에 AfterReturning과 After 를 붙였으면 AfterReturning 다음에 After가 호출된다.

After 어드바이스는 정상적인 혹은 예외적인 상황을 모두 다룰 수 있도록 해야 한다.
주로 자원 해제나 그 엇비슷한 동작을 하기 위해 사용된다.

AfterThrowing 어드바이스는 특정 예외가 발생했을 때만 작동하도록 설정할 수도 있다.

@Aspect
public class AfterThrowingExample {

    @AfterThrowing(
        pointcut="com.xyz.myapp.CommonPointcuts.dataAccessOperation()",
        throwing="ex")
    public void doRecoveryActions(DataAccessException ex) {
        // ...
    }
}

해당 코드에선 DataAccessException이 발생했을 때만 해당 어드바이스가 실행된다.

조인포인트

어드바이스를 적용하는 지점을 의미한다.
스프링에서는 메소드 실행 단계만 가능하다.

메소드의 실행이나 예외 처리 같이 프로그램이 실행되는 동안의 한 지점이다.
스프링 AOP에선 조인포인트는 항상 메소드의 실행을 가리킨다.

포인트컷

어드바이스를 적용할 조인포인트를 선별하는 과정이나 그 기능을 정의한 모듈을 의미한다.
정규표현식이나 AspectJ의 문법을 이용해서 어떤 조인포인트를 사용할 것인지 정한다.

포인트컷은 조인포인트를 지정한다. 어드바이스는 하나의 포인트컷 표현식으로 (메소드의 특정 시점: 조인포인트와) 연관되고,
포인트컷이 지정하는 조인포인트에서 실행된다.
(특정 이름을 가진 메소드의 실행을 예로 들 수 있다.)
포인트컷 표현식이 매칭하는 조인포인트의 개념은 AOP에서 중요하다. 스프링은 AspectJ 포인트 표현식을 기본으로 사용한다.

타겟 객체

하나 이상의 관점에 의해 어드바이스를 받을 대상이다.
"advised object"라고도 표현할 수 있다.
스프링 AOP는 런타임 프록시를 이용해 구현되므로 이 객체는 항상 proxied object이다.

AOP 프록시

관점 계약(aspect contractsk, 어드바이스 메소드 실행 등)을 구현하기 위해 AOP 프레임워크에 의해 생성된 객체이다.
스프링 프레임워크에서 AOP 프록시는 JDK dynamic 프록시거나 CGLIB 프록시이다.

위빙

어드바이스를 적용하는 것을 의미한다. 즉 공통 코드를 원하는 대상에 삽입하는 것을 뜻한다.

어드바이스 객체를 생성하기 위해 관점을 다른 어플리케이션 유형이나 객체와 연결하는 것을 뜻한다.
이는 컴파일 타임 (예시로 AspectJ 컴파일러) 혹은 로드, 혹은 런타임에 실행된다.
다른 자바 AOP 프레임워크와 같이 스프링 AOP에선 위빙을 런타임에 실행한다.

0개의 댓글