복잡한 객체를 단계별로 만들 수 있게 해주는 생성 패턴. GoF의 23개 패턴 가운데 생성 패턴에 속하고, 생성자만으로 객체를 만들 때 생기는 문제를 개선하려고 고안되었다.
생성자에 늘어선 인자
Member member = new Member("신재윤", 28, 1, 5000);28과 1과 5000이 각각 무엇인지 알 수 없다. 나이인지 경력인지 연봉인지 정의를 찾아봐야 하고, 순서를 바꿔 넣어도 타입이 같으면 컴파일이 통과한다. 값을 일부만 넣고 싶어도 방법이 없어서 넣지 않을 자리에 null을 일일이 채워야 한다.
이름을 붙여 값을 채우기
Member member = Member.builder()
.name("신재윤")
.age(28)
.experience(1)
.salary(5000)
.build();각 값이 무엇인지 이름이 말해주니 가독성이 좋다. 순서를 바꿔도 상관없고 잘못된 필드에 넣을 수 없어서 휴먼 에러가 준다. 필드가 추가되어도 기존 호출부를 고치지 않아 확장하기도 쉽다.
setter를 대신하는 자리
Entity에서 setter 대신 쓰는 자리가 여기다. setter를 열어두면 인스턴스 값이 언제 어디서 변하는지 알 수 없어 일관성이 깨진다. 빌더로 생성할 때 값을 다 채우고 그 뒤로는 의미 있는 이름의 메서드로만 바꾸게 한다. 만들 때 완전한 상태로 만들고 그 뒤에는 함부로 못 바꾸게 한다는 점에서 불변 객체와 통하는 발상이다.
값어치를 하는 조건
선택적인 속성이 많거나, 인자가 최소 네 개 이상이거나, 앞으로 인자가 더 늘어날 것 같을 때 값어치를 한다. 인자가 두세 개고 늘어날 일이 없으면 코드만 늘어나므로 생성자가 낫다. 롬복의 @Builder를 쓰면 그 부담은 사라진다.