본문 바로가기
개발

[Lombok] @ToString

by angeloper 2023. 7. 16.
반응형

Java 개발에서 toString() 및 equals()와 같은 일반적인 메서드에 대한 상용구 코드를 작성하는 것은 시간이 많이 걸리고 오류가 발생하기 쉽습니다. Lombok의 @ToString 주석은 개발자가 반복적인 수동 구현에서 벗어나도록 도와주고 있습니다.

@ToString은?

Java 클래스에 대한 toString() 메서드 생성을 자동화하는 주석입니다.

사용법

Java class 위에 @ToString 주석을 붙여서 사용할 수 있습니다.

import lombok.ToString;

@ToString(exclude = {"password", "creditCardNumber"})
public class User {
    private String username;
    private String password;
    private String email;
    private String creditCardNumber;
}

상단의 코드를 확인할 경우, 다음과 같이 코드가 생성됩니다. 보시다시피,  password와 creditCardNumber를 제외한 변수에 대해서 toString 메서드가 생성되어 있는 것을 확인할 수 있습니다. 만약,  생성된 User객체의 toString() 메서드를 호출하게 된다면, 객체의 주소가 호출되는 것이지만, 위와 같이 @ToString 주석을 통해서 내부 내용도 확인할 수 있습니다.

public class User {
    private String username;
    private String password;
    private String email;
    private String creditCardNumber;

    public User() {
    }

    public String toString() {
        return "User(username=" + this.username + ", email=" + this.email + ")";
    }
}

@ToString의 추가 옵션

위의 코드에서 보셨다시피, 괄호 안에는 추가적인 옵션을 사용하실 수 있습니다. 그럼 추가적인 옵션의 종류가 무엇이 있는지 확인해 보도록 하겠습니다.

  • exclude : 제외해야 하는 필드를 지정할 수 있습니다. 이것은 배열의 값으로 제공하면 제외가 됩니다.
  • includeFieldNames(기본값 : true) : 기본적으로 Lombok은 생성된 toString() 출력에서 필드 이름을 포함합니다. 만약, 필드 이름을 제외하려면 이 옵션을 false로 해야 합니다. 하기 코드를 확인하셔서 위와 다른 점을 확인해 보시기 바랍니다.
package com.example.lombok.entity;

import lombok.ToString;

@ToString(includeFieldNames = false)
public class User {
    private String name;
    private int age;
}

//--------------------------------------
package com.example.lombok.entity;

public class User {
    private String name;
    private int age;

    public User() {
    }

    public String toString() {
        return "User(" + this.name + ", " + this.age + ")";
    }
}
  • callSuper(기본값 : skip) : 클래스가 다른 클래스를 상속하고 있는 경우, 다른 클래스의 toString 출력을 포함하려는 경우 이 옵션을 true로 설정하면 됩니다.
// User Entity
import lombok.ToString;

@ToString(doNotUseGetters = true)
public class User {
    private String name;
    private int age;
}

// Student Entity
import lombok.ToString;

@ToString
public class Student extends User {
    private String schoolName;
}

//-------- class decomplie(만약, callSuper를 사용하지 않을시) --------
package com.example.lombok.entity;

public class Student extends User {
    private String schoolName;

    public Student() {
    }

    public String toString() {
        return "Student(schoolName=" + this.schoolName + ")";
    }
}

//-------- class decomplie(만약, callSuper를 사용시) --------
package com.example.lombok.entity;

public class Student extends User {
    private String schoolName;

    public Student() {
    }

    public String toString() {
        String var10000 = super.toString();
        return "Student(super=" + var10000 + ", schoolName=" + this.schoolName + ")";
    }
}
  • doNotUseGetters(기본값 : false) : Lombok은 기본적으로 toString() 메서드를 생성할때 getter를 사용하여 접근합니다. 만약, getter를 사용하지 않고 필드에 직접 접근하려면 이 옵션을 true로 해야 합니다.
    • 궁금증 : 하기 코드를 보면, doNotUseGetters가 없는 코드와 동일합니다. 내용을 보면 직접 기본적으로는 getter를 사용한다고 말씀드렸습니다. 이에 궁금하여 내용을 찾아보니 공식문서에 다음과 같이 표기되어 있었습니다.(만약... 사용가능하다면...) 
if set to true, lombok will access fields directly instead of using getters (if available) when generating toString methods. The annotation parameter 'doNotUseGetters', if explicitly specified, takes precedence over this setting.
package com.example.lombok.entity;

import lombok.ToString;

@ToString(doNotUseGetters = true)
public class User {
    private String name;
    private int age;
}
//----------------------------------
package com.example.lombok.entity;

public class User {
    private String name;
    private int age;

    public User() {
    }

    public String toString() {
        return "User(name=" + this.name + ", age=" + this.age + ")";
    }
}

@ToString의 장점

  • 코드 감소: @ToString을 사용하면 toString() 메서드를 수동으로 구현할 필요가 없습니다. 상용구 코드를 줄여 개발 시간과 노력을 절약합니다.
  • 편의성 및 가독성: toString() 메서드를 자동으로 생성하면 코드 가독성이 향상됩니다. 개체 상태를 간결하게 표현하여 복잡한 데이터 구조를 쉽게 디버깅하고 이해할 수 있도록 합니다.
  • 사용자 지정 옵션: @ToString을 사용하면 생성된 toString() 출력에서 ​​특정 필드를 제외하여 사용자 지정할 수 있습니다. 이렇게 하면 민감하거나 관련 없는 정보가 생략되어 표시되는 내용을 제어할 수 있습니다.

@ToString의 단점

  • 제한된 제어: @ToString은 사용자 지정 옵션을 제공하지만 항상 특정 요구 사항을 충족하지 못할 수 있습니다. 복잡한 시나리오에서는 원하는 결과를 얻기 위해 수동 구현이 필요할 수 있습니다.
  • 성능 영향: 생성된 toString() 메서드는 필드에 액세스하기 위해 Lombok에서 사용하는 리플렉션으로 인해 성능에 약간의 영향을 미칠 수 있습니다. 성능이 중요한 애플리케이션에서는 이를 고려할 수 있습니다.
  • 잠재적 보안 위험: toString() 출력에 민감한 정보를 포함할 때는 주의해야 합니다. 민감한 데이터가 포함된 필드를 제외하거나 적절하게 처리하지 않으면 의도치 않게 민감한 정보가 노출될 수 있습니다.
반응형