문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판이전 판다음 판 | 이전 판 | ||
| spring:home [2018/09/02 13:48] – [외부파일을 이용한 설정] taekgu | spring:home [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 5: | 줄 5: | ||
| * [[spring: | * [[spring: | ||
| + | - [[https:// | ||
| + | - [[https:// | ||
| + | - [[https:// | ||
| ==== DI(Dependency Injection)와 IOC컨테이너 ==== | ==== DI(Dependency Injection)와 IOC컨테이너 ==== | ||
| 줄 172: | 줄 175: | ||
| </ | </ | ||
| + | ==== AOP(Aspect Oriented Promming : 관점지향프로그래밍) ==== | ||
| + | 프로그래밍을 하다 보면, 공통적인 기능이 많이 발생 합니다. 이러한 공통 기능을 모든 모듈에 적용하기 위한 방법으로 상속을 통한 방법이 있습니다. | ||
| + | 상속도 좋은 방법이기는 하지만 몇 가지 문제가 있습니다.우선 JAVA에서는 다중 상속이 불가하므로 다양한 모듈에 상속기법을 통한 공통 기능 부여는 한계가 있습니다. | ||
| + | 그리고, 기능 구현부분에 핵심 기능 코드와 공통 기능 코드가 섞여 있어 효율성이 떨어집니다. | ||
| + | |||
| + | 위의 상속을 통한 방법에 한계가 있어 AOP가 등장하게 되었습니다. | ||
| + | AOP방법은 핵심 기능과 공통 기능을 분리 시켜놓고, | ||
| + | |||
| + | 쉽게 생각해서 아침에 밥을 짓는다고 생각해 봅니다. | ||
| + | 핵심 기능은 쌀을 씻고, 깨끗한 물을 적당히 넣고, 전자밥솥에 내솥을 넣고, 취사 버튼을 누르는 기능들 일 것입니다 | ||
| + | 공통 기능은 수도 꼭지를 열어 물을 받고, 쌀이 깨끗이 씻겼는지 눈으로 판단하고, | ||
| + | 이러한 기능이 공통 기능인 것은 밥을 짓는 행동이 아닐 때도 우리는 수도 꼭지를 열고, 눈으로 사물을 보고 적절한 판단을 하기 때문에 공통 기능이라고 하였습니다. | ||
| + | 어쨌든, 이렇게 핵심 기능과 공통 기능을 분리해 놓고, 추후에 밥을 짓는 행동 말고 팥을 쑬 때도 핵심 기능은 변화지만, | ||
| + | |||
| + | AOP 기법이 바로 이러한 것입니다. 공통 기능을 핵심 기능과 분리해 놓고, 공통 기능 중에서 핵심 기능에 적용하고자 하는 부분에 적용하는 것입니다. | ||
| + | |||
| + | === AOP란? === | ||
| + | Spring에서 AOP구현 방법 : proxy를 이용합니다. | ||
| + | 스프링에서 AOP구현 방식 | ||
| + | * XML스키마기반의 AOP구현 | ||
| + | * @Aspect어노테이션기반의 AOP구현 | ||
| + | 용어정리 | ||
| + | * Aspect : 공통 기능 | ||
| + | * Advice : Aspect의 기능 자체 | ||
| + | * Jointpoint : Advice를 적용해야 되는 부분( ex, 필드, 메소드 ) (스프링에서는 메소드만 해당) | ||
| + | * Pointcut : Jointpoint의 부분으로 실제로 Advice가 적용된 부분 | ||
| + | * Weaving : Advice를 핵심 기능에 적용 하는 행위 | ||
| + | <code xml> | ||
| + | <?xml version=" | ||
| + | <beans xmlns=" | ||
| + | xmlns: | ||
| + | xmlns: | ||
| + | xsi: | ||
| + | http:// | ||
| + | <!-- Root Context: defines shared resources visible to all other web components --> | ||
| + | <bean id=" | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | expression=" | ||
| + | < | ||
| + | </ | ||
| + | </ | ||
| + | <bean id=" | ||
| + | < | ||
| + | < | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | </ | ||
| + | |||
| + | <code java> | ||
| + | package com.taekgu.ex; | ||
| + | |||
| + | import org.aspectj.lang.ProceedingJoinPoint; | ||
| + | |||
| + | public class LogAop { | ||
| + | public Object loggerAop(ProceedingJoinPoint joinpoint) throws Throwable { | ||
| + | String signatureStr = joinpoint.getSignature().toShortString(); | ||
| + | System.out.println(signatureStr + "is start." | ||
| + | long st = System.currentTimeMillis(); | ||
| + | try { | ||
| + | Object obj = joinpoint.proceed(); | ||
| + | return obj; | ||
| + | } finally { | ||
| + | long et = System.currentTimeMillis(); | ||
| + | System.out.println(signatureStr + " is finished." | ||
| + | System.out.println(signatureStr + " 경과시간 " + (et - st)); | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | </ | ||