Spring AOP

shinhyocheol·2021년 9월 18일
0

AOP(Aspect Oriented Programming)

  • Spring의 핵심 개념중 하나이며 관점지향 프로그래밍을 의미한다.

    관점지향 프로그래밍이란 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 나누어진 관점들을 기준으로 각각 모듈화 하겠다는 의미다. 여기서 모듈화란 어떤 공통된 로직이나 기능을 하나의 단위로 묶는것을 의미한다.

  • 예를들어 핵심적인 관점이란 개발자가 적용하고자 하는 핵심 비즈니스 로직이 된다. 또한 부가적인 관점은 핵심 로직을 실행하기 위해서 행해지는 데이터베이스 연결, 로깅, 파일 입출력 등을 예로 들 수 있다.

  • AOP에서 각 관점을 기준으로 모듈화한다는 것은 코드들을 부분적으로 나누어 모듈화하겠다는 의미가 된다. 이때, 소스 코드상에서 수행되는 비즈니스 로직은 다르지만 공통적으로 반복 사용되는 코드들을 발견할 수 있는 데 이것을 흩어진 관심사 (Crosscutting Concerns)라 부른다.

위와 같이 흩어진 관심사를 Aspect로 모듈화 하고 핵심적인 비즈니스 로직에서 분리하여 재사용하겠다는 것이 AOP의 취지이다.

스프링 AOP 특징

  • 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 사용하는 이유는 접근 제어 및 부가기능을 추가하기 위해서임
  • 스프링 빈에만 AOP를 적용가능
  • 모든 AOP 기능을 제공하는 것이 아니라 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제(중복코드, 프록시 클래스 작성의 번거로움, 객체들 간 관계 복잡도 증가..에 대한 해결책을 지원하는 것이 목적

주요개념

  • Advice : 실질적으로 부가기능을 담은 구현체 Aspect가 '무엇'을 '언제' 할지에 대한 정의를 담고있다.

    Spring AOP 어노테이션

    • @Aspect : 해당 어노테이션을 붙여줌으로써 이 클래스는 Aspect를 나타내는 클래스라는 것을 명시하고 @Component를 붙여 스프링 빈으로 등록
    • @Before(이전): 어드바이스 타겟 메소드가 호출되기 전에 어드바이스 기능을 수행
    • @After(이후): 타겟 메소드의 결과와 관계 없이 타겟 메소드가 완료되면 어드바이스 기능을 수행
    • @AfterReturning(정상적 반환): 타겟 메소드가 성공적으로 결과값을 반환 후에 어드바이스 기능을 수행
    • @AfterThrowing(예외 발생): 타겟 메소드가 로직을 수행하던 중 예외가 발생하면 어드바이스 기능을 수행
    • @Around(메소드 실행 전후): 어드바이스가 타겟 메소드를 감싸서 타겟 메소드 호출전과 후에 어드바이스 기능를 수행
  • Aspect: 위에서 설명한 흩어진 관심사를 모듈화 한것. 주로 부가기능들을 모듈화한다.

  • Target: Aspect를 적용하는 곳(클래스, 메소드..)

  • Advice: 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체

  • JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능

  • PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음

  • Proxy : 타겟을 감싸서 타겟의 요청을 대신 받아주는 랩핑 오브젝트. 클라이언트에서 타겟을 호출하면, 타겟을 감싸고 있는 프록시가 호출되며, 타겟 메소드 실행 전 선처리, 실행 후 후처리를 실행시키도록 구성되어있다.

    프록시는 호출을 가로챈 후, 어드바이스에 등록된 기능을 수행한다. 수행이 끝나면 타겟 메소드를 호출한다. @Transactional 어노테이션이 대표적인 예시다.

  • Introduction : 타겟 클래스에 코드 변경없이 신규 메소드나 멤버변수를 추가하는 기능

  • Weaving : 지정된 객체에 Aspect를 적용해 새로운 프록시 객체를 생성하는 과정. A 객체에 트랜잭션 Aspect가 지정되어 있다면, A라는 객체가 실행되기전 커넥션을 오픈하고 실행이 끝나면 커넥션을 종료하는 기능이 추가된 프록시 객체가 생성되고, 이 프록시 객체가 앞으로 A 객체가 호출되는 시점에 사용된다. 이때의 프록시 객체가 생성되는 과정을 Weaving(위빙)이라고 한다. Spring AOP는 런타임 시점에서 프록시 객체가 생성된다.

profile
놀고싶다

0개의 댓글