🌿SPRING/🍀공부 [SPRING]

[SPRING] AOP 개념

디카페인라떼 2022. 9. 1. 01:36

참고블로그

 

우아한테크 유튜브

Aspect Oriented Programming
  • 관점지향프로그래밍 
  • 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점에서 나누어서 보고 그 관점을 기준으로 각각 모듈화 하겠다는 것
  •  흩어진 Aspect를 모듈화 할 수 있는 프로그래밍 기법

말이 헷갈려서 찾아보니 일단은 OOP(객체지향 프로그래밍)의 한계에 대해서 알아야 한다.

  • OOP의 한계
    • A,B,C 클래스들의 같은 색의 선들은 중복되는 메소드/필드/코드 등을 의미
    • 만약 클래스A의 주황색 을 수정한다면 클래스B와 클래스C도 해당하는 부분을 찾아 수정해야함.
    • 이는 SOLID 원칙에 위배 / 유지보수에도 쉽지 않음.
    • 인프라로직의 중복이  횡단으로 나타나기 때문에 횡단 관심사, 흩어진 관심사 (Crosscutting Concerns)라고 함
  • AOP
    • 흩어진 관심사들을 Aspect를 이용하여 모듈화 시킴(어드바이스)
    • 횡단 관심에 따라 프로그래밍 함 
      • 모듈화 ? : 어떤 공통된 로직이나 기능을 하나의 단위로 묶는 것
    • 개발자가 모듈화시킨 Aspect를 클래스에 어느 속에 사용해야하는지만 정의해 주면 됨. (포인트컷)
    • 즉, Aspect로 모듈화하고 핵심적인 비즈니스로직에서 분리하여 재사용하겠다는 것

프록시 패턴

  • Client는 subject 인터페이스 타입으로 프록시 객체를 사용하게되고, 프록시는 Real Subject를 감싸서 클라이언트의 요청을 처리
    • 프록시 패턴의 목적은 기존 코드 변경 없이 접근 제어 또는 부가 기능을 추가하기 위해서
  • 단점
    • 이러한 방식도 메소드가 많다면 코드의 중복이 많이 일어날 것
    • 매번 프록시 클래스도 직접 만들어야 함

이러한 단점을 해결하기위해 나온 Spring AOP

 

  • AOP의 핵심 기능 
    • 코드를 수정하지 않으면서 공통 기능의 구현을 추가하는 것
  • 핵심 기능에 공통 기능을 추가하는 방법
    • 컴파일 : 자바 파일을 클래스 파일로 만들 때 바이트코드를 조작하여 적용된 바이트코드를 생성
    • 로드 타임 : 컴파일은 원래 클래스 그대로 하고, 클래스를 로딩하는 시점에 끼워서 넣는다.
    • 런타임 : A라는 클래스를 빈으로 만들 때 A라는 타입의 프록시 빈을 감싸서 만든 후에, 프록시 빈이 클래스 중간에 코드를 추가해서 넣는다.
  • 스프링AOP는 프록시 객체를 자동으로 만들어줌
    • 따라서 상위 타입의 인터페에스를 상속받은 클래스를 직접 구현할 필요가 없음.
    • 단지 공통기능을 구현한 클래스만 잘 구현하면 됨.

 

AOP 주요 개념
  • Aspect : 위의 사진에서 처럼 Aspect 안에 모듈화 시킨 것을 의미한다.
  • Advice : 어떤 부가 기능?
    Before, AfterReturning, AfterThowing, After, Around
  • Pointcut : 어디에 적용해야 하는지에 대한 정보를 담고 있다./ 실제 advice가 적용될 지점, Spring AOP에서는 advice가 적용될 메소드를 선정
  • Target : Aspect에 적용이 되는 대상 , 어떤 대상에 부가기능을 부여할 것인가
  • Join point : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능(여러가지 합류 지점임) / 어디에 적용할 것인가? 메서드,필드, 객체,생성자 등 
    (Spring AOP에서는 메소드가 실행될 때만으로 한정)

Spring AOP 구현