@NoArgsConstructor + @Setter
먼저 빈 객체를 생성한 뒤, 필요에 따라 원하는 필드 값을 주입하는 방식.
Custom Constructor 만들기
@AllArgsConstructor
복잡한 객체의 생성 과정과 표현 방법을 분리하여 다양한 구성의 인스턴스를 만드는 패턴이다.
객체 생성을 위해 내가 원하는 필드만 생성할 수 있고 순서도 뒤죽박죽으로 할 수 있다.
생성자와 달리 필드 값 주입 순서에 구애받지 않는다.
RequestDto dto = RequestDto.builder()
.world("B")
.hello("A")
.build();
객체 생성을 위한 필드값 주입 역할을 마음껏 분리할 수 있다.
RequestDto.RequestDtoBuilder isBuildingSetHello =
RequestDto.builder()
.hello("A");
RequestDto.RequestDtoBuilder isBuildingSetWorld =
isBuildingSetHello
.world("B");
RequestDto initialized = isBuildingSetWorld.build();
하지만 단점으로 객체 생성시 생성되지 말아야하는 필드까지 빌더로 설정할 수 있다.
필수 매개변수와 함께 입력받아 인스턴스를 생성할 때 생성자를 오버로딩 하는 방식이다.
즉 생성자에 필요한 매개변수를 모두 넣는 것.
클래스 인스턴스 필드들이 많으면 많을수록 생성자에 들어갈 인자의 수가 늘어나 몇 번째 인자가 어떤 필드였는지 알기 힘들 때가 있다.
생성자 만으로는 필드를 선택적으로 생략할 방법이 없다.
위와 같은 단점을 보완하기 위한 것이 자바 빈 패턴이다. 매개변수가 없는 생성자로 객체 생성 후 setter 메서드로 이용해 클래스 필드의 초깃값을 설정한다.
하지만 객체 생성 시점에 모든 값들을 주입하지 않아 일관성, 불변성 문제가 발생한다.
객체가 유효하지 않아 만일 다른 곳에서 인스턴스를 사용하게 되면 런타임 예외가 발생할 수 있다.
setter는 객체를 처음 생성할 때 필드 값을 설정하기 위한 메서드이다. 여전히 setter 메서드를 노출하고 있기 때문에 누군가가 setter를 조작하게 되면 불변성이 떨어진다.
그래서 나온 것이 빌더 패턴이다. 별도의 Builder 클래스를 만들어 메서드를 통해 값을 입력 받은 후 최종적으로 build() 메서드로 하나의 인스턴스를 생성하여 반환한다.
객체를 생성할 수 있는 방법이 오직 하나의 정적 메소드 방식으로만 가능하도록 설정.
생성자를 통해서가 아닌 static method를 통해서 객체를 생성하는 역할을 한다.
팩토리 메서드는 객체를 생성 혹은 반환하는 것이다.
생성자를 Lombok 어노테이션으로 Private 형태로 정의/감출 수도 있다.
@Getter
class ParsedRequestDto {
private final String hello;
private final String world;
private ParsedRequestDto(String hello, String world) {
this.hello = hello;
this.world = world;
}
public static ParsedRequestDto of(RequestDto requestDto) {
String calculated = Calculator.caculate(
requestDto.getHello(),
requestDto.getWorld()
);
ParsedRequestDto created = new ParsedRequestDto(
requestDto.getHello(),
requestDto.getWorld()
);
return created;
}
}
🔗 https://charliezip.tistory.com/17 - 빌더
🔗 빌더 패턴