써먹는 웹개발
[Spring] AOP 개념 및 예제 소스 본문
1. AOP(Advice Target Pointcut / 관점 지향 프로그래밍) 개념
- 비즈니스 로직 객체와 공통적인 부분 (권한, 트랜잭션, 예외처리, 로깅 등)을 분리하여 처리하는 것
ex) 모든 서비스에 시간 측정 기능(종료-시작 시간)이 필요할때
- 시간 측정 기능을 넣을때 개별적으로 해도 되는데 AOP를 쓰는 이유 : 소스 중복제거
용어정리
1) Advice : 어떤 부가기능을 언제 사용할지에 대한 정의 2) Target : 부가 기능이 적용될 대상 ex) 시간 측정하는 A,B 메서드는 Target / 그 외에는 Target이 아님 3) Pointcut : Advice를 적용할 Jointpoint를 선별하는 작업 - 시간 측정을 원하는 서비스에만 할 수 있게 선별하는 작업 ※ JointPoint : Advice가 적용될 수 있는 위치 - 메서드 호출할 때 - 변수에 접근할 때 - 객체를 초기화할 때 - 객체에 접근할 때 |
참고하면 좋은 강의
- www.youtube.com/watch?v=WQR_VQnz7Yg&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9CTech
- www.youtube.com/watch?v=Hm0w_9ngDpM&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9CTech
2. 예제 소스
1) 시간측정 소스 만드는 법
파일명 : LogAspect.java |
... @Component @Aspect public class LogAspect { Logger logger = LoggerFactory.getLogger(LogAspect.class); @Around("@annotation(LogExecutionTime)") public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { StopWatch stopWatch = new StopWatch(); stopWatch.start(); Object proceed = joinPoint.proceed(); stopWatch.stop(); logger.info(stopWatch.prettyPrint()); return proceed; } } |
2) 시간측정 어노테이션 사용법
public class xxxService { @GetMapping("owners/new") @LogExecutionTime public String initCreationForm(Map<String, Object> model) { Owner owner = new Owner(); model.put("owner", owner); return VIEWS_OWNER_CREATE_OR_UPDATE_FORM; } } |
소스 출처 : www.youtube.com/watch?v=3750wh1wNuY&ab_channel=%EB%B0%B1%EA%B8%B0%EC%84%A0
'Server > Spring' 카테고리의 다른 글
[Spring] 자주쓰는 @annotaion 목록 (0) | 2021.03.22 |
---|---|
[Spring] 의존주입 (DI) (0) | 2020.05.11 |
[Spring] spring boot와 spring framework의 차이(장단점) (0) | 2020.05.02 |
[Spring] Maven > Update Project시 이전버전의 jre를 받아오는 문제 해결방법 (0) | 2020.02.20 |
[Spring] 파일 업로드시 MultiPartResolver를 쓰는 이유? (0) | 2018.07.10 |