스프링 입문 - AOP
이 글은 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 커리큘럼에 맞춰서 작성된 글입니다😀
AOP가 필요한 상황
지금 존재하는 메소드가 엄청 많은데 모든 메소드의 호출 시간을 측정해야 한다면 어떻게 해야할까?
일단 1개의 메소드만 수정한다고 했을 때 System.currentTimeMillis()
을 이용해 구현을 한다면
이렇게 구현이 가능할 것이다.
원래 회원가입과 관련된 내용은 핵심 관심 사항이고,
위 기능을 위해 구현된 내용은 모든 메소드에 적용되므로 공통 관심 사항이라고 한다.
그런데 메소드가 너무 많을 때는 공통 관심 사항을 적용하기가 매우 어려워지게 된다.
- 핵심 관심 사항과 공통 관심 사항이 섞이게 돼서 유지보수가 어렵다
- 즉, 공통 관심 사항(시간 관련 로직)을 수정하려면 모든 로직을 찾아가서 수정해야 한다
이런 경우 일일이 작업하는건 말 그대로 비효율적이기 때문에 AOP를 사용하면 편리해진다고 한다😄
AOP(Aspect Oriented Programming) 적용
AOP를 적용한다는건 핵심 관심 사항과 공통 관심 사항을 분리한 후
원하는 곳에 공통 관심 사항을 적용하는 것을 말한다.
hello.hellospring
에 aop
라는 리포지토리를 만들고 그 안에 TimeTraceAop
라는 클래스를 만들자.
그리고 코드를 다음과 같이 적어주자.
- 클래스 위에 @Aspect 어노테이션을 달아주기
- 스프링 빈 등록을 위해 @Component를 적거나
MemberService
에서 @Bean으로 등록하기 - 위와 같이 메소드
execute()
를 만들어준 후joinPoint.proceed()
리턴 execute()
위에 @Around() 어노테이션 설정 후 적용할 대상을 인자에 입력- 공통 관심 사항 구현(시간 관련 로직)
위 코드에서는 @Around()의 인자로 "execution(* hello.hellospring..*(..))"
이 입력돼 있는데
hello.hellospring
이하의 모든 메소드에 적용됨을 의미한다.
스프링의 AOP 동작 방식은 AOP로 설정된 스프링 빈이 있으면 가짜 스프링 빈(프록시)을 먼저 만든다.
그리고 인젝션이 필요할 때는 가짜 스프링 빈을 일단 이용하고, 후에 joinPoint.proceed()
가 호출되면
그 때 실제 스프링 빈을 호출하게 된다.
정말 가짜 스프링 빈이 호출되는지 알고 싶다면 인젝션받는 메소드에서 println()
을 해보면 된다!
댓글남기기