728x90
1. AOP가 필요한 상황
지금까지 만든 서비스들(회원가입, 회원조회 등)의 동작 시간 측정 로직을 서비스 메소드마다 달아야 하는 경우 유지보수가 힘들 것이다. 이를 위해 AOP라는 기술이 필요하다.
시간 측정 기술과 같은 부수적인 기능을 공통관심사항이라고 하고 서비스 자체의 핵심 기능을 핵심관심사항이라고 한다. 스프링이 제공하는 AOP 기술을 사용하면 공통적으로 사용되는 공통관심사항을 쉽게 관리할 수 있다.
아래 코드의 문제점을 찾아보자
/**
* 회원가입
*/
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");
}
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName()).ifPresent(m -> {
throw new IllegalStateException("이미 존재하는 회원입니다");
});
}
/**
* 전체 회원 조회
*/
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");
}
}
문제
- 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다.
- 시간을 측정하는 로직은 공통 관심 사항이다.
- 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.
- 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
- 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.
2. AOP 적용
AOP를 사용하면 위에서 언급한 시간측정 로직을 한 곳에 모아 원하는 곳에 적용할 수 있다.
위의 코드를 AOP를 사용해서 다시 작성해보자
@Aspect
public class TimeTraceAop {
@Around("execution(* hello.hellospring..*(..)) && !target(hello.hellospring.SpringConfig)")
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");
}
}
}
해결
- 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다.
- 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
- 핵심 관심 사항을 깔끔하게 유지할 수 있다.
- 변경이 필요하면 이 로직만 변경하면 된다.
- 원하는 적용 대상을 선택할 수 있다.
지금까지 스프링으로 웹 애플리케이션을 개발하는 방법에 대해서 첫번째 강의를 학습했다.
스프링을 활용해서 실무에서 발생하는 문제들을 잘 해결하는 방법을 배울 수 있는 멋진 강의인것 같다.
강의 로드맵을 따라서 핵심 원리를 이해하고, 문제가 발생했을 때, 대략 어디쯤 부터 찾아들어가면 될지, 필요한 부분을 찾아서 사용할 수 있는 능력을 길러보자!
728x90
'👩🏫 Study > 스프링부트 강의' 카테고리의 다른 글
[2. 스프링 핵심 원리] 스프링 핵심 원리 이해 (0) | 2023.10.03 |
---|---|
[2. 스프링 핵심 원리] 객체 지향 설계와 스프링 (0) | 2023.10.03 |
[1. 스프링 입문] 웹 MVC 개발 (0) | 2023.10.02 |
[1. 스프링 입문] 회원 관리 예제 (0) | 2023.10.01 |
[1. 스프링 입문] 스프링 웹 개발 기초 (0) | 2023.10.01 |