최근에 프로그래머스 백엔드 코드리뷰 스터디
에 참여하며 ToStringBuilder
를 알게 되었다. 스터디 리더들이 제공하는 베이스코드의 모델 클래스에서 toString()
을 오버라이드하는데 주로 사용되었는데, 굳이 이걸 왜 사용하는지 궁금했다. 그냥 IDE에서 자동완성 시켜주는 형태 그대로 사용해도 되지 않나?
그래서 찾아본 ToStringBuilder
를 사용하는 이유와 그 사용법!
commons-lang3
패키지에 포함되어 있는 클래스로, 이름 그대로 문자열을 만들 수 있는 메서드들을 제공하는 클래스이다. 이번에 알아보니까 클래스 필드 정보에 대한 문자열을 더 이상의 노가다 없이 손쉽게 만들 수 있는, 정말 좋은 클래스였다. 역시 사람은 배우고 봐야 한다며스프링부트
기준으로 Gradle
을 사용한다면implementation 'org.apache.commons:commons-lang3'
Maven
을 사용한다면<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
을 각각 의존성으로 추가해주면 된다.
@AllArgsConstructor // lombok annotation
public class User {
private final Long id;
private final String name;
}
전형적인 회원정보 클래스이다. 우리가 개발을 진행하다 보면 콘솔에 로그를 찍어봐야 하는 일이 참 많다. 그 때 많이 보는 것 중 하나가 모델에 대한 정보일 것이다. 새로 생성된 객체에 내가 원하는대로 데이터가 잘 세팅이 되었는지 확인하는 용도로.
그래서 보통 이런 형태로 toString()
을 오버라이드 할 것이다.(IDE가 만들어 주는대로)
@AllArgsConstructor // lombok annotation
public class User {
private final Long id;
private final String name;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
이렇게 써도 로그에서 확인하는 데에는 아무 문제가 없다. 하지만 클래스에 필드가 하나 더 추가된다면 toString()
에 +
와 띄어쓰기를 주섬주섬 써 가며 새로운 필드에 대한 부분을 한땀한땀 작성해줘야 한다.(나도 옛날에 처음 배우던 당시엔 당연히 저래야 하는줄 알았음) 어휴 너무 귀찮다!
이 노가다를 획기적으로 줄일 수 있는 것이 바로 ToStringBuilder
클래스이다.
toString()
을 이렇게 바꿀 수 있다.@AllArgsConstructor // lombok annotation
public class User {
private final Long id;
private final String name;
@Override
public String toString() {
return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
}
}
JSON
스타일로 객체의 필드 정보를 출력해주는 것이다. (첫 번째 인자로는 객체 정보(not null
)를 넣어주고 두 번째 인자로는 어떤 형태로 출력할 것인지 지정해 주는 옵션값을 넣는다){"id":"1", "name":"user1"}
이런 형태로 출력이 될 것이다. 아주 좋아~~!!
물론 전통적인 형태로도 작성할 수 있는 메서드도 제공한다.
@AllArgsConstructor // lombok annotation
public class User {
private final Long id;
private final String name;
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
.append("id", id)
.append("name", name)
.toString();
}
}
다른 로직 짜는데도 머리 아픈데 이런 데 쓸 체력과 타이핑을 조금이라도 줄여야 정말 쾌적한 개발환경이라고 할 수 있지 않을까? 일단 손수 쓰면 필드 추가만 하고 toString()
에 추가한다는 것을 까먹는 경우가 많기 때문에... 로그 확인하다가 빌드 두 번 하는 경우가 많다.
그래서 쓸 수 있으면 ToStringBuilder.reflectionToString();
을 적극 활용하자.
참고로 예제에서 사용한 JSON_STYLE
외에도 다음과 같은 여러 옵션들이 있다.
ToStringStyle.DEFAULT_STYLE
ToStringStyle.MULTI_LINE_STYLE
ToStringStyle.NO_FIELD_NAMES_STYLE
ToStringStyle.SHORT_PREFIX_STYLE
ToStringStyle.SIMPLE_STYLE
ToStringStyle.NO_CLASS_NAME_STYLE
ToStringStyle.JSON_STYLE