백엔드 공부/Spring
[Spring+MongoDB]엔티티의 기본값이 DB에 저장되지 않은 문제
나맘임
2025. 2. 13. 02:02
들어가며
안녕하세요. 현재 "모아동"이라는 부경대학교 소속 동아리를 안내해주는 서비스를 개발하고 있습니다.
Spring + MongoDB 기반으로 동아리 담당자 쪽 회원 가입 기능 개발에서 "엔티티의 기본 값이 DB에 저장되지 않은 문제"가 발생했습니다.
문제 상황
User (Entity)
@Entity
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Document(collection = "user")
public class User implements UserDetails {
@Id
private String id;
@NotNull
@Email
@Indexed(unique = true)
@Size(min = 5, max = 50)
private String email;
@NotNull
@Size(min = 8, max = 20)
private String password;
@Builder.Default
@NotNull
private Boolean emailVerified = false;
@Builder.Default
@NotNull
private Date createdAt = new Date();
private Date lastLoginAt;
@Builder.Default
@NotNull
private UserStatus status = UserStatus.ACTIVE;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
@Override
public String getPassword() {
return null;
}
@Override
public String getUsername() {
return null;
}
}
UserRepository
public interface UserRepository extends MongoRepository<User, String> {
}
UserRegisterRequest (DTO)
public record UserRegisterRequest(
String email,
String password,
String phoneNumber
) {
public User of() {
return User.builder()
.email(this.email)
.password(password)
.build();
}
}
UserCommandService
public void registerUser(UserRegisterRequest userRegisterRequest) {
try{
userRepository.save(userRegisterRequest.of());
} catch (DuplicateKeyException e){
throw new RestApiException(ErrorCode.USER_ALREADY_EXIST);
}
}
UserCommandService에서 단순히 save를 진행했을 때, 다음과 같이 DB에 저장됩니다.
@NotNull
private Boolean emailVerified = false;
@NotNull
private Date createdAt = new Date();
분명 엔티티에 기본값을 넣었는데 제대로 작동이 되지 않았습니다.
이를 해결하는 방법은 간단합니다.
해결법
@Builder.Default
@NotNull
private Date createdAt = new Date();
문제는 User 엔티티에 있던 @Builder 어노테이션 때문입니다.
Builder에선 기본적으로 기본값을 무시하게 됩니다.
그렇기에 @Builder.Default 라는 어노테이션을 통해 기본값을 인식시켜 줘야 합니다.
정상적으로 저장된 모습을 볼 수 있습니다.