첫 스프링부트 프로젝트를 시작하면서 참고한 책에서 생성자에 @Builder
를 사용하였다. 해당 책에서는 @Builder
사용의 이점으로 개발자가 객체 생성시에 인자의 순서를 고려하지 않을 수 있고 가독성을 높혀주어 실수를 방지할 수 있다고 설명했다.
이후 습관적으로 @Builder
를 사용중이었기 때문에 빌더패턴을 제대로 알고 사용하고자 한다.
User클래스는 이름, 나이, 키의 3개 필드를 갖고있다.
@Getter
public class User {
private String name;
private int age;
private int height;
@Builder
public User(String name, int age, int height) {
this.name = name;
this.age = age;
this.height = height;
}
}
롬복의 @Builder
어노테이션을 사용하면 간단하게 빌더패턴을 적용할 수 있다.
클래스 또는 생성자에 붙여주면 되는데 생성자에 선언시 생성자에 포함된 필드만 빌더에 포함되기 때문에 안전한 사용을 위해 생성자에 @Builder
를 사용해주고 있다.
User user = new User("울상냥", 160, 20); //나이 160, 키 20...?!
일반적으로 객체 생성시에 생성자의 순서를 고려해 주어야 한다. 개발자는 생성자의 인자 순서를 알아야 한다. 인자의 경우가 많아질경우 인자를 잘못 넣는 실수도 발생할 수 있다.
User user = User.builder()
.name("울상냥")
.height(160)
.age(20)
.build();
빌더를 사용하면 순서를 고려하지 않아도 된다!
User user = new User("울상냥", 20, 160);
생성자를 호출할 때 20
과 160
이 의미하는 값을 알기 어렵다.
User user = User.builder()
.name("울상냥")
.height(160)
.age(20)
.build();
빌더를 사용하면 직관적으로 어떤 멤버변수에 어떤값이 설정되는지 알 수 있다.
User 객체 생성시에 몸무게 필드가 필요하지 않은 경우에
public User(String name, int age) {
this.name = name;
this.age = age;
}
다음과 같이 요구에 맞는 생성자를 만들거나
User user = new User("울상냥", 20, null);
더미값을 넣어 객체를 생성해주어야 한다.
User user = User.builder()
.name("울상냥")
.age(20)
.build();
빌더를 사용하면 원하는 필드만 설정하여 생성자를 호출할 수 있다. 생성자가 많을 경우 빌더를 사용하면 코드의 양을 줄일 수 있다!
변수의 개수가 적거나 변경이 없다면 생성자를 사용하는것이 빌더를 사용하는 것보다 간편하고 간결하다. (빌더를 많이 호출하다보면 한줄이었던 객체 생성이 몇줄에 걸쳐 아주 방대해진다...!)
직접 생성자를 호출하여 데이터를 설정하지 않고 map
을 사용하여 도메인 객체에서 responseDto객체를 생성하는 경우에는 빌더가 필요하지 않지만
일반적으로 객체를 생성하는 경우에는 가독성 등을 고려하여 빌더를 적용하는것이 좋을 것 같다.