[Spring] 스프링 입문 (7) - AOP

2022. 3. 1. 21:10·Spring

AOP의 필요성

 

모든 메서드의 호출 시간을 측정하고 싶은 경우

모든 메서드에 각각 일일이 시간을 측정하기 위한 로직을 추가하는 작업이 필요하다.

인프런 김영한님 스프링 입문 강의자료

 

MemberService의 join 메서드에 시간 측정 로직 추가
public Long join(Member member) {

    long start = System.currentTimeMillis();

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

        System.out.println("join = " + timeMs + "ms");

    }
}

 

문제

  • 시간을 측정하는 기능은 핵심 관심 사항(core concern)이 아닌 공통 관심 사항(cross-cutting concern)이다.
  • 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
  • 만약 시간 측정 로직을 변경하게 된다면 모든 로직을 찾아가서 변경해야 한다.

 

AOP 적용

  • AOP : Aspect Oriented Programming
  • 공통 관심 사항과 핵심 관심 사항 분리

인프런 김영한님 스프링 입문 강의자료

 

시간 측정 AOP 등록

  • @Aspect를 사용하여 공통으로 적용할 기능을 구현한다.
  • @Around를 사용해 적용 범위를 설정할 수 있다. (보통 패키지 레벨)
@Aspect
@Component
public class TimeTraceAop {

    @Around("execution(* 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");
        }

    }
}

 

해결

  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들어 핵심 관심사항과 공통 관심사항을 분리하였다.
  • 핵심 관심사항 코드를 깔끔하게 유지할 수 있다.
  • 공통 관심사항에 변경 필요시 AOP 부분만 변경해주면 된다.
  • 원하는 대상을 선택할 수 있다. (@Around)

 

스프링 AOP 동작 방식

인프런 김영한님 스프링 입문 강의자료

  • AOP 적용 전에는 멤버 컨트롤러가 멤버 서비스를 의존한다.
  • AOP가 적용되면 멤버 컨트롤러는 프록시 객체인 가짜 멤버 서비스를 호출하게 되고 joinPoint.proceed() 메서드가 호출되면 실제 멤버 서비스가 호출된다.
  • new 키워드를 사용해 객체를 생성하는 것이 아니라 DI를 사용하기 때문에 이러한 기술을 사용할 수 있다.

 

인프런 김영한님 스프링 입문 강의자료

 


강의 링크

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

저작자표시 비영리 변경금지 (새창열림)

'Spring' 카테고리의 다른 글

[Spring] 핵심 원리 기본 (1) - 객체 지향 설계와 스프링  (0) 2022.03.03
[Spring] 스프링 입문 (6) - 스프링 DB 접근 기술  (0) 2022.03.01
[Spring] 스프링 입문 (5) - 회원 관리 예제 (웹 MVC 개발)  (0) 2022.02.28
'Spring' 카테고리의 다른 글
  • [Spring] 핵심 원리 기본 (2) - 예제 프로그램 만들기
  • [Spring] 핵심 원리 기본 (1) - 객체 지향 설계와 스프링
  • [Spring] 스프링 입문 (6) - 스프링 DB 접근 기술
  • [Spring] 스프링 입문 (5) - 회원 관리 예제 (웹 MVC 개발)
Sue
Sue
개발 공부 로그
  • Sue
    Sue's devlog
    Sue
  • 전체
    오늘
    어제
    • 분류 전체보기 (122)
      • Algorithm (2)
      • WEB (8)
      • Java & Kotlin (83)
      • Spring (26)
      • Database (1)
      • Infra (0)
      • Git (1)
      • devlog (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Sue
[Spring] 스프링 입문 (7) - AOP
상단으로

티스토리툴바