[JAVA] ToStringBuilder 사용이유와 사용법

Sia Hwang·2022년 10월 24일
0

최근에 프로그래머스 백엔드 코드리뷰 스터디에 참여하며 ToStringBuilder를 알게 되었다. 스터디 리더들이 제공하는 베이스코드의 모델 클래스에서 toString()을 오버라이드하는데 주로 사용되었는데, 굳이 이걸 왜 사용하는지 궁금했다. 그냥 IDE에서 자동완성 시켜주는 형태 그대로 사용해도 되지 않나?
그래서 찾아본 ToStringBuilder를 사용하는 이유와 그 사용법!

What is the ToStringBuilder?

  • commons-lang3 패키지에 포함되어 있는 클래스로, 이름 그대로 문자열을 만들 수 있는 메서드들을 제공하는 클래스이다. 이번에 알아보니까 클래스 필드 정보에 대한 문자열을 더 이상의 노가다 없이 손쉽게 만들 수 있는, 정말 좋은 클래스였다. 역시 사람은 배우고 봐야 한다며

Before use

  • 스프링부트 기준으로 Gradle을 사용한다면
implementation 'org.apache.commons:commons-lang3'
  • Maven을 사용한다면
<dependency>
  <groupId>org.apache.commons</groupId>
  <artifactId>commons-lang3</artifactId>
</dependency>

을 각각 의존성으로 추가해주면 된다.

Why using it

  • 그래서 이걸 왜 사용하는 걸까? 예를 들어 이러한 클래스가 있다.
@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 클래스이다.

Use 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();
    }
}
  • 근데 이거도 필드가 추가되면 손수 적어줘야 하는 건 똑같다. 그냥 따옴표와 더하기에 비해 조금 있어보일 뿐... 똑같이 귀찮다! 그리고 벌써 네 줄이나 써야 해서 손가락이 아프다. 아깐 한 줄이면 됐는데.

Conclusion

  • 다른 로직 짜는데도 머리 아픈데 이런 데 쓸 체력과 타이핑을 조금이라도 줄여야 정말 쾌적한 개발환경이라고 할 수 있지 않을까? 일단 손수 쓰면 필드 추가만 하고 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
  • 하나씩 넣어보면서 본인에게 맞는 옵션값을 찾아가면 된다. 생각보다 많이 좋은 클래스였어!
profile
당면한 문제는 끝까지 해결하기 위해 노력하는 주니어 개발자입니다.

0개의 댓글