본 게시글은 하단 강의를 듣고 학습한 내용을 제 생각으로 요약, 정리한 글입니다.
- 목차
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 동작 방식
- 실제 Proxy가 주입되는지 콘솔에 출력해서 확인
AOP 적용 전 의존 관계 그림

AOP 적용 후 의존 관계 그림

AOP 적용 전 전체 그림

AOP 적용 후 전체 그림

MemberController.java
터미널(출력 결과)
2) AOP 적용
- AOP 패키지 만들기
hello.hellospring.aop
- TimeTraceAop 클래스 만들기
TimeTraceAop.java
- @Aspect 붙이기
- 에러) @Aspect 임포트가 안됨
- 해결)
- aop 의존성 추가하기 위해 build gradle에
implementation 'org.springframework.boot:spring-boot-starter-aop'추가 - 추가하고 build.gradle을 수정한 후 reload버튼을 클릭
reload 버튼 위치
build.gradle 수정 후 좌측에 Gradle 창 열면 코드 좌측 상단에 자동으로 함께 뜸

- 코드 작성
main/java/hello.hellospring.aop/TimeTraceAop.java
- 스프링 빈으로 등록하기
1) @Component 붙여서 컴포넌트 스캔
main/java/hello.hellospring.aop/TimeTraceAop.java
2) 스프링 빈에 등록해서 쓰기
main/java/hello.hellospring/SpringConfig
- 공통 관심사를 어디에 적용할지 타겟팅 @Around
- 적용 대상 변경
- ex) service에만 적용
main/java/hello.hellospring.aop/TimeTraceAop.java
@Around("execution(* hello.hellospring.service..*(..))")- 기존에 적어둔 시간 측정 코드 주석 처리하고 원래대로 되돌리기
main/java/hello.hellospring.service/MemberService.jav
- 회원 목록 들어가서 시간 측정 결과 확인

![[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의](https://www.notion.so/image/https%3A%2F%2Fcdn.inflearn.com%2Fpublic%2Fcourses%2F325630%2Fcover%2F56f635a3-3a44-4096-a16b-453ea1696b1a%2F325630-eng.png?table=block&id=c8bd1269-936f-4ad5-a69f-2b520e65a4af&cache=v2)