https://kwonnam.pe.kr/wiki/java/lombok/pitfall 님의 게시글을 보며 다른 예제를 생각해 보면서 학습하였습니다.
@AllArgsConstructor
public class User {
private String password;
private String Id;
}
이러한 클래스가 있을 경우 다른 개발자분이 Id를 먼저 받고 싶어서
@AllArgsConstructor
public class User {
private String Id;
private String password;
}
이렇게 변경했다고 생각해보면 생성자를 직접 작성해 주지도 않았고 받는 타입도 똑같기 때문에 기존의 코드에서는 오류가 나지 않고 실행이 잘 되는 모습을 보여준다. 하지만 이미 들어오는 값은 반대로 들어오기 때문에 Id에 비밀번호가 들어가고 비밀번호 값에 Id가 들어가게 될 것이다.
사용하면 편리하지만 그만큼 큰 오류가 생길 수도 있기 때문에 사용하지 않는 것이 좋다. @Data 어노테이션 안에도 생성자가 들어가 있기 때문에 사용하지 말아야 한다.
public class User {
private String Id;
private String password;
@Builder
public User(String Id, String password) {
this.Id = Id;
this.password = password;
}
}
생성자를 직접 생성하고 빌더패턴을 이용하면 파라미터를 순서별로 생성하는게 아닌 이름으로 값을 넣을 수 있기 때문에 리팩토링에도 유연하게 대처할 수 있다.
하지만 @Builder 어노테이션도 AllArgsConstructor 를 가지고 있기 때문에 클래스에 붙이는 것 보다 직접 만든 생성자나 static 객체 생성 메소드에 붙이는 것을 권장한다.