들어가며
안녕하세요. 현재 "모아동"이라는 부경대학교 소속 동아리를 안내해주는 서비스를 개발하고 있습니다.
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 라는 어노테이션을 통해 기본값을 인식시켜 줘야 합니다.
정상적으로 저장된 모습을 볼 수 있습니다.
'Spring' 카테고리의 다른 글
[Spring+MongoDB]한 컬렉션에서 중복된 필드값 검증하기(feat. 고유 인덱스) (0) | 2025.02.13 |
---|---|
[Spring 공식문서 정리하기] Resource 관리 (0) | 2025.01.06 |
[Spring 공식문서 정리하기] Spring IoC Container와 Beans(Feat. 의존성 주입(DI)) (1) | 2024.12.25 |