관점 지향 프로그래밍: Difference between revisions
From CS Wiki
No edit summary |
No edit summary |
||
Line 6: | Line 6: | ||
[[파일:AOP의 핵심관심과 횡단관심.jpg]] | [[파일:AOP의 핵심관심과 횡단관심.jpg]] | ||
* 핵심 기능(Core Concerns, Primary Concerns): 핵심 업무 로직을 수행하는 기능 | *핵심 기능(Core Concerns, Primary Concerns): 핵심 업무 로직을 수행하는 기능 | ||
* 부가 기능(Cross-cutting Concerns): 핵심 기능을 도와주는 부가적인 기능(로깅, 보안 등) | *부가 기능(Cross-cutting Concerns): 핵심 기능을 도와주는 부가적인 기능(로깅, 보안 등) | ||
==용어== | ==용어== | ||
Line 45: | Line 45: | ||
|} | |} | ||
== 구현 == | ==구현== | ||
* JAVA에선 AOP를 위한 [[AspectJ]]를 지원한다. | *JAVA에선 AOP를 위한 [[AspectJ]]를 지원한다. | ||
* [[스프링 프레임워크]]에선 [[스프링 AOP]]를 통해 AOP를 쉽게 구현할 수 있도록 도와준다. | *[[스프링 프레임워크]]에선 [[스프링 AOP]]를 통해 AOP를 쉽게 구현할 수 있도록 도와준다. | ||
=== Advice === | ===Advice=== | ||
* Before: Target을 실행하기전에 부가 기능 실행 | *Before: Target을 실행하기전에 부가 기능 실행 | ||
* After: Target실행 후 (해당 Target Exception 또는 정상리턴 여부 상관없이) 실행 | *After: Target실행 후 (해당 Target Exception 또는 정상리턴 여부 상관없이) 실행 | ||
* Around: Before + AfterReturning | *Around: Before + AfterReturning | ||
* AfterReturning: Target 실행 후 성공적인 리턴할 때 실행 | *AfterReturning: Target 실행 후 성공적인 리턴할 때 실행 | ||
* AfterThrowing: Target을 실행하다가 Exception 던질 때 실행 | *AfterThrowing: Target을 실행하다가 Exception 던질 때 실행 | ||
=== Weaving === | ===Weaving=== | ||
Aspect(부가기능)와 Application(핵심기능)의 Linking을 하는 과정이다. 해당 객체들을 묶어 새로운 객체를 생성한다. | Aspect(부가기능)와 Application(핵심기능)의 Linking을 하는 과정이다. 해당 객체들을 묶어 새로운 객체를 생성한다. | ||
==== '''Spring AOP''' ==== | ===='''Spring AOP'''==== | ||
인터페이스 | * [[스프링 AOP]]의 Weaving은 RunTime이다(프록시 빈 생성하는 것, IoC 컨테이너 초기화 작업할 때, 즉 WAS 가동할 때) | ||
* '''종류''' | |||
** JDK Dynamic Proxy: 인터페이스 기준 | |||
*** 스프링 AOP는 JDK Dynamic Proxy 패턴을 선호 | |||
** CGLib Proxy: Class 기준 | |||
*** AspectJ의 Weaving 처럼 바이트 코드를 조작 | |||
==== '''AspectJ''' ==== | ===='''AspectJ'''==== | ||
AJC(Aspect Compiler)를 이용하여 Woven System 생성. 즉 부가기능과 핵심기능이 합쳐진 클래스 파일을 생성 | |||
* '''Compile-Time Weaving''': Aspect의 클래스와 Aspect를 사용하는 | * 종류 | ||
** '''Compile-Time Weaving''': Aspect의 클래스와 Aspect를 사용하는 클래스들을 AJC를 통해 컴파일 | |||
* '''Load-Time Weaving''': 클래스로더를 통해 클래스가 JVM에 로딩되는 시점에 클래스의 바이트 코드를 | *** 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
- 객체를 핵심관심과 횡단관심으로 구분하여 처리하는 프로그래밍 기법
- 핵심 기능(Core Concerns, Primary Concerns): 핵심 업무 로직을 수행하는 기능
- 부가 기능(Cross-cutting Concerns): 핵심 기능을 도와주는 부가적인 기능(로깅, 보안 등)
용어[edit | edit source]
용어 | 설명 |
---|---|
Joinpoint |
|
Advice |
|
Target |
|
Pointcut |
|
Aspect |
|
Weaving |
|
구현[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 처럼 바이트 코드를 조작
- JDK Dynamic Proxy: 인터페이스 기준
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보다 속도 느라ㅣㅁ
- Compile-Time Weaving: Aspect의 클래스와 Aspect를 사용하는 클래스들을 AJC를 통해 컴파일