(인프런) 김영한님의 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술을 공부하고 리뷰한 글입니다.
1. AOP 적용
AOP: Aspect Oriented Programming
공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리
1. 시간 측정 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;
// AOP 적용, 스프링 빈 등록
@Aspect
@Component
public class TimeTraceAop {
// 공통관심사항을 적용할 곳(hello.hellospring 패키지 하위 모두) 타겟팅
@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");
}
}
}
스프링 빈을 등록하는 방법은 컴포넌트 스캔 방식과 SpringConfig에 직접 등록해주는 방식 2가지가 있다.
여기서는 간단한게 컴포넌트 스캔 방식인 @Component 어노테이션을 사용하여 스프링 빈으로 등록했다. 하지만 TimeTraceAop 같은 경우는 공통 관심 사항이기 때문에 SpringConfig 파일에 직접 빈으로 등록해주는 것을 추천한다.
메서드 호출할 때마다 인터셉트가 걸려서 동작하는 방식임
2. 실행 결과
1) localhost:8080 실행
2) 회원 목록 클릭
3) 회원 가입 클릭
4) id 입력 후 등록
3. 해결
- 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다.
- 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
- 핵심 관심 사항을 깔끔하게 유지할 수 있다.
- 변경이 필요하면 이 로직만 변경하면 된다.
- 원하는 적용 대상을 선택할 수 있다.(타겟팅)
2. 스프링의 AOP 동작 방식 설명
AOP는 Proxy를 호출한다!
1. AOP 적용 전 의존관계
2. AOP 적용 후 의존관계
1) AOP를 적용하면 Proxy(가짜 memberService)를 만들어낸다.
2) 실제로는 memberController가 memberService라는 Proxy(가짜 memberService)를 호출한다.
3) joinPoint.proceed()가 호출되면 실제 memberService가 호출된다.
<Proxy 주입 콘솔에서 출력해서 확인하기>
@Controller
public class MemberController {
// private final MemberService memberService = new MemberService();
// 스프링 컨테이너에 스프링 빈으로 등록을 해두고 가져다 쓰는 방식(같은 MemberService를 공유하도록)
private final MemberService memberService;
// 회원 컨트롤러 & 회원 서비스 연결
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
// memberController가 Proxy(가짜 memberService)를 호출함을 확인
System.out.println("memberService = " + memberService.getClass());
...
}
아래와 같이 실제 MemberService가 아닌 뒤에 무엇인가 붙은 Proxy가 주입되는 것을 확인할 수 있다.
3. AOP 적용 전 전체 그림
4. AOP 적용 후 전체 그림
'Spring > 스프링 입문' 카테고리의 다른 글
[스프링 입문] 07. AOP - AOP가 필요한 상황 (0) | 2022.05.02 |
---|---|
[스프링 입문] 06. 스프링 DB 접근 기술 - 스프링 데이터 JPA (0) | 2022.05.02 |
[스프링 입문] 06. 스프링 DB 접근 기술 - JPA (0) | 2022.04.29 |
[스프링 입문] 06. 스프링 DB 접근 기술 - 스프링 JdbcTemplate (0) | 2022.04.29 |
[스프링 입문] 06. 스프링 DB 접근 기술 - 스프링 통합 테스트 (0) | 2022.04.29 |