Spring AOP에 대해

CinnamonTree·2022년 6월 3일
0

스프링

목록 보기
2/2

Service코드에서 필요한 내용은 비즈니스 로직이라고 불리는 핵심 기능이다. 다른 인프라 로직(=부가가능 ex: 로깅)은 어플리케이션의 전 영역에서 나타날 수 있고, 중복코드를 만들어 낼 가능성 때문에 비즈니스 로직과 함께 있으면 유지보수와 해당 로직을 이해하기 힘들어진다.

보통 인프라 로직은 성능검사, 로깅, 권한 체크 등 하나의 관심사를 가지게 된다. 비즈니스 로직을 수행하는데에 있어서 부가기능이 되는 인프라 로직의 중복이 횡단으로 나타나게 되어 횡단 관심사(cores-cutting concern)라고도 불린다.

AOP

"AOP complements OOP by another way of thinking about program structure" -spring documentation
AOP는 OOP와 같은 일종의 패러다임으로서, 각 언어마다 AOP의 구현체가 있다. Java는 AspectJ를 사용한다.

용어

  • Target : 어떤 대상에 부가기능을 적용할것인가?
  • Advice : 어떤 부가기능을 부여할것인가?
    Target 클래스의 JoinPoint에 삽입되어저 동작할 수 있는 코드를 뜻한다.
  • Weaving
    Advice를 핵심 로직 코드에 적용하는 것
  • Join Point: 어디에 적용할 것인가? (메서드, 필드, 객체)
    Advice를 적용가능한 시점을 의미한다. '메서드 호출 시점', '예외 발생 시점'과 같이 특정 작업이 시작되는 지점을 뜻한다. 여러 상황에서 부가기능을 실행시킬 수 있는데, 스프링 AOP에서는 메서드가 실행될때로 한정하고 있다.
  • Point cut
    JoinPoint의 부분집합으로서 실제 Advice가 적용되는 JoinPoint를 나타낸다. 하나 또는 여러 JoinPoint를 하나로 결합한 것을 PointCut이라 하는데,

    JoinPoint와 PointCut의 차이
    MemberService의 hello()라는 메소드 실행 전,후에 hello랑 bye를 출력하는 일을 한다고 가정했을 때, MemberService 빈이 타겟, "hello() 메소드 실행 전,후"가 포인트컷, "메소드 실행 전,후"라는게 조인포인트, "hello랑 bye를 출력하는 일"이 Advice아다. 조인포인트는 메타적인 정보, 포인트컷은 좀 더 구체적인 적용 지점이라고 생각하면 된다.

AOP 구현방법

  • 컴파일
    J.java -> J.class 로 컴파일 하는 시점에 AOP적용
  • 클래스 로드 시
    J.class를 클래스 로더가 메모리 상에 올릴때 AOP적용
  • 프록시 패턴 (스프링은 Ioc와 DI기반이라 가능.)
    J 타켓 클래스를 부가기능을 제공하는 프록시로 감싸서 AOP적용

@Transactional 어노테이션도 Spring AOP중 하나이다.
서비스 로직을 하나의 트랜잭션으로 만들 때, 원래는 로직의 시작점에 트랜잭션을 열어주고 로직이 끝나는 시점에서 트랜잭션을 커밋하는 코드가 항상 들어가야 하는데, 이 어노테이션으로 인해 비즈니스 로직에만 집중할 수 있고, 트랜잭션 인프라 로직은 AOP로 분리할 수 있게 된다.
Filter, Interceptor모두 AOP의 일종이다.

Spring AOP vs AspectJ


[출처:https://www.youtube.com/watch?v=Hm0w_9ngDpM]

Java의 AspectJ:

  • 완벽한 AOP기능 제공: JoinPoint를 다양하게 제공
  • Weaving: IoC나 DI기능이 없기 때문에 런타임에는 제공하지 않음.

Spring:

  • Joinpoint: 메소드 레벨만.
  • Weavnig : 스프링 컨테이너가 객체 생성을 관리하기 때문에 런타임 시에만 가능.

0개의 댓글