투두메이트 클론 코딩 중, 새로운 todo를 만들 때 status 필드의 기본값을 설정해줘야 할 일이 생겼다. todo(할 일)의 status는 보통 PENDING(미완료)로 시작한다.
이 기본값을 어디서 정해주는 게 좋은 방식일 지 고민하게 됐다.
- DB 테이블 생성 시 해당 필드에 default 설정 해주기
- Java 엔티티에서 변수 선언 시 기본값 설정하기
- 생성자에서 기본값 설정하기
- Builder에서 기본값 설정하기 (@Builder + @Builder.Default)
각 방법을 하나씩 살펴보자.
1. DB 테이블 생성 시 해당 필드에 default 설정 해주기

위처럼 todo 테이블을 생성할 때 status의 기본값을 pending으로 설정해주는 방식이다.
DB에서 자동으로 기본값을 설정해 주지만,
Java에서 생성되는 객체에는 해당 기본값이 자동으로 반영되지 않는다. 즉 Java 엔티티와 DB간에 일관성 문제가 발생할 수 있다.
DB와 Java 코드에서 기본값을 일관성 있게 다뤄야 하기 때문에 Java 엔티티에 기본값을 명확하게 설정하는 것이 더 직관적이다.
2. 필드 선언 시 직접 초기화

코드가 간단하고 직관적이고, 어떤 생성자를 쓰던 이 기본값 설정이 잘 작동한다.
기본값을 변수 선언 시 자동으로 처리해주므로 생성자에서 매번 설정하지 않아줘도 된다.
클래스에 @Builder를 사용하는 경우에는 해당 필드 위에 @Builder.Default를 붙여주면 정상적으로 작동한다.
생성자에 @Builder를 사용하는 경우에는 빌더로 객체를 생성할 때 필드의 기본값이 무시될 수 있다.
(채택) 3. 생성자에서 직접 설정

생성 로직 안에서 명확하게 기본값을 부여하는 방식
빌더 패턴을 사용하지 않거나, @Builder를 생성자에 붙일 때 유용하다.
다양한 생성자가 필요할 경우 매번 기본값을 설정하는 번거로움이 있을 수 있다.
status 필드가 필수적인 경우에는, 생성자에서 명확히 설정해주면 읽기 쉽고 유지보수에 좋다.
4. 빌더에서 기본값 주기 (Builder + @Builder.Default)

객체를 빌더 패턴으로 생성할 때(Builder를 클래스에 달아줄 경우)만 기본값을 설정할 수 있다.
빌더 사용 시에만 기본값이 설정되고, 생성자 사용 시엔 기본값이 적용되지 않아 일관성 문제가 발생할 수 있고,
@Builder를 클래스 위에 쓰면
- 불필요한 필드가 빌더에 노출될 수 있고
- 필수 필드가 누락돼도 에러나지 않기 때문에 불완전한 객체가 생성될 수 있는
문제가 발생할 수 있으므로, Builder는 클래스가 아닌 생성자에만 붙이는게 더 안전하기도 하다.
생성자 방식과 빌더 패턴으로 객체를 생성할 때 모두 기본값이 정상적으로 저장되는 3번 방식을 채택하였다.
'궁금한 것' 카테고리의 다른 글
| 지연 로딩과 즉시 로딩의 차이 (2) | 2025.05.08 |
|---|