AOP(Aspect Oriented Programming 관점 지향 프로그래밍)
이번에는 Spring 입문 강좌의 마지막 주제인 AOP이다.
만약 모든 기능에 대해 걸리는 시간을 출력해야 한다고 생각해보자. 그럼 모든 함수에 시작 시간 측정,,, 종료 시간 측정,, 빼서 계산,, 하는 로직을 일일히 넣어줘야한다. 만약 수정이 필요하면 다 일일히 수정해줘야한다. 이럴때 AOP를 사용하면 된다.
시간 측정과 같은 경우를 공통 관심 사항(cross cutting concern)이라고 하고 각 메서드 별로 주요 기능(ex 회원검색)을 핵심 관심 사항(core concern)이라고 할 수 있다.
AOP를 적용하면 공통 관심 사항과 핵심 관심 사항을 분리해줄 수 있다.
이제 코드를 작성해보자.
- hello.hellospring 밑에 aop라는 패키지를 추가해주고 TimeTraceAop.java를 추가
package hello.hellospring.aop; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Aspect; @Aspect // Aop를 사용하기 위한 annotation public class TimeTraceAop { public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); System.out.println("START: " + joinPoint.toString()); try { return joinPoint.proceed(); } finally { long finish = System.currentTimeMillis(); long timeMs = finish - start; System.out.println("END: " + joinPoint.toString() + " " + timeMs + "ms"); } } }
- bean으로 등록해주는데, @Component와 같이 표시해줘서 bean으로 등록하는 대신 SpringConfig파일에 작성해준다. (aop를 등록했구나~ 인지할 수 있도록할 수 있기 때문에 이 방식이 더 선호됨)
@Bean public TimeTraceAop timeTraceAop() { return new TimeTraceAop(); } // 위와 같이 추가해주거나 TimeTraceAop 클래스 위에 Component 어노테이션 추가 @Component
- 공통 관심 사항을 어디에 적용할 건지 타겟팅
@Around("execution(* hello.hellospring..*(..))") // 요걸루 범위 지정 public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
- 실행..!
AOP의 동작방식
AOP를 적용하게 되면 위 이미지에서 노란색의 프록시 memberController, memberService, memberRepository를 먼저 호출하고 그 안에서 joinPoint.proceed()를 통해 실제 클래스를 호출하게 된다.
이제 스프링 입문 강좌가 끝이 났다. 솔직히 스프링으로 개발을 할 수 있다! 는 아니긴 한데,, 스프링이 이런 구조로 이뤄져 있었구나~ 정도는 습득을 한 것 같다. 이제 심화 강의들로 넘어가면서 프로젝트도 하면서 스프링을 본격적으로 시작해볼까한다!!
728x90
반응형
'Java & Spring' 카테고리의 다른 글
[Spring] 핵심원리 기본편 - 스프링 핵심 원리 이해1 (예제만들기) (0) | 2022.06.06 |
---|---|
[Spring] 핵심원리 기본편 - 객체 지향 설계와 스프링 (0) | 2022.05.17 |
[Spring] 입문5 (0) | 2021.11.01 |
[Spring] 입문4 (0) | 2021.10.09 |
[Spring] 입문3 (0) | 2021.10.09 |