1. AOP가 필요한 상황
1) AOP가 필요한 상황
•
예시
◦
상황) 모든 메서드의 호출 시간을 측정하고 싶음
코드) 각 메서드에 시간 측정 코드 넣음
◦
문제)
▪
회원 가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아님
▪
시간을 측정하는 로직은 공통 관심 사항임.
▪
시간을 측정하는 로직과 핵심 비즈니스 로직이 섞여 있어 유지 보수가 어려움
▪
시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어려움
▪
시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 함
◦
해결) AOP(Aspect Oriented Programming) 사용
▪
공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리
2. AOP 적용
1) AOP란
•
정의) 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리
그림) 분리한 공통 관심 사항을 원하는 곳에 적용
•
장점)
◦
회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리함
◦
시간을 측정하는 로직을 별도의 공통 로직으로 만듦
◦
핵심 관심 사항을 깔끔하게 유지할 수 있음.
◦
변경이 필요하면 이 로직만 변경하면 됨
◦
원하는 적용 대상을 선택할 수 있음
•
스프링의 AOP 동작 방식
AOP 적용 전 의존 관계 그림
AOP 적용 후 의존 관계 그림
AOP 적용 전 전체 그림
AOP 적용 후 전체 그림
◦
실제 Proxy가 주입되는지 콘솔에 출력해서 확인
MemberController.java
터미널(출력 결과)
2) AOP 적용
1.
AOP 패키지 만들기 hello.hellospring.aop
2.
TimeTraceAop 클래스 만들기
TimeTraceAop.java
3.
@Aspect 붙이기
•
에러) @Aspect 임포트가 안됨
•
해결)
◦
aop 의존성 추가하기 위해 build gradle에 implementation 'org.springframework.boot:spring-boot-starter-aop' 추가
◦
추가하고 build.gradle을 수정한 후 reload버튼을 클릭
reload 버튼 위치
4.
코드 작성
main/java/hello.hellospring.aop/TimeTraceAop.java
5.
스프링 빈으로 등록하기
1) @Component 붙여서 컴포넌트 스캔
main/java/hello.hellospring.aop/TimeTraceAop.java
2) 스프링 빈에 등록해서 쓰기
main/java/hello.hellospring/SpringConfig
6.
공통 관심사를 어디에 적용할지 타겟팅 @Around
main/java/hello.hellospring.aop/TimeTraceAop.java
•
적용 대상 변경
◦
ex) service에만 적용
@Around("execution(* hello.hellospring.service..*(..))")
7.
기존에 적어둔 시간 측정 코드 주석 처리하고 원래대로 되돌리기
main/java/hello.hellospring.service/MemberService.jav
8.
회원 목록 들어가서 시간 측정 결과 확인
터미널 (전체 적용)
터미널 (service만 적용)