월루를 꿈꾸는 대학생
[ Spring 입문] AOP 본문
728x90
aop
aop 필요한 상황
- 메서드의 호출 시간 측정할 때 (초를 밀리세컨드로 바꿀려면 일일이 수정필요)
메서드 앞과 끝에 시간을 측정하고 출력
이런 걸 메서드별로 다 적으려고 하면 답답
public Long join(Member member){
long start = System.currentTimeMillis();
try{
// 같은 이름이 있는 중복 회원 x 만약 해당 이름으로 못 찾은 경우를 대비해서 optional로 감쌈
Optional<Member> result = memberRepository.findByName(member.getName());
//ifPresent : result값이 null이 아니라 값이 있으면 동작하는 메서드
// -> 옵셔널로 감싸면 옵셔널 가지고 있는 메서드 사용 가능
// 값 자체를 꺼내고 싶으면 result.get()으로 꺼내기도 가능
result.ifPresent(m-> {
throw new IllegalStateException("이미 존재하는 회원입니다");
});
// 요렇게도 가능 짜피 옵셔널 반환이니까 한번에!
validateDuplicateMember(member);
memberRepository.save(member);
return member.getId();
}finally {
long finish = System.currentTimeMillis();
long timeMs = finish - start;
System.out.println("join = " + timeMs + "ms");
}
}
근데 이거는 핵심 비즈니스로직도 아님 그냥 곁다리
공통 관심 사항임 .. 즉 모든 로직에 들어있는 공통 기능임
이런 거가 섞여 있으면 유지보수가 힘들어짐
시간 측정하는 로직을 한 곳에 두고 이걸 다른 로직에 가져다 쓰기만 하면 간편
// aop 활용 위한
@Aspect
// 빈 등록
@Component
public class TimeTraceAop {
// around 는 범위 지금은 해당 패키지명 아래 하위 파일에 적용
@Around("execution(* heloo.hellospring.*(..))")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable{
long start = System.currentTimeMillis();
System.out.println("Start : "+ joinPoint.toString());
try{
// 다음 메서드로 진행
Object result = joinPoint.proceed();
return result;
}finally {
long finsh = System.currentTimeMillis();
long timeMs = finsh - start;
System.out.println("End : " + joinPoint.toString() + " " + timeMs + "ms") ;
}
}
}
해당 코드가 각 로직이 실행될때마다 실행되어버림
로직 될 때 인터셉트해서 해당 TimeTraceAop가 실행됨
@Around 에서 범위를 한정시켜서 서비스 혹은 리포지토리만 설정할 수도 있음
프록시 기술로 인터셉트후에 원래 로직이 동작함
출처
728x90
'Programing > Spring Boot' 카테고리의 다른 글
[Mac] maria db & GUI 설치하기 (0) | 2023.03.06 |
---|---|
[Spring] 객체 지향 설계와 스프링 (1) | 2023.03.05 |
[Spring 입문] 웹 mvc개발 (0) | 2023.01.20 |
[Spring Boot 입문] 회원 관리 (0) | 2023.01.11 |
[Spring Boot 입문] 스프링 웹 개발 기초 (0) | 2023.01.08 |