Old Branch

Spring Framework Documentation - Spring AOP / Example -1

woolbro 2019. 6. 21. 01:42
반응형

[Java/Spring-framework] - Spring Framework Documentation - IoC Container -2

 

Spring Framework Documentation - IoC Container -2

이전 포스팅입니다 [Java/Spring-framework] - Spring Framework Documentation -3 (IoC Container - 1) Spring Framework Documentation -3 (IoC Container - 1) 이전포스팅입니다 :) [Java/Spring-framework] -..

woolbro.tistory.com

이전 포스팅입니다

 

안녕하세요, 오늘 포스팅 할 내용은 Spring의 AOP, Aspect에 관한 내용입니다.

이전 포스팅에서 알아보았었던 IoC  Container에 관한 내용과 더불어 Spring Documentation에서 핵심 요소로 꼽은 AOP, Aspect에 관하여 알아보고 정리하고자 해요.

 

AOP에 관하여 정리해 놓은 포스팅이 있는데요,

 

[Dev Knowledge] - 관점 지향 프로그래밍, AOP(Aspect-oriented programming)

 

관점 지향 프로그래밍, AOP(Aspect-oriented programming)

Spring을 공부하다가, Spring-AOP 라는 말을 많이 보았습니다. 매번 보면서 아는척 하면서 넘어가기도 그렇고.... 도대체 AOP가 무엇인지 궁금해서 오늘은 AOP에 대해서 공부해 보았습니다.... AOP (Aspect-Orient..

woolbro.tistory.com

 

 

위의 글을 읽으셔도 좋고, 이번 포스팅을 이어 보셔도 좋아요. 정리 한 내용을 바탕으로 쓰는데 너무 어렵네요 ㅠㅡㅠ

 


AOP(Aspect Oriented Programming) 이란

 

위의 포스팅을 읽으셨으면 본 포스팅은 패스 하셔도 괜찮.....을까요 잘 모르겠어요..... 같이 봐주세요~~

 

우선,  스프링 공식 문서를 참조하면 아래와 같이 나와있어요.

 

Aspect-oriented Programming (AOP) complements Object-oriented Programming (OOP) by providing another way of thinking about program structure. The key unit of modularity in OOP is the class, whereas in AOP the unit of modularity is the aspect. Aspects enable the modularization of concerns (such as transaction management) that cut across multiple types and objects. (Such concerns are often termed “crosscutting” concerns in AOP literature.)

.... 알았죠? ㅎㅎㅎㅎ

 

자, 구글의 도움을 받자면...

 

  • AOP란 OOP를 보완하는 구조
  • OOP에서는 클래스 단위로 모듈화, AOP에서는 '관점'으로 모듈화
  • '관점'은 type, object와는 무관하게 '관심사항'으로 모듈화
  • 스프링에서 AOP는 IoC를 보완하며, 뛰어난 미들웨어 솔루션을 제공

 

쉽게 말하면, AOP는 클래스와 관계없이 여러 객체를 관통하는 ‘공통 관심 사항’들에 따라서 묶어서 관리해 줄 수 있는 구조라고 할 수 있을 것 같아요.

운영 및 관리를 쉽게 하려는 목적을 가지고 있는데, 반복적인 코드들을 공통 목적에 따라 묶어 통합된 코드를 작성하는 것입니다.

 

위 포스팅에도 있지만, 다시 한번 AOP에 관한 내용을 정리하고, 메커니즘 / 적용을 보도록 하겠습니다..!

 

조금 길어질 것 같으니까, 두~세개의 포스팅으로 나누어 작성하도록 하겠습니다..!

 

AOP용어

용어 설명
Aspect 여러 객체를 관통하는 ‘공통 관심 사항’을 구현한것을 의미합니다. Spring 에서는 설정을 통해 일반 클래스에 넣는 방식(schema-based approach) 혹은 어노테이션을 활용한 방식으로 클래스에 aspect를 줄수 있습니다.
JoinPoint 특정 작업이 시작되는 시점을 나타내는 포인트로, 메서드 호출이나 예외발생 등의 시점들을 의미합니다.
Advice 특정 join point에서 실행하는 것을 뜻하며, 실행 시점에따라 타입이 나누어집니다.
쉽게 얘기하면, 실질적으로 어떤 일을 해야 할 지에 대한 구현체.
PointCut Join point의 부분집합으로써, 실제 Advice가 실행되는 Join point들의 집합을 의미합니다
Target Object advise가 적용되어질 객체를 의미합니다.
AOP Proxy Aspect를 구현하기위해 AOP 프레임워크에서 만들어낸 객체를 의미합니다.
Introduction proxy 객체에 메소드나 필드를 추가한것을 의미합니다.
Weaving Aspect를 Target object에 적용하는것. 컴파일시, 로드타입시, 런타임시 적용시킬수 있으나 Spring에서는 런타임때 적용시킵니다.

 

AOP Mechanism - AOP Proxy Factory

AOP에 대한 내용을 알아보았으니, Spring에 적용 된 사례를 알아보겠습니다.

public class AOPTest{
	
    public static void main(String[] args){
  
        Something smth = new Something(); // 여기서 Something은 pojo를 말합니다.
        smth.doAnything();
        
    }
}

 

잠깐, 여기서 Pojo란??
- "오래 된 자바 클래스" 라고들 하지만.... 제가 이해하고 쉽게 생각 하기로는 Pojo는 순수하게 setter, getter 메소드로 이루어진 Value Object성의 Bean을 가르키는 말입니다

 

위의 AOPTest클래스의 main에서 실행되는 과정은 다음과 같습니다.

 

 

public class AOPTest_AOP{
	
    public static void main(String[] args){
  
        //여기서 Something은 Pojo이고, 그 이름을 smth로 하겠습니다..
        ProxyFactory factory = new ProxyFactory(new SimplePojo());
        factory.addInterface(Something.class);
        factory.addAdvice(new RetryAdvice());
        factory.setExposeProxy(true);

        Something smth = (Something) factory.getProxy();
        
        smth.doAnything();
        
    }
}

 

위의 AOPTest_AOP 모식도는 아래와 같습니다.

 

 

클라이언트는 결국 smth.doAnything 타깃을 요청하지만 DI를 통해 프록시가 주입되어 메소드 호출이 프록시내에서 일어나면서 프록시는 모든 메서드 call 에 대한 interceptor들을 위임받아 설정한 Advice를 실행 시킬수 있게 됩니다. 이것이 스프링 AOP에서 사용되는 ProxyFactory 패턴 입니다.

 

여기서 proxy란?
클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장하여 클라이언트의 요청을 받아주어 처리하는 대리자 역할.
스프링 AOP에서의 프록시란 말그대로 대리하여 업무를 처리. 함수 호출자는 주요 업무가 아닌 보조 업무를 프록시에게 맡기고, 프록시는 내부적으로 이러한 보조 업무를 처리.
- 주 업무 코드는 보조 업무가 필요한 경우, 해당 Proxy 만 추가하면 되고, 필요없게 되면 Proxy를 제거하면 됨.
- 보조 업무의 탈 부착이 쉬워지고, 그리하여 주 업무 코드는 보조 업무 코드의 변경으로 인해서 발생하는 코드 수정 작업이 필요 없게 됨.

 

우선 여기까지.... 다음포스팅에서 Pointcut, AspectJ 지원등을 보겠습니다!!