Skip to Content
Suffering builds character
아카이브21.spring AopAOP 개요1.요구사항 시나리오

1.요구사항 시나리오

애플리케이션의 서비스 계층에 정의된 클래스의 메서드에 전달되는 인수(parameter)의 값을 DEBUG 레벨의 로깅을 통해 출력하여 인수의 값이 제대로 전달되었는지 확인하는 코드를 작성해야할 경우?

1. 단순한 해결 방법

모든 서비스 메서드 내부에 로깅 처리를 위한 코드 작성하여 해결

OwnerServiceImpl.java
@Slf4j public class OwnerServiceImpl { public Owner addOwner(Owner owner) { log.debug("{}", owner); // Owner 추가를 위한 별도의 서비스 로직 } }
PetServiceImpl.java
@Slf4j public class PetServiceImpl { public Pet addPet(Pet pet) { log.debug("{}", pet); // Pet 추가를 위한 별도의 서비스 로직 } }
IDE 콘솔
DEBUG: [owner = firstName: gugu, lastName: ttemy] DEBUG: [pet = name: cucu, type: dog]

→ 로깅 기능이 정상적으로 동작함

2. 단점

위와 같이 작성할 경우 로깅에 대한 처리가 서비스 로직이 작성된 모든 코드들에 분포되면서 로깅을 위한 처리 로직이 서비스 처리를 위한 로직과 섞이게 되고, 결과적으로 전체 코드베이스는 구분이 어렵고 갈수록 복잡해져감

OwnerServiceImpl.java
@Slf4j public class OwnerServiceImpl { public Owner addOwner(Owner owner) { log.debug("{}", owner); // Owner 추가를 위한 별도의 서비스 로직 log.info("New Owner : {} added", owner); // ... } }

서비스 메서드 내부에 로깅 로직만 있다면 그나마 괜찮을 수 있으나, 트랜잭션 처리를 위한 로직, 보안 처리를 위한 로직 등도 함께 작성되어 있다면 코드는 더 복잡해질 수 있음

OwnerServiceImpl.java
@Slf4j public class OwnerServiceImpl { public Owner addOwner(Owner owner) { transaction.begin(); log.debug("{}", owner); // Owner 추가를 위한 별도의 서비스 로직 log.info("New Owner : {} added", owner); // ... transaction.commit(); } }

정리하면, 현재 메서드에 전달되는 인수의 값을 로깅으로 출력하는
일련의 책임(Responsibility) 혹은 관심사(Concern) 가 2개 이상의 클래스들의 메서드에 걸쳐서 분산되어 작성되어 있는 상황

3. 개선 방법

AOP를 적용하여 모든 메서드들에 구현된 로깅 로직을 비즈니스 로직으로부터 분리

Last updated on