AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불립니다.
관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 공통적인 관점으로 나누고 그 관점을 기준으로 각각 모듈화하겠다는 것입니다. 쉽게 말하자면 흩어져 있는 코드를 한 곳으로 모으는 것 입니다.
그림으로 설명하자면 아래와 같이 Controller, Service, Repository에 모두 시간 측정 로직이 존재할 경우 AOP를 활용하여 공통의 관심사항을 적용할 수 있습니다.
AOP 적용 전
@Transactional
@Service
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");
}
}
}
AOP 적용 후
@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");
}
}
}
- Aspect
- AOP 클래스임을 지정합니다.
- @Component
- 스프링 컨테이너에 빈으로 등록해야 합니다.
- Configuration에 Bean으로 직접 등록 가능합니다.
- @Around
- AOP의 공통 로직이 적용될 범위입니다.
- PointCut 또는 Annotation을 전달 받아 해당 조건을 바탕으로 실행됩니다.
참고자료
- 인프런 김영한 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술
728x90
반응형
'Domain > Spring' 카테고리의 다른 글
[Spring] Bean ( Spring Bean ) (0) | 2021.07.23 |
---|---|
[Spring] 템플릿-콜백 (0) | 2021.07.23 |
[Spring] 제어의 역전(IoC / Inversion of Control)과 의존성 주입(DI / Dependency Injection) (0) | 2021.07.14 |
[Spring] 컨테이너( Container / IoC Container / BeanFactory / ApplicationContext ) (0) | 2021.07.13 |
[Spring] POJO ( Spring POJO / Spring Triangle / Plain Old Java Object ) (0) | 2021.07.13 |
댓글