본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2025 1학기 스프링 부트 스터디] 정다은 #7주차

반응형

AOP

 

AOP가 필요한 이유

1. 모든 메소드의 호출 시간을 측정하고 싶을 때

2. 공통 관심 사항 핵심 관심 사항 분

3. 회원 가입 시간, 회원 조회 시간을 측정 하고 싶을 때

 

MemberService 회원 조회 시간 측정 추가

package hello.hellospring.service;

import org.springframework.transaction.annotation.Transactional;
import java.util.List;

@Transactional
public class MemberService {

    /**
     * 회원가입
     */
    public Long join(Member member) {
        long start = System.currentTimeMillis();
        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");
        }
    }

    private void validateDuplicateMember(Member member) {
        // 중복 회원 체크 로직
    }

    private MemberRepository memberRepository;
}


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

 

 

 

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;

@Component
@Aspect
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 작용 전

AOP 적용 후

 

반응형