-
AOP (Aspect Oriented Programming) (자료: 백기선)SPRING 2020. 3. 23. 23:51
AOP(Aspect Oriented Programming)
AOP은 공통 된 기능(아래 AAAA, BBBB)을 메소드 실행시 수행하게 만드는 기법.
즉, AAAA, BBBB 와 같은 코드를 공통으로 관리하기 때문에, 소스관리에 편리하다.
AOP 주요 개념
- Aspect : 위에서 설명한 흩어진 관심사를 모듈화 한 것. 주로 부가기능을 모듈화함.
- Target : Aspect를 적용하는 곳 (클래스, 메서드)
- Advice : 실질적으로 어떤 일을 해야할 지에 대한 것, 실질적인 부가기능을 담은 구현체
- JointPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점, 필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
- PointCut : JointPoint의 상세한 스펙을 정의한 것. 'A란 메서드의 진입 시점에 호출할 것'과 같이 더욱 구체적으로 Advice가 실행될 지점을 정할 수 있음
123456789101112131415161718class A { method a() {AAAA세금게산서 발행BBBB}method b() {AAAA전자문서 발행BBBB }}class B { method c() {AAAA메일 재전송BBBB}}실무에서 주로 사용하는 AOP는 @Transactonal 어노테이션을 주로 사용한다.
@Transactional 은 All or Nothing 개념임.
예시 : ) 은행 송금을 할때 모든 송금 관련 작업이 끝나지 않으면, 그 전 작업들이 모두 취소 되어 이체되지 않음.
즉, 송금 관련 기능(작업)이 모두 수행되어야 실제 송금이 되는 개념을 말함.
AOP 예제
- 메서드 수행 시간을 측정하는 AOP 예제
- 메서드 수행 시간 측정에 관한 AOP 어노테이션인 @LogExecutionTime을 붙임 (어노테이션 명은 사용자 마음대로...)
12345678910111213@PostMapping("/owners/{ownerId}/edit")@LogExecutionTimepublic String processUpdateOwnerForm(@Valid Owner owner, BindingResult result,@PathVariable("ownerId") int ownerId) {if (result.hasErrors()) {return VIEWS_OWNER_CREATE_OR_UPDATE_FORM;}else {return "redirect:/owners/{ownerId}";}}http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter* @LogExecutionTime을 쓰고 alt enter를 누를시에 Quick Quick FIX로 어노테이션 인터페이스가 생성됨.
- 메서드를 타겟으로하고, Runtime시에 실행됨.
12345678@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)public @interface LogExecutionTime {}http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter@Component 어노테이션을 붙여서 Bean 등록을 함.
@Aspect 어노테이션 추가
- AOP는 jointPoint를 받을 수 있는데 jointPoint가 타겟임.
12345678910111213141516171819202122@Component@Aspectpublic class LogAspect {Logger logger = LoggerFactory.getLogger(LogAspect.class);// joinPoint 받을 수있음 : jointPoint는 타겟임(LogExecutionTime을 붙인 메서드)@Around("@annotation(LogExecutionTime)")public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {StopWatch stopWatch = new StopWatch();Object proceed = joinPoint.proceed();return proceed;}}http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color ScripterAOP가 등록 된 메서드를 호출하면 아래와 같이 수행시간이 console.log에 찍히는 것을 알 수있음.
'SPRING' 카테고리의 다른 글
Component와 ComponentScan 정리 (0) 2020.04.10 @Autowired 심화 학습(자료 : 백기선) (0) 2020.04.06 DI 주입 방법(3가지) (0) 2020.03.23 IOC 란? (자료 : 백기선) (0) 2020.03.22 ObjectMapper로 Map-> Json 데이터 변환하기 (0) 2020.03.22