[Spring] AOP 정리
스프링 AOP 개념 및 프록시 동작 원리, 등 정리
목차
Spring AOP
스프링 AOP 개념 및 프록시 동작 원리등 정리
AOP 란?
AOP는 Aspect Oriented Programming 의 약자로, 관점 지향 프로그래밍 입니다.
여러 곳에 흩어져서 반복되는 공통 기능을 한곳에 모아서 관리하는 프로그래밍 방식 입니다.
AOP의 목적
만약 특정 기능이 동작하는데 트랜잭션 관리를 해야한다면 어떤식으로 동작할 수 있을까요?
혹은 성능측정이나, 로깅 등을 추가해야한다면?
그냥 코드에 작성을 하면 됩니다.
public void createUser(User user) {
long start = System.currentTimeMillis(); // 성능 측정
log.info("createUser 시작"); // 로깅
try {
tx.begin(); // 트랜잭션
// createUser 로직
userRepository.save(user);
// ==============
tx.commit(); // 트랜잭션
} catch (Exception e) {
tx.rollback(); // 예외 처리
throw e;
} finally {
log.info("실행 시간: " + (System.currentTimeMillis() - start));
}
}
훌륭하게 동작하겠지만, 단점이 있습니다.
만약 createUser()기능 말고, 다른 기능에 동일한 요구사항을 적용해야한다면 해당하는 코드를 동일하게 작성해야합니다.
중간에 이러한 로깅 혹은 트랜잭션에 대한 기능을 변경해야한다면 일괄적으로 모든 코드를 확인하며 수정해야합니다.
또한 실제 비즈니스 로직인 userRepository.save(user); 보다 다른 부가 기능을 위한 코드가 앞도적으로 많습니다.
🤔 엥? 메서드 혹은 Util class 등으로 빼서 필요한 부분에서 사용하기만 하면 되는거 아냐?
🚨 위의 코드보다는 유지보수 측면에서 매우 훌륭한 방안이지만, 저러한 로깅 등의 코드를 구현하기 위해 실제 비즈니스 코드에 해당 메서드를 호출하는 부분은 그대로 들어가게 됩니다.
이게 왜 문제인지 이해가 안될수도 있지만, API 의 개수가 수십 수백개가 되는 프로젝트의 모든 API 의 성능을 Application 레벨에서 체크해야 한다고 생각을 하면 끔찍합니다.
이러한 문제(?), 불편함을 해소하기 위한 프로그래밍 기법이 입니다.
