AOP(Aspect Oriented Programming)


AOP(Aspect Oriented Programming)

  • 객체지향 프로그래밍을 보완하는 개념으로, 애플리케이션을 객체지향적으로 모듈화하여 작성하더라도 다수의 객체들에 분산되어 중복적으로 존재하는 공통 관심사가 여전히 존재한다.

  • AOP는 이를 횡단 관심(Crosscutting Concern)으로 분리하여 핵심 관심(Core Concern)과 엮어서 처리할 수 있는 방법을 제공한다.

  • 로깅, 보안, 트랜잭션 등 핵심 기능이 아닌 공통 부가 기능의 활용을 기존의 비즈니스 로직에 영향을 주지 않고 모듈화 처리를 지원하는 프로그래밍 기법이다.

  • Spring에서 AOP는 런타임에 프록시 기반으로 메서드(서비스) 단위로 적용된다.


JoinPoint

  • 횡단 관심 모듈이 삽입되어 동작할 수 있는 실행 가능한 특정 위치를 의미한다.

  • Spring에는 총 5가지 JoinPoint가 존재하는데 각각

    • Before : 메서드 호출시 바로

    • After Throwing : 예외가 발생했을 때

    • After : 동작이 끝난 뒤에 (성공적으로 수행된 경우, 에러가 발생한 경우 모두 해당)

    • After Returning : 리턴 직후에 (에러 없이 성공적으로 실행)

    • Around : 전 범위에 걸쳐서

    를 의미한다.


PointCut

  • 메서드 선정 알고리즘

  • 어떤 클래스의 어느 JoinPoint를 사용할 것이지 결정하는 선택 기능을 말한다.

  • 어떤 메서드(서비스)에 해당 기능을 추가할지 결정한다.


Advice

  • 특정 Join Point에 실행되는 코드

  • 즉, 앞에서 서술한 핵심 기능에 영향을 미치지 않는 따로 떼어낸 부가 기능이다.


Aspect

  • Advice + PointCut

  • 애플리케이션이 가지고 있어야 할 로직과 그것을 실행하는 지점을 정의한 것이다.


Weaving

  • PointCut에 의해 결정된 JoinPoint에 지정된 Advice를 삽입하는 과정을 의미한다.

  • AOP가 기존의 횡단 관심 모듈의 코드에 전혀 영향을 주지 않으면서 필요한 횡단 관심 기능을 추가할 수 있게 해주는 핵심적인 처리 과정이다.

  • Spring에서는 프록시 기반으로 런타임 Weaving 방식을 지원한다.


예시

  • 로그를 남기는 기능 = 부가 기능 = Advice

  • 어느 위치에 기능을 넣을 것인지 = JoinPoint

  • 어떤 서비스에 그 기능을 넣을 것인지 = PointCut

  • 로그를 남기는 기능을 어떤 서비스의 어느 위치에서 작동 시킬 것인지 = Advice + PointCut = Aspect