스프링 AOP

JooHeon·2021년 12월 19일
0

🖊 AOP가 나오게 된 배경

어플리케이션 로직은 크게 핵심 기능부가 기능으로 나눌 수 있다.
핵심 기능은 해당 객체가 제공하는 고유의 기능이며
부가 기능은 핵심 기능을 보조하기 위해 제공되는 기능이다.
보통 부가 기능은 여러 클래스에 걸쳐서 함께 사용되는데, 이런 부가 기능을 여러 곳에 적용하려면 너무 번거롭다. 프록시가 없다고 가정하면 100개의 클래스에 100개를 적용하고 부가 기능을 수정하고자 하면 100개의 클래스를 수정해야한다.

🖊 AOP(Aspect-Oriented Programming)란?

부가 기능(횡단 관심사)과 부가 기능을 어디에 적용할지 선택하는 기능을 합해서 하나의 모듈로 만들었는데 이것이 바로 에스팩트(aspect)이다. 그리고 이 에스팩트를 사용한 프로그래밍 방식을 관점 지향 프로그래밍 AOP이라 한다. AOP는 OOP를 대체하기 위한 목적이 아닌 OOP의 부족한 부분을 보조하는 목적으로 개발되었다.

🖊 스프링에서 AOP의 사용

AOP의 대표적인 구현으로 AspectJ 프레임워크가 있다.
AspectJ 프레임워크는 스스로를 다음과 같이 설명한다.

  • 자바 프로그래밍 언언에 대한 완벽한 관점지향 확장
  • 횡단 관심사의 깔끔한 모듈화
    • 오류 검사 및 처리
    • 동기화
    • 성능 최적화(캐싱)
    • 모니터링 및 로깅

스프링은 이 AspectJ의 문법을 차용하고 AspectJ가 제공하는 기능의 일부를 제공한다.
스프링이 AspectJ를 직접 사용하는 것은 아니다.

🖊 AOP 적용 방식

크게 3가지 방식으로 나뉜다.

  • 컴파일 시점
    AspectJ가 제공하는 특별한 컴파일러를 사용해서 .class를 만드는 시점에 부가 기능 로직을 추가할 수 있다. 이렇게 원본 로직에 부가 기능 로직이 추가되는 것을 위빙(weaving)이라 한다.
  • 클래스 로딩 시점
    자바를 실행하면 자바 언어는 .class 파일을 JVM 내부의 클래스 로더에 보관한다. 이때 중간에서 .class 파일을 바이트 코드로 조작한 다음 JVM에 올릴 수 있다.
    이 시점에 에스팩트를 적용하는 것을 로드 타임 위빙이라 한다.
  • 런타임 시점(프록시)
    자바의 메인 메서드가 이미 실행된 다음인데 자바 언어가 제공하는 범위 안에서 부가 기능을 적용해야한다. 스프링과 같은 컨테이너의 도움을 받고 프록시와 DI, 빈 포스트 프로세서 같은 개념들을 동원해 프록시를 만들어 적용한다.
    프록시를 사용하기 떄문에 AOP에 일부 제약이 있는데, final 키워드나 생성자 등에 적용하기가 힘들다. 하지만 위의 두 방식에 비해 복잡한 옵션을 설정하지 않아도 된다.

🖊 AOP 적용 위치

적용 가능 지점(조인 포인트) : 생성자, 필드 값 접근, static 메서드 접근, 메서드 실행
프록시 방식을 사용하는 스프링 AOP는 메서드 오버라이딩 개념으로 동작해 메서드 실행 지점에만 AOP를 적용할 수 있다. 또한, 빈으로 등록할 수 있는 스프링 빈에만 AOP를 적용할 수 있다.

🖊 스프링 AOP의 필요성

위의 제약사항에도 불구하고 프록시를 사용하는 스프링 AOP를 사용하는 이유는 AspectJ를 사용하려면 복잡한 설정과 높은 러닝커브가 동반되어 운영이 힘든점이 있기 때문이다.
또한, 스프링이 제공하는 AOP 기능만 사용해도 대부분의 문제가 해결된다.

0개의 댓글