관점 지향 프로그래밍: Difference between revisions

From CS Wiki
No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
[[분류:소프트웨어 공학]]
[[분류:소프트웨어 공학]]
;AOP; Aspect Oriented Programming
;AOP; Aspect Oriented Programming
;객체를 핵심관심과 횡단관심으로 구분하여 처리하는 프로그래밍 기법
;객체를 핵심관심과 횡단관심으로 구분하여 처리하는 프로그래밍 기법
Line 5: Line 6:
[[파일:AOP의 핵심관심과 횡단관심.jpg]]
[[파일:AOP의 핵심관심과 횡단관심.jpg]]


== 용어 ==
*핵심 기능(Core Concerns, Primary Concerns): 핵심 업무 로직을 수행하는 기능
*부가 기능(Cross-cutting Concerns): 핵심 기능을 도와주는 부가적인 기능(로깅, 보안 등)
 
==용어==
[[파일:AOP 개요도.png|500x500픽셀]]<br />
{| class="wikitable"
{| class="wikitable"
|-
|-
! 용어 !! 설명
!용어!!설명
|-
|-
| Joinpoint  
|Joinpoint
||  
||
* 메소드를 호출하는 '시점', 예외가 발생하는 '시점'과 같이 애플리케이션을 실행할 때 특정 작업이 실행되는 '시점'을 의미
*메소드를 호출하는 '시점', 예외가 발생하는 '시점'과 같이 애플리케이션을 실행할 때 특정 작업이 실행되는 '시점'을 의미
|-
|-
| Advice  
|Advice
||
||
* Joinpoint에서 실행되어야 하는 코드
*Joinpoint에서 실행되어야 하는 코드
* 횡단관점에 해당함 (트랜잭션/로그/보안/인증등..)
*횡단관점에 해당함 (트랜잭션/로그/보안/인증등..)
|-
|-
| Target
|Target
||
||
* 실질적인 비즈니스 로직을 구현하고 있는 코드
*실질적인 비즈니스 로직을 구현하고 있는 코드
* 핵심관점에 해당함 (업무로직)
*핵심관점에 해당함 (업무로직)
|-
|-
| Pointcut  
|Pointcut
||  
||
* Target 클래스와 Advice가 결합(Weaving)될 때 둘 사이의 결합규칙을 정의하는 것이다
*Target 클래스와 Advice가 결합(Weaving)될 때 둘 사이의 결합규칙을 정의하는 것이다
* 예로 Advice가 실행된 Target의 특정 메소드등을 지정
*예로 Advice가 실행된 Target의 특정 메소드등을 지정
|-
|-
| Aspect  
|Aspect
||  
||
* Advice와 Pointcut을 합쳐서 하나의 Aspect라고 한다.
*Advice와 Pointcut을 합쳐서 하나의 Aspect라고 한다.
* 즉 일정한 패턴을 가지는 클래스에 Advice를 적용하도록 지원할 수 있는 것을 Aspect라고 한다.
*즉 일정한 패턴을 가지는 클래스에 Advice를 적용하도록 지원할 수 있는 것을 Aspect라고 한다.
|-
|-
| Weaving
|Weaving
||
||
* AOP에서 Joinpoint들을 Advice로 감싸는 과정을 Weaving이라고 한다.
*AOP에서 Joinpoint들을 Advice로 감싸는 과정을 Weaving이라고 한다.
* Weaving 하는 작업을 도와주는 것이 AOP 툴이 하는 역할이다
*Weaving 하는 작업을 도와주는 것이 AOP 툴이 하는 역할이다
|}
|}
==구현==
*JAVA에선 AOP를 위한 [[AspectJ]]를 지원한다.
*[[스프링 프레임워크]]에선 [[스프링 AOP]]를 통해 AOP를 쉽게 구현할 수 있도록 도와준다.
===Advice===
*Before: Target을 실행하기전에 부가 기능 실행
*After: Target실행 후 (해당 Target Exception 또는 정상리턴 여부 상관없이) 실행
*Around: Before + AfterReturning
*AfterReturning: Target 실행 후 성공적인 리턴할 때 실행
*AfterThrowing: Target을 실행하다가 Exception 던질 때 실행
===Weaving===
Aspect(부가기능)와 Application(핵심기능)의 Linking을 하는 과정이다. 해당 객체들을 묶어 새로운 객체를 생성한다.
===='''Spring AOP'''====
* [[스프링 AOP]]의 Weaving은 RunTime이다(프록시 빈 생성하는 것, IoC 컨테이너 초기화 작업할 때, 즉 WAS 가동할 때)
* '''종류'''
** JDK Dynamic Proxy: 인터페이스 기준 
*** 스프링 AOP는 JDK Dynamic Proxy 패턴을 선호
** CGLib Proxy: Class 기준
*** AspectJ의 Weaving 처럼 바이트 코드를 조작
===='''AspectJ'''====
AJC(Aspect Compiler)를 이용하여 Woven System 생성. 즉 부가기능과 핵심기능이 합쳐진 클래스 파일을 생성
* 종류
** '''Compile-Time Weaving''': Aspect의 클래스와 Aspect를 사용하는 클래스들을 AJC를 통해 컴파일
*** JAR를 이용하여 Weaving을 하는 경우, Post-Compile Weaving(Binary Weaving)을 사용하며, 일반 소스 코드의 경우, 일반 Compile-Time Weaving을 사용
** '''Load-Time Weaving''': 클래스로더를 통해 클래스가 JVM에 로딩되는 시점에 클래스의 바이트 코드를 조작
*** 객체를 메모리에 적재할 때 Weaving을 실현한다. 다른 Weaving보다 속도 느라ㅣㅁ

Latest revision as of 09:54, 17 March 2020


AOP; Aspect Oriented Programming
객체를 핵심관심과 횡단관심으로 구분하여 처리하는 프로그래밍 기법

AOP의 핵심관심과 횡단관심.jpg

  • 핵심 기능(Core Concerns, Primary Concerns): 핵심 업무 로직을 수행하는 기능
  • 부가 기능(Cross-cutting Concerns): 핵심 기능을 도와주는 부가적인 기능(로깅, 보안 등)

용어[edit | edit source]

500x500픽셀

용어 설명
Joinpoint
  • 메소드를 호출하는 '시점', 예외가 발생하는 '시점'과 같이 애플리케이션을 실행할 때 특정 작업이 실행되는 '시점'을 의미
Advice
  • Joinpoint에서 실행되어야 하는 코드
  • 횡단관점에 해당함 (트랜잭션/로그/보안/인증등..)
Target
  • 실질적인 비즈니스 로직을 구현하고 있는 코드
  • 핵심관점에 해당함 (업무로직)
Pointcut
  • Target 클래스와 Advice가 결합(Weaving)될 때 둘 사이의 결합규칙을 정의하는 것이다
  • 예로 Advice가 실행된 Target의 특정 메소드등을 지정
Aspect
  • Advice와 Pointcut을 합쳐서 하나의 Aspect라고 한다.
  • 즉 일정한 패턴을 가지는 클래스에 Advice를 적용하도록 지원할 수 있는 것을 Aspect라고 한다.
Weaving
  • AOP에서 Joinpoint들을 Advice로 감싸는 과정을 Weaving이라고 한다.
  • Weaving 하는 작업을 도와주는 것이 AOP 툴이 하는 역할이다

구현[edit | edit source]

Advice[edit | edit source]

  • Before: Target을 실행하기전에 부가 기능 실행
  • After: Target실행 후 (해당 Target Exception 또는 정상리턴 여부 상관없이) 실행
  • Around: Before + AfterReturning
  • AfterReturning: Target 실행 후 성공적인 리턴할 때 실행
  • AfterThrowing: Target을 실행하다가 Exception 던질 때 실행

Weaving[edit | edit source]

Aspect(부가기능)와 Application(핵심기능)의 Linking을 하는 과정이다. 해당 객체들을 묶어 새로운 객체를 생성한다.

Spring AOP[edit | edit source]

  • 스프링 AOP의 Weaving은 RunTime이다(프록시 빈 생성하는 것, IoC 컨테이너 초기화 작업할 때, 즉 WAS 가동할 때)
  • 종류
    • JDK Dynamic Proxy: 인터페이스 기준
      • 스프링 AOP는 JDK Dynamic Proxy 패턴을 선호
    • CGLib Proxy: Class 기준
      • AspectJ의 Weaving 처럼 바이트 코드를 조작

AspectJ[edit | edit source]

AJC(Aspect Compiler)를 이용하여 Woven System 생성. 즉 부가기능과 핵심기능이 합쳐진 클래스 파일을 생성

  • 종류
    • Compile-Time Weaving: Aspect의 클래스와 Aspect를 사용하는 클래스들을 AJC를 통해 컴파일
      • JAR를 이용하여 Weaving을 하는 경우, Post-Compile Weaving(Binary Weaving)을 사용하며, 일반 소스 코드의 경우, 일반 Compile-Time Weaving을 사용
    • Load-Time Weaving: 클래스로더를 통해 클래스가 JVM에 로딩되는 시점에 클래스의 바이트 코드를 조작
      • 객체를 메모리에 적재할 때 Weaving을 실현한다. 다른 Weaving보다 속도 느라ㅣㅁ