[SPRING] Builder 생성자로 생성할 때, 초기값 설정은 이렇게 하는거다.

wannabeing·2025년 4월 29일
1

SPRING

목록 보기
11/12
post-thumbnail

✅ Order 엔티티

@Entity(name = "orders")
@Table(name = "orders")
@NoArgsConstructor
@Getter
public class Order extends BaseEntity {

	....
	
	@Enumerated(EnumType.STRING)
	private OrderStatus status = OrderStatus.REQUESTED;

	// 생성자
	@Builder
	public Order(... OrderStatus status) {
		...
		this.status = status;
	}
}

💭 나의 생각

Order.builder()
	.a()
    .b()
    .c()
    .build(); // status는 초기화 안했으니까 `REQUESTED` 상태가 되겠지??
  • 빌더생성자를 사용한다.
  • status 필드를 null로 받으면, 필드값을 REQUESTED로 초기화한다.

😇 실제로는..

  • 테스트 코드로 주문 생성 시에 초기 상태는 요청상태입니다.라는
    단위 테스트를 진행하다 보니 아니라는 걸 알게되었다!!
  • 계속 null 이 들어가고 있었음..

방법1) 생성자에서 초기화해주자!

@Entity(name = "orders")
@Table(name = "orders")
@NoArgsConstructor
@Getter
public class Order extends BaseEntity {

	....
	
	@Enumerated(EnumType.STRING)
	private OrderStatus status; // 수정

	// 생성자
	@Builder
	public Order(...) {
		...
        // ✅ 여기서 무조건 초기화!
		this.status = OrderStatus.REQUESTED;
	}
	
	...
}
  • Order 엔티티의 경우, 생성될 때 무조건 REQUESTED 상태를 가져야한다.
  • 주문을 만든다는 건 → 주문을 요청하는 것과 같다는 뜻이므로!
order Order = Order.builder()
	.a()
    .b()
    .c()
    .build(); // ✅ 생성자 내부에서 초기화!

방법2) 더 유연하게 초기화해보자!

@Entity(name = "orders")
@Table(name = "orders")
@NoArgsConstructor
@Getter
public class Order extends BaseEntity {

	....
	
    @Builder.Default // ✅ 어노테이션 추가!
	@Enumerated(EnumType.STRING)
	private OrderStatus status = OrderStatus.REQUESTED;

	// 생성자
	@Builder
	public Order(... OrderStatus status) {
		...
		this.status = status;
	}
}
  • 기존 코드에 @Builder.Default 어노테이션만 추가해준다.
  • 기본은 REQUESTED로 초기화된다.
  • 빌더에서 명시하여 status 필드값을 변경할 수도 있다!
Order requestOrder = Order.builder()
    .a()
    .b()
    .build(); // ✅ status는 기본값 "REQUESTED"로 초기화!

Order acceptedOrder = Order.builder()
	.a()
    .b()
    .status(OrderStatus.ACCEPTED)
    .build(); // ✅ status는 "ACCEPTED"로 초기화!

🧹 정리

모든 주문은 무조건 REQUESTED 상태로 시작해야 한다!
→ 방법1: 생성자에서 초기화!

주문 생성 시점에 다양한 상태(REQUESTED, ACCEPTED 등)를 유연하게 생성한다!
→ 방법2: @Builder.Default로 초기화!

단, 방법2는 빌더를 사용할 때만 초기화할 수 있는 방법이고,
생성자가 1개일 때 유용하게 사용할 수 있을 것 같다!

상황에 따라 유연하게 적용해보자!!

profile
wannabe---ing

2개의 댓글

comment-user-thumbnail
2025년 4월 29일

빌더... PR 리뷰 잊지 않겠습니다.. 팀 프로젝트 고생 많으셨습니다!

1개의 답글