Spring - AOP

이지윤·2022년 5월 6일
0

Aspect Oriented Programming 개요

AOP 정의를 위한 기본 용어

관심사

  • 어플리케이션을 개발하기 위한 구현 기능들 "관심사"
  • 어플리케이션의 비즈니스 중요 기능들을 "핵심 관심사"

횡단 관심사

  • 여러 모듈에 걸쳐 공통적이고 반복적으로 필요로 하는 처리 내용을 "횡단 관심사"

횡단 관심사 분리

  • 횡단 관심사를 한 곳으로 모은 것 "횡단 관심사의 분리"
  • 이를 실현하는 방법 "관점지향 프로그래밍"

AOP 정의

  • 관점 지향 프로그래밍
  • 여러 비즈니스 모듈에서 공통으로 사용되는 횡단 관심사를 중심으로 설계, 개발하는 프로그래밍 기법
  • 객체지향 프로그래밍보다 완성도 높인 프로그래밍 패러다임

회원, 상품, 배송 서비스는 해당 도메인에 대한 핵심 서비스를 제공하지만, 이 모듈들은 인증, 보안, 트랜잭션, 캐싱, 로깅 같은 보조 기능들도 필요로 한다.

AOP 목적

  • DI는 어플리케이션 객체 간의 결합도를 낮춤
  • AOP는 횡단 관심사와 이에 영향 받는 객체 간 결합도를 낮춤

AOP 장점

  • 전체 코드에 흩어져 있는 관심사들이 하나의 장소로 응집
  • 기타 비즈니스 모듈들은 본질적인 처리들을 위한 핵심 기능에 대한 코드만 기술
  • 공통 관심사들은 공통 모듈로 옮겨지므로 코드가 깔끔

AOP 주요 용어

  • Advice

    • 조인 포인트에 삽입되어 실행되는 코드, 횡단 관심사 구현 부분
  • Join Point

    • 횡단 관심사가 실행되는 지점 또는 시점으로 Advice 적용 가능 지점들
    • Ex) 「클래스의 인스턴스 생성 시점」, 「메소드 호출 시점」 및 「예외 발생 시점」
  • Pointcut

    • 수많은 Join Point 중에서 실제 적용될 지점들
    • 표현식으로 선발
    • 설정은 XML, 애노테이션 방식 사용
  • Aspect

    • 공통 관심사의 추상적 명칭
    • Advice + Pointcut
  • Target

    • 핵심 로직을 구현하는 클래스
    • 횡단 관심사를 적용 받게 되는 대상
    • Advice가 적용되는 객체
  • Introdution

    • Target에는 없는 새로운 메소드나 인스턴스 변수들을 추가
  • Weaving

    • Advice + Target -> Proxy 객체를 만드는 과정
  • Proxy

    • Advice가 적용되었을 때 만들어지는 객체

스프링이 제공하는 Advice 유형

  • Before : 조인포인트 앞에서 실행할 Advice
  • After : 조인포인트 뒤에서 실행할 Advice
  • After returning : 조인포인트가 완전히 종료된 다음에 실행되는 Advice
  • Around : 조인포인트 앞뒤에서 실행되는 Advice
  • After throwing : 조인포인트에서 예외가 발생했을 때 실행되는 Advice

스프링 AOP 설계 방식 : Proxy 패턴 방식을 통해 구현

프록시 패턴

  • 어떤 객체를 사용하고자 할 때, 객체를 직접적으로 참조하는 것이 아니라, 그 객체를 대행하는 객체를 통해 대상객체에 접근하는 방식
  • 스프링 컨테이너 초기화 과정에서 스프링 빈 객체를 대행할 프록시 객체 생성
  • 객체 핵심 코드에 대한 영향없이 객체의 접근 전/후에 대한 중요 처리 가능

프록시 패턴 코드

 
interface Server {
	public void responce(); 
}

class HttpServer implements Server { 
	private String filename;
    
	public HttpServer(String filename) {
		this.filename = filename; 
    }
    
	private void responce() {
		System.out.println("responce " + filename);
    }
}

class ProxyServer implements Server { 		
	private String filename;
	private Server server;
	
    public ProxyServer(String filename) {
		this.filename = filename; 
    }
    
	public void responce() { 
	if (server == null)
	{
		server = new HttpServer(filename);
	}
		server. responce();
	} 
}

class ProxyExample {
	public static void main(String[] args) {
	Server server1 = new ProxyServer("main_1.html"); 
    Server server2 = new ProxyServer("main_2.html"); 
    server1. responce();
	server2. responce();
	} 
}
   

AOP 구현 3가지 방법

  • XML을 이용한 AOP 구현
    ☞ XML 스키마 기반의 POJO 클래스 이용한 AOP
  • Annotation을 이용한 AOP 구현
    ☞ 애노테이션 기반의 AOP 구현
  • Java 코드를 이용한 AOP 구현
    ☞ Java 기반의 AOP 구현
profile
초보자

0개의 댓글