반응형
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 적용 후
반응형
'WINK-(Web & App) > Spring Boot 스터디' 카테고리의 다른 글
[2025 1학기 스프링부트 스터디] 고윤정 #7주차 (0) | 2025.05.24 |
---|---|
[2025 1학기 스프링부트 스터디] 김민서 #7주차 (0) | 2025.05.24 |
[2025 1학기 스프링부트 스터디] 오세웅 #6주차 (0) | 2025.05.23 |
[2025 1학기 스프링부트 스터디] 최비성 #7주차 (0) | 2025.05.22 |
[2025 1학기 스프링부트 스터디] 최비성 #6주차 (0) | 2025.05.22 |