본문 바로가기

CS 잡지식

@ToString(feat. lombok)

System.out.println("member" + member)이 호출이 되면,

1] 개발자가 toString() 메서드를 오버라이딩했다면, toString()이 호출이 된다.

2] 개발자가 toString() 메서드를 오버라이딩하지 않았다면, 참조 변수가 찍힌다.

-> 1]의 경우, 만약 클래스 내에 필드가 100개라면 toString()을 오버라이딩할 때,

100개의 필드에 대해 일일이 코딩을 해줘야 하는 중작업이다. 

Lombok에서는 이러한 문제를 @ToString()으로 한 방에 해결해 준다. 

@Entity
@Getter@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 기본 생성자를 protected로 자동 생성해준다.
@ToString()
public class Member { 

    @Id@GeneratedValue
    @Column(name = "member_id")
    private Long id;

    private String username;

    private int age;

    @ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    @JoinColumn(name = "team_id")
    private Team team;
    
    //이하 생략

 

@Test
public void sss(){
    
    Member member = new Member("123");
    
    //member.toString() 호출!
    System.out.println("member = " + member);
}

@ToString()이 Member 클래스 내의 모든 필드에 대해 출력해주는 toString()메서드를 오버라이딩해줌.

그러나 Member 클래스 내에서 노출하기 민감한 필드에 대해서는 호출해주고 싶지만 않다면???

아래와 같이 [of]를 사용하면 된다. 



@Entity
@Getter@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 기본 생성자를 protected로 자동 생성해준다.
@ToString(of = {"id", "username", "age"}) // 필드 범위 제한!
public class Member { 

    @Id@GeneratedValue
    @Column(name = "member_id")
    private Long id;

    private String username;

    private int age;

    @ManyToOne(fetch = FetchType.LAZY,cascade = CascadeType.ALL)
    @JoinColumn(name = "team_id")
    private Team team;
    
    //이하 생략