티스토리 뷰
Object 조상님에서 toString()은 ClassName@hashCodeByHex 를 던져주신다
이 값은 딱히 궁금하지 않았는데..
그러므로 인스턴스에 대한 야무진 정보를 제공해주려면 toString()도 재정의해줘야 한다
조슈아 형님은 사용하기에 즐겁고 디버깅 하기 쉽기 때문에 반드시 구현하라고 하셨다
그에 앞서 클래스에 대한 야무진 정보가 문자열 형태로 왜 필요한가부터 고민할 필요가 있다
System.out.println()으로 인스턴스를 찍어보는 자바 연습 단계를 지났다면 toString이 도대체 왜 필요한가?
나는 지금껏 프로젝트에서 toString() 메서드를 요긴하게 사용해 본 적이 없어 열심히 찾아봤다
마크씨가 남겨준 답변과 그 아래 달린 코멘트를 유심히 보자
인스턴스에 대한 문맥 제공이 목적이라 하였고 그 아래에는 예외 메세지를 던질 때 엔티티에 대한 정보도
toString()으로 야무지게 뽑아서 줄 수 있기 때문이라는 코멘트가 달려있다
위 글을 보기 전까지는 toString()에 대해 부정적인 생각이 있었다
콘솔에 찍어볼 것도 아닌데 엔티티에 얘를 왜 붙이는거야 라고 생각해 나는 항상 사용하지 않았다
나는 기존에는 예외가 어떤 상황에서 발생한 문제인지를 설명하는 로그를 찍었었는데
toString을 이용해 로그를 찍어주면 뭐 때문에 문제가 일어났는지 쉽게 파악이 가능할 것 같다
// toString 이용
log.info("exception happened : {}", customClass);
// 사용하던 기존 방식
log.info("exception happened : {}", exception.getMessage());
예외 상황에서 사용한다면 인스턴스에 대한 정보 제공 목적으로 사용한다면 오케이구나
그럼에도 toString 재정의는 선택의 문제인 듯 싶다
자바 기본 라이브러리에서 사용되는 클래스를 작성하는게 아니라면,
다시 말해 여러 사용자들에게 정해진 포맷으로 인스턴스에 대한 정보를 문자열로 제공해야 하는게 아니라면 안 해도 될 듯 하다
toString을 사용하기로 했을 때 주의할 점이 있다
JPA를 사용한다면 부주의하게 Entity에 IDE가 만들어주는 toString()이나
lombok이 제공하는 @ToString, @Data를 달아버리면 모든 필드를 가져다가 사용한다
독립적인 엔티티라면 상관 없겠지만 연관관계가 걸려있는 순간 toString 재귀호출이 걸릴 수 있다
따라서 toString에는 가능한 한 많은 정보를 담는게 좋겠지만
예외 상황에 적절한 문맥 제공만 해준다면 단 하나만 있어도 상관 없을 것이다
변경 가능성을 고려해 웬만하면 @ToString을 이용하고 of 속성으로 넣어줄 필드를 지정하자
2022. 02. 22
최근 개인 프로젝트로 OAuth2를 이용하고 Auth Server에서 토큰 가져오는 과정을 파보고 있는데
과정이 스무스하지 않아 디버깅할 일이 정말 많았다
로그 찍을 때마다 일일이 값 검사를 하기 힘드니 DTO에는 대부분 @ToString을 달아줬다
조슈아 형님이 말씀하신 즐거운 디버깅을 위해 @ToString은 거의 필수라고 봐야겠다
역시 직접 맞아보기 전엔 모른다
'Java > Effective Java' 카테고리의 다른 글
[Item14] Comparable, 혼란하다 혼란해 (0) | 2022.02.21 |
---|---|
[Item13] Cloneable 금지 (0) | 2022.02.20 |
[Item11] @EqualsAndHashCode (2) | 2022.02.19 |
[Item10] equals 일반 규약을 깨보자 (0) | 2022.02.19 |
[Item09] 뭐든 수준 높게 사용하자 (0) | 2022.02.15 |