추상클래스에서 로그를 찍고 싶을 때가 있다.
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() 메서드를 통해 설정을 하면 끝이었다.
'Programing > JVM(Java, Kotlin)' 카테고리의 다른 글
[Java] byte[]을 String으로 바꾸기 (0) | 2019.06.20 |
---|---|
JDK8 업데이트를 하다(181 to 211), SHA / AES (0) | 2019.06.18 |
[Java] 자바버전 별 주요특징 (0) | 2019.05.17 |
[JSON] LocalDateTime to JSON by Gson, Jackson2 (1) | 2019.05.15 |
[Java] Date vs LocalDateTime (0) | 2019.05.15 |