전체 보기
📙

[스프링 입문] 7. AOP

작성일자
2022/10/22
태그
SUB PAGE
프로젝트
스프링 입문
책 종류
1 more property
목차

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만 적용)