본문 바로가기

Programing/Framework

[Spring] AOP로 로깅 코드 덜어내기

기존에 되어 있던 코드에 보면 메서드 시작부에 인자로 받은 값들을 JSON으로 serialize해서 로그에 찍고,

결과를 반환하기 전에 결과도 JSON으로 serialize해서 로그로 찍는 식의 코드가 많았다.

 

사실 로깅을 하거나 DB에 이력을 쌓는 등의 코드는 핵심 비즈니스 코드와 별로 관계가 없다고 볼 수 있다.

 

이번에 새로운 feature를 추가하면서 기존 레거시의 방식(위의 방식)을 따르기 보다, AOP를 적용해서 관심사의 분리를 해보는 경험을 해보아서 기록으로 남긴다.

 

버전정보

자바: 1.8
스프링부트: 2.1.4.RELEASE
 -> 스프링 프레임워크: 5.1.6.RELEASE

의존성 추가

스프링부트 레퍼런스에 보면 AOP관련 스타터가 spring-boot-starter-aop 라서 추가를 했으나 사실 JPAspring-boot-starter-data-jpa가 apo에 의존을 하고 있었다.

spring-boot-starter-data-jpa:2.1.4 -> spring-boot-starter-aop:2.1.4 -> org.aspectj:aspectjweaver:1.9.2

따라서 없어도 되나 명시적인 것이 좋을 것 같아서 (추후에 data-jpa에서 aop를 안쓰게 되면 후임자는 왜 에러가 나는지 당황하겠지) 추가했다.

dependencies {
	// ..
	implementation "org.springframework.boot:spring-boot-starter-aop"
	// ..

도움을 받은 블로그

AOP에 대한 개념은 알고 있었으나 개념 이해와 실제 적용은 간극의 차이가 있다.

기억보단 기록을 이라는 블로그의 글 중 AOP 정리(3)이 많이 도움이 되었다.

 

처음에는 @EnableAspectJAutoProxy를 필수로 SpringBootApplication 클래스에 붙여줘야 했으나, 없어도 AOP는 동작이 되었다.

아마 스타터에 의해 AopAutoConfiguration 가 활성화 되기 때문인 것 같다.

예) @SpringBootApplication -> @EnableAutoConfiguration : spring.boot.enableautoconfiguration 패키지 하위의 @Configuration들을 스캔.

삽질 기록

구현보다 삽질을 했던 것은 테스트 코드이다. 단위 테스트 말고 기능 테스트시에 Mocking이 안되는 현상을 경험했다.

나중에 알고보니 Spock Framework의 Mock과 Stub이 프로시 객체에 대해 제대로 동작을 하지 않는 다는 것을 알게 되었다.

기억보단 기록을 :: SpringBoot에서 Spock Mock 사용법과 문제점

결국 Mockito를 써야 하는 것인가...