📙

[스프링 입문] 7. AOP

작성일자
Oct 22, 2022
태그
SUB PAGE
프로젝트
스프링 입문
책 종류
본 게시글은 하단 강의를 듣고 학습한 내용을 제 생각으로 요약, 정리한 글입니다.

1. AOP가 필요한 상황

1) AOP가 필요한 상황

  • 예시
    • 상황) 모든 메서드의 호출 시간을 측정하고 싶음
    • 코드) 각 메서드에 시간 측정 코드 넣음
    • 문제)
      • 회원 가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아님
      • 시간을 측정하는 로직은 공통 관심 사항임.
      • 시간을 측정하는 로직과 핵심 비즈니스 로직이 섞여 있어 유지 보수가 어려움
      • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어려움
      • 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 함
    • 해결) AOP(Aspect Oriented Programming) 사용
      • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리
      •  

2. AOP 적용

1) AOP란

  • 정의) 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리
    • 그림) 분리한 공통 관심 사항을 원하는 곳에 적용
      notion image
  • 장점)
    • 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리함
    • 시간을 측정하는 로직을 별도의 공통 로직으로 만듦
    • 핵심 관심 사항을 깔끔하게 유지할 수 있음.
    • 변경이 필요하면 이 로직만 변경하면 됨
    • 원하는 적용 대상을 선택할 수 있음
  • 스프링의 AOP 동작 방식
    • AOP 적용 전 의존 관계 그림
      notion image
      AOP 적용 후 의존 관계 그림
      notion image
      AOP 적용 전 전체 그림
      notion image
      AOP 적용 후 전체 그림
      notion image
    • 실제 Proxy가 주입되는지 콘솔에 출력해서 확인
      • MemberController.java
        터미널(출력 결과)

2) AOP 적용

  1. AOP 패키지 만들기 hello.hellospring.aop
  1. TimeTraceAop 클래스 만들기
    1. TimeTraceAop.java
  1. @Aspect 붙이기
      • 에러) @Aspect 임포트가 안됨
      • 해결)
        • aop 의존성 추가하기 위해 build gradle에 implementation 'org.springframework.boot:spring-boot-starter-aop' 추가
        • 추가하고 build.gradle을 수정한 후 reload버튼을 클릭
          • reload 버튼 위치
            build.gradle 수정 후 좌측에 Gradle 창 열면 코드 좌측 상단에 자동으로 함께 뜸
            notion image
  1. 코드 작성
    1. main/java/hello.hellospring.aop/TimeTraceAop.java
  1. 스프링 빈으로 등록하기
    1. 1) @Component 붙여서 컴포넌트 스캔
      main/java/hello.hellospring.aop/TimeTraceAop.java
      2) 스프링 빈에 등록해서 쓰기
      main/java/hello.hellospring/SpringConfig
  1. 공통 관심사를 어디에 적용할지 타겟팅 @Around
    1. main/java/hello.hellospring.aop/TimeTraceAop.java
      • 적용 대상 변경
        • ex) service에만 적용
          • @Around("execution(* hello.hellospring.service..*(..))")
  1. 기존에 적어둔 시간 측정 코드 주석 처리하고 원래대로 되돌리기
    1. main/java/hello.hellospring.service/MemberService.jav
  1. 회원 목록 들어가서 시간 측정 결과 확인
    1. 터미널 (전체 적용)
      터미널 (service만 적용)
       
[스프링 입문] 7. AOP