본문 바로가기

Programing/JVM(Java, Kotlin)

부모클래스에서 로깅시 서브클래스의 이름 찍기

추상클래스에서 로그를 찍고 싶을 때가 있다.

lombok을 쓰고 있기에 단순히 abstract class 위에 @Slf4j 을 붙여주면 땡이지만 이렇게 하면 로그 클래스 이름이 Abstract 클래스 이름만 나오게 된다.

이럴 경우 상속받는 서브타입의 클래스이름이 찍게 하려면 어떻게 하면 될까?

1안 - 타입을 저장하여 파라미터로 받게 하는 방법

처음에는 2안이 있는 줄 모르고 타입을 저장하는 enum을 만들어서 Abstract 클래스의 생성자로 주입을 시켰다.
물론 이 방법도 동작을 했지만 @SuppressWarnings("unchecked") 를 붙여야 했고 서브타입이 추가 될 때 관련 없는 enum을 수정해야 한다는 것이 SRP 위반으로 보였다.

2안 - Object.getClass() 를 이용하는 방법

우연히 기회가 되어서 MappingJackson2HttpMessageConverter의 소스코드를 보게 되었다.
고조 클래스인 AbstractHttpMessageConverter에 해결책이 적혀있었다. 아래와 같다.

public abstract class AbstractHttpMessageConverter<T> implements HttpMessageConverter<T> {

	/** Logger available to subclasses */
	protected final Log logger = LogFactory.getLog(getClass());

LogFactory에 클래스를 Object.getClass() 메서드를 통해 설정을 하면 끝이었다.