오늘도 새롭게 발견한 문제가 있었는데...
@ToString 과 @Builder 어노테이션에 관련한 문제이다.
@ToString 의 경우에는 순환참조 문제가 발생했었고, @Builder 의 경우에는 기본값을 넣지 못하는 문제가 발생했었다.
이와 관련해서 정리를 하자면...
@ToString 어노테이션은 toString() 메소드를 자동으로 생성해준다.
이게 무슨 말이냐면...
@ToString(exclude = "pw")
public class User {
private Long id;
private String name;
private String pw;
private int age;
}
User user = new User();
user.setId(1L);
user.setName("user");
user.setPw("1234");
user.setAge(20);
위와 같은 코드에서 로그나 프린트문으로 출력할 때, user 객체를 출력해서 확인하려면
System.out.println(user.getname(), user.getpw(), user.getage());
이런식으로 해줘야 3개의 값을 모두 출력이 가능한데 @ToString 어노테이션이 적용되어 있으면...
System.out.println(user);
이렇게만 해줘도 3개의 값을 모두 받을 수 있게 된다.
하지만...
@ToString 어노테이션을 사용할 때 두 객체가 양방향 연관관계 이라고 하자
이 때, toString() 을 호출하면 무한 순환 참조의 문제가 발생하는 경우였다. 따라서 이러할 때는 @ToString 어노테이션을 그냥 사용하지 않거나 아래와 같이 설정을 해주어야 한다.
@ToString(exclude = "대상객체")
@Builder 어노테이션의 경우에는 빌더로 인스턴스 생성 시 초기화 값을 지정할수 없었던 문제이다.
이 어노테이션을 사용하면 얻게되는 장점이 여러개 있지만 간단하게 말하자면...
빌더 패턴을 사용할 시 생성자 인자를 메서드 체인을 통해 명시적으로 대입하여 생성자를 호출할 수 있게 빌더 클래스를 생성해 준다.
빌더 클래스와 IDE 의 자동 완성 기능을 같이 활용하면 생성자 작성 시 오기입 확률과 인자를 누락할 확률을 획기적으로 낮출 수 있다.
특징으로는 생성자, 메서드 또는 클래스 레벨에서 쓰일수 있다고 명시되어 있다.
또한 클래스 레벨에서 쓰일 경우 기본적으로 전체 멤버를 생성자의 매개값으로 갖는 private 생성자를 만들어 준다.
이 생성자는 @XArgsConstructor(NoArgs, RequiredArgs) 또는 어떤 생성자도 클래스 내부에 선언하지 않았을 경우에만 생성된다.
반대로 위의 두 조건 중 하나를 했을 경우, 모든 필드를 매개값으로 하는 생성자를 자동으로 선언해서 사용한다. 따라서 이 경우 AllArgsConstructor 가 없으면 컴파일 에러가 발생한다.
기본적인 설명은 여기까지 하고...
아래와 같이 사용할 때에는 빌더 패턴으로 인해서 발생하는 문제가 없다.
하지만 아래처럼 빌더 패턴을 이용해서 인스턴스를 만들 때 특정 필드를 특정 값으로 초기화를 하고 싶다면
@Builder.Default 를 사용해줘야만 가능하다.
Lombok 사용 시 주의할 점
@Data 사용 지양 해당 어노테이션은 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor을 모두 갖춘 강력한 어노테이션임 무분별한 사용은 오히려 부작용을 가져올 수 있음(Setter 남용 금지
kim6394.tistory.com
[Lombok] @Builder.Default
Lombok에서 제공하는 이 어노테이션은 생성자 인자를 메서드 형식으로 명시적으로 대입하여 생성자를 호출할 수 있게 해준다.
velog.io
'일기' 카테고리의 다른 글
2023-01-23 (0) | 2023.01.23 |
---|---|
2023-01-21 (0) | 2023.01.21 |
2023-01-19 (0) | 2023.01.19 |
2023-01-18 (0) | 2023.01.18 |
2023-01-17 (0) | 2023.01.17 |