티스토리 뷰

 본 포스팅은 인프런 김영한 강사님의 스프링 부트 입문 강의 섹션 7 <AOP> 수강하고 배운 점을 정리했습니다.

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세

www.inflearn.com

 

AOP란?

객체 지향 프로그래밍 패러다임을 보완하는 기술로 메서드나 객체의 기능을 핵심 관심사(Core Concern)와 공통 관심사(Cross-cutting Concern)로 나누어 프로그래밍하는 것

 

“핵심 관심사”는 각 객체가 가져야 할 본래의 기능이며, “공통 관심사”는 여러 객체에서 공통적으로 사용되는 코드를 말한다.

여러 개의 클래스에서 반복해서 사용하는 코드가 있다면 해당 코드를 모듈화 하여 공통 관심사로 분리한다. 이렇게 분리한 공통 관심사를 Aspect로 정의하고 Aspect를 적용할 메서드나 클래스에 Advice를 적용하여 공통 관심사와 핵심 관심사를 분리할 수 있다. 이렇게 AOP에서는 공통 관심사를 별도의 모듈로 분리하여 관리하며, 이를 통해 코드의 재사용성과 유지 보수성을 높일 수 있다.

 

시간 측정 AOP 등록

package hello.hellospring.aop;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class TimeTraceAop {

 	@Around("execution(* hello.hellospring..*(..))")
 	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");
 		}
 	}
}
  • 공통 관심사항 적용 방법: @Around 애노테이션 우측 경로 부분에 작성. 
    • 위의 코드의 경우에는 hello.hellospring 하위 패키지에 다 적용하는 것이다. 
    • (service 패키지에만 적용하고 싶을 때: 경로를 'hello.hellospring.service'로 변경한다)
  • timeTraceAop 클래스를 스프링빈에 등록하는 방법 (1) 단순하게 위에 @component 애노테이션 쓰기 (2) SpringConfig에 등록하기. 여기서는(1) 사용. 
    • 이때 (1), (2) 둘 중 하나만 사용해야 함. 두 개 다 쓰면 오류 배출
  • AOP의 효과
    1. 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다.
    2. 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
    3. 핵심 관심 사항을 깔끔하게 유지할 수 있다.
    4. 변경이 필요하면 이 로직만 변경하면 된다.
    5. 원하는 적용 대상을 선택할 수 있다.

 

AOP 적용 전 의존 관계

 

AOP 적용 후 의존 관계

원리: AOP 적용을 지정하면, 프록시 멤버 서비스를 생성한다.

컨테이너에 스프링빈을 등록할 때 실제 스프링빈이 아닌 프록시 스프링 빈을 앞에 세워두고,

프록시가 종료하면 jointpoing.proceed를 불러서 실제 멤버 서비스가 호출되는 원리이다. 

 

프록시 서버의 사용은 memberController에 간단한 코드를 추가해서 콘솔 출력으로 확인할 수 있다.

 System.out.println("Proxy 확인 - memberService: "+ memberService.getClass());

memberservice 뒤에 'EnchancerBySpring'이라고 적힌 모습을 확인할 수 있다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함