Post

JPA 기본 Column 값

1. Entity를 생성하는 동안

기본 열 값을 설정하는 첫 번째 방법은 이를 엔터티 속성 값으로 직접 설정하는 것이다.

1
2
3
4
5
6
7
8
@Entity
public class User {
    @Id
    private Long id;
    private String firstName = "John Snow";
    private Integer age = 25;
    private Boolean locked = false;
}

이제 new 연산자를 사용하여 엔터티를 생성할 때마다 기본값이 설정된다.

1
2
3
4
5
6
7
8
9
@Test
void saveUser_shouldSaveWithDefaultFieldValues() {
    User user = new User();
    user = userRepository.save(user);
    
    assertEquals(user.getName(), "John Snow");
    assertEquals(user.getAge(), 25);
    assertFalse(user.getLocked());
}

이 솔루션에는 한 가지 단점이 있다.

SQL 테이블 정의를 살펴보면 기본값이 표시되지 않다.

1
2
3
4
5
6
7
create table user
(
    id     bigint not null constraint user_pkey primary key,
    name   varchar(255),
    age    integer,
    locked boolean
);

따라서 이를 null로 재정의하면 엔터티는 오류 없이 저장된다.

1
2
3
4
5
6
7
8
9
10
11
12
@Test
void saveUser_shouldSaveWithNullName() {
    User user = new User();
    user.setName(null);
    user.setAge(null);
    user.setLocked(null);
    user = userRepository.save(user);

    assertNull(user.getName());
    assertNull(user.getAge());
    assertNull(user.getLocked());
}

2. 스키마 정의에서

SQL 테이블 정의에서 직접 기본값을 생성하려면 @Column 주석을 사용 하고 해당 columnDefinition 매개변수를 설정할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Entity
public class User {
    @Id
    Long id;

    @Column(columnDefinition = "varchar(255) default 'John Snow'")
    private String name;

    @Column(columnDefinition = "integer default 25")
    private Integer age;

    @Column(columnDefinition = "boolean default false")
    private Boolean locked;
}

이 방법을 사용하면 SQL 테이블 정의에 기본값이 표시된다.

1
2
3
4
5
6
7
create table user
(
    id     bigint not null constraint user_pkey primary key,
    name   varchar(255) default 'John Snow',
    age    integer      default 35,
    locked boolean      default false
);

그리고 엔터티는 기본값으로 올바르게 저장된다.

1
2
3
4
5
6
7
8
9
@Test
void saveUser_shouldSaveWithDefaultSqlValues() {
    User user = new User();
    user = userRepository.save(user);

    assertEquals(user.getName(), "John Snow");
    assertEquals(user.getAge(), 25);
    assertFalse(user.getLocked());
}

이 솔루션을 사용하면 엔터티를 처음 저장할 때 지정된 열을 null로 설정할 수 없다. 값을 제공하지 않으면 기본 값이 자동으로 설정된다.

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.