2023년 1월 1일
08:00 AM
Buffering ...

최근 글 👑

AOP + Proxy

2024. 10. 13. 18:02ㆍ트러블슈팅

관심사를 분리하여 모듈로 사용하는데 목적

 

 

AOP란?
  • AOP(Aspect-Oriented Programming)는 프로그램의 핵심 비즈니스 로직과 관계없는 횡단 관심사를 분리하여 모듈화하는 프로그래밍 패러다임이다.
  • AOP는 핵심기능과 부가 기능을 분리해서 관리함으로써 코드 중복을 줄이고 유지보수를 쉽게 해준다.

 

※ 프로그래밍 패러다임이란?
간단하게 프로그래밍 스타일을 의미하며 전체적인 프로그래밍 방식을 말한다.
대표적으로 절차지향 프로그래밍, 객체지향 프로그래밍, 함수형 프로그래밍, 관점 지향 프로그래밍이 있다.

 

핵심 개념
  • 핵심 기능
    • 핵심 기능은 애플리케이션의 주요 비즈니스 로직을 의미한다.
  • 부가 기능
    • 핵심 비즈니스 로직 외에 부수적으로 필요한 기능을 의미
      ex) 로깅, 트랜잭션 관리 같은 것 등등...
  • 횡단 관심사 분리
    • 횡단 관심사는 애플리케이션 전반에 걸쳐 공통적으로 필요하지만, 각 비즈니스 로직과는 관계없는 기능.
    • 대표적인 횡단 관심사는 로깅, 트랜잭션 관리, 보안 등등..

 

핵심 키워드

 

 

  • Advice
    • 실질적으로 실행되는 부가 기능 코드를 의미한다
      • Before Advice: 메소드 실행 전에 실행됨.
      • After Returning Advice: 메소드가 정상적으로 실행된 후 실행됨.
      • After Throwing Advice: 메소드 실행 중 예외가 발생하면 실행됨.
      • After (Finally) Advice: 메소드 실행이 정상 종료되든, 예외가 발생하든 무조건 실행됨.
      • Around Advice: 메소드 실행 전후에 실행되며, 메소드 실행을 직접 제어할 수 있음.

  • PointCut
    • 어떤 JoinPoint에 부가 기능을 적용할지 결정하는 규칙 쉽게 말해 어드바이스를 적용할 구체적인 범위를 선택하는 규칙이다

  • Target
    • 부가 기능이 적용되는 실제 비즈니스 로직을 포함한 객체

  • JoinPoint
    • 어드바이스가 적용될 수 있는 실행 지점을 의미한다.

  • Aspect
    • Aspect는 어드바이스와 포인트컷을 하나로 묶은 모듈이다.

 

AOP 동작 원리

 

  • AOP 적용 전 : 스프링 컨테이너
    • AOP가 적용되지 않은 경우, 스프링 컨테이너에는 클라이언드(Controller)와 서비스 객체가 직접 존재한다.
    • 클라이언트는 서비스 객체를 직접 호출하여 비즈니스 로직 실행
    • 핵심 비즈니스 로직을 포함한 서비스 객체가 바로 호출되며, 부가 기능이 따로 적용되지 않음.

  • AOP 적용 후 : 스프링 컨테이너
    • AOP가 적용되면 빈 후처리기(BeanPostProcessor)가 AOP 설정을 확인하고, 그에 맞게 프록시 객체를 생성한다.
    • 프록시 객체는 기존의 서비스 객체를 감사고, 이 프록시 객체가 스프링 컨테이너에 등록
    • 클라이언트는 원래스 서비스 객체 대신 프록시 객체를 호출하게 된다.

AOP 동작 과정
  • 클라이언트가 서비스 객체의 메서드를 호출하려고 하며느 실제로 호출되는 것은 프록시 객체.
  • 프록시 객체는 AOP 설정에 따라 부가 기능(Advice)을  먼저 실행하고, 그런 다음에 핵심 비즈니스를 담고 있는 서비스 객체의 메서드를 실행
  • 비즈니스 로직이 실행된 후에는, 결과를 다시 프록시 객체를 통해 클라이언트에게 반환하게 된다.
  • 프록시 객체는 AOP 설정에 따라 후처리 작업을 수행할 수 있다.

 

 

 

 

 

프록시? 프록시 객체? 그게 뭘까?
  • 프록시(Proxy)란?
    • 프록시는 사전적 용어로 대리인을 의미. 객체 지향 프로그램이에서 프록시 객체는 실제 객체를 대신해서 클라이언트 요청을 가로채고, 추가적인 기능을 수행한 후 실제 객체의 메서드를 호출하는 역할을 한다.
    • 쉽게 말하면은 프록시 객체는 클라이언트가 원래 호출하려는 서비스 객체 앞에 서서 중간에서 요청을 처리하는 대리 역할을 한다.

  • 프록시 객체의 역할
    • 클라이언트가 직접 서비스 객체를 호출하는 게 아니라, 프록시 객체가 대신 호출되는 구조
    • 클라이언트가 특정 메서드를 호출할 때, 실제로는 프록시 객체가 호출을 가로채고, AOP에서 설정한 부가 기능(Advice)이 먼저 실행된다.
    • 프록시 객체는 핵심 비즈니스 로직을 수행하는 서비스 객체를 감싸고 있어서, 부가 기능을 추가하거나 실행 순서를 제어할 수 있다.
  • 프록시 객체의 생성 방식
    • Spring AOP에서는 프록시 패턴을 사용해 AOP를 구현
    • 두 가지 방식으로 생성
      • JDK 동적 프록시 : 서비스 객체가 인터페이스를 구현하고 있을 경우, 인터페이스를 기반으로 동적 프록시 생성
      • CGLIB 프록시 : 만약 서비스 객체가 인터페이스를 구현하지 않았다면, CGLIB 라리브러리 사용하여 해당 클래스를 상속받는 방식으로 프록시 생성

  • 프록시 객체의 동작 과정
    • 클라이언트가 메서드를 호출하면 프록시 객체가 호출을 대신 받음
    • 프록시 객체는 AOP 설정을 확인해서 해당 메서드에 적용할 Advice가 있는지 확인
    • 만약 Advice가 있으면 이를 먼저 실행.
    • 프록시 객체는 실제 서비스 객체의 메서드를 호출해서 핵심 비즈니스 로직을 실행.
    • 메서드 실행 후에는 AfterReturning, AfterThrowing, After 등의 후처리 Advice가 실행된다.
    • 모든 과정이 끝나면 프록시 객체는 그 결과를 클라이언트에게 반환

  • 간단한 흐름 예시
클라이언트 -> 프록시  객체 -> 부가 기능 실행 -> 실제 서비스 객체 메서드 호출 -> 후처리 실행 -> 클라이언트에게 결과 반환

 

 

 

'트러블슈팅' 카테고리의 다른 글

Rest Template과 JDBC Template  (4) 2024.10.20
최적화? Indexing?  (0) 2024.10.18
SQL 기초부터 가보자  (1) 2024.10.04
Kafka란 뭘까?  (0) 2024.09.29
MySQL? PostgerSQL 뭐가 다른거지?  (2) 2024.09.27