SpringBoot/기초

AOP

2023. 3. 12. 18:09
목차
  1. AOP가 필요한 상황
  2. MemberService 회원 조회 시간 측정 추가
  3. AOP 적용
  4. 시간 측정 AOP 등록
  5. 해결
  6. 스프링의 AOP 동작 방식 설명
  7. AOP 적용 전 의존관계
  8. AOP 적용 후 의존관계
  9. AOP 적용 전 전체 그림
  10. AOP 적용 후 전체 그림

AOP가 필요한 상황

  • 모든 메서드의 호출 시간을 측정하고 싶다면?
  • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
  • 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?

 

MemberService 회원 조회 시간 측정 추가

@Transactional
public class MemberService {

    private final MemberRepository memberRepository;

    public MemberService(MemberRepository memberRepository) {
        this.memberRepository = memberRepository;
    }

    /**
     * 회원 가입
     */
    public Long join(Member member) {

        long start = System.currentTimeMillis();

        // 같은 이름이 있는 중복 회원X
        try {
            validateDuplicateMember(member);  // 중복 회원 검증
            memberRepository.save(member);
            return member.getId();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("join = " + timeMs + "ms");
        }

    /**
     * 전체 회원 조회
     */
    public List<Member> findMembers() {
        long start = System.currentTimeMillis();
        try {
            return memberRepository.findAll();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;
            System.out.println("findMembers = " + timeMs + "ms");
        }
    }

 

문제

  • 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다
  • 시간을 측정하는 로직은 공통 관심 사항이다.
  • 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
  • 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.

 

 

AOP 적용

  • AOP: Aspect Oriented Programming
  • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리

전
후

 

 

시간 측정 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;

@Aspect
@Component
public class TimeTraceAop {

    @Around("execution(* hello.hellospring..*(..))")   //어디에 적용할지 타켓팅. 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");
        }
    }
}

 

아래와 같이 컴포넌트 스캔 말고 빈으로 등록해서 사용할 수도 있다.

@Configuration
public class SpringConfig {
	...

    @Bean
    public TimeTraceAop timeTraceAop() {
        return new TimeTraceAop();
    }
    
    ...
}

 

실행시켜서 회원목록을 조회해 보면

 

해결

  • 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
  • 핵심 관심 사항을 깔끔하게 유지할 수 있다.
  • 변경이 필요하면 이 로직만 변경하면 된다.
  • 원하는 적용 대상을 선택할 수 있다.

 

스프링의 AOP 동작 방식 설명

AOP 적용 전 의존관계

 

AOP 적용 후 의존관계

@Controller
public class MemberController {

    private MemberService memberService;

    @Autowired
    public MemberController(MemberService memberService) {
        this.memberService = memberService;
        System.out.println("memberService = " + memberService.getClass());
    }

 

AOP 적용 전 전체 그림

 

AOP 적용 후 전체 그림

'SpringBoot > 기초' 카테고리의 다른 글

스프링 DB 접근 기술(3) - JPA  (0) 2023.03.11
스프링 DB 접근 기술(2) - 스프링 통합 테스트  (0) 2023.03.10
스프링 DB 접근 기술(1) - 순수 JDBC  (0) 2023.03.10
회원 관리 예제 - 웹 MVC 개발  (0) 2023.03.10
스프링 빈과 의존관계  (0) 2023.03.10
  1. AOP가 필요한 상황
  2. MemberService 회원 조회 시간 측정 추가
  3. AOP 적용
  4. 시간 측정 AOP 등록
  5. 해결
  6. 스프링의 AOP 동작 방식 설명
  7. AOP 적용 전 의존관계
  8. AOP 적용 후 의존관계
  9. AOP 적용 전 전체 그림
  10. AOP 적용 후 전체 그림
'SpringBoot/기초' 카테고리의 다른 글
  • 스프링 DB 접근 기술(3) - JPA
  • 스프링 DB 접근 기술(2) - 스프링 통합 테스트
  • 스프링 DB 접근 기술(1) - 순수 JDBC
  • 회원 관리 예제 - 웹 MVC 개발
ewok
ewok
ewok
기록장
ewok
전체
오늘
어제
  • 분류 전체보기
    • 웹개발 교육
      • HTML
      • CSS
      • JavaScript
      • Database
      • Java
      • jQuery
      • Ajax
      • Bootstrap
      • jsp
      • Spring
      • MyBatis
      • 프로젝트
    • JAVA
    • SpringBoot
      • 기초
      • AWS
      • 개인프로젝트
    • Spring Security
    • JPA
    • 테스트코드
    • Error
    • CS
      • 컴퓨터 구조
      • 이산수학
    • 알고리즘
      • 정리
      • Java
    • SQL
    • 자격증
      • SQLD
      • 정보처리기사
    • Git

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • org.springframework.beans.factory.UnsatisfiedDependencyException
  • 생성자
  • 브랜치
  • org.hibernate.tool.schema.spi.CommandAcceptanceException
  • SQLD
  • sqld 합격
  • GIT
  • sqld 자격증
  • base
  • merge commit
  • this
  • 버전 관리
  • branch
  • 노랭이
  • git bash

최근 댓글

최근 글

hELLO · Designed By 정상우.
ewok
AOP
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.