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에 저장됩니다.

그림 1. 저장되지 않은 엔티티 기본값

    @NotNull
    private Boolean emailVerified = false;
    @NotNull
    private Date createdAt = new Date();

분명 엔티티에 기본값을 넣었는데 제대로 작동이 되지 않았습니다.

이를 해결하는 방법은 간단합니다.

 

해결법

@Builder.Default
@NotNull
private Date createdAt = new Date();

 

문제는 User 엔티티에 있던 @Builder 어노테이션 때문입니다.

Builder에선 기본적으로 기본값을 무시하게 됩니다.

그렇기에 @Builder.Default 라는 어노테이션을 통해 기본값을 인식시켜 줘야 합니다.

그림 3. 정상적으로 기본값이 저장된 모습

정상적으로 저장된 모습을 볼 수 있습니다.