ddl-auto 란

JPA에서는 기본적으로 Entity에 테이블을 매핑하면 쿼리를 사용하지 않고 값을 가져올 수 있습니다.
설정 옵션으로

1
2
3
jpa:
  hibernate:
    ddl-auto: create #create-drop, update, validate, none

각각의 옵션을 봐보면 아래와 같습니다.

  • create : SessionFactory 시작시 스키마를 삭제하고 다시 생성
  • create-drop : SessionFactory 종료 시 스키마를 삭제
  • update : SessionFactory 연결된 DB와 비교하여 추가된 항목은 추가 만약 같은 변수명이면 오류발생
  • validate : SessionFactory 시작시 객체구성과 스키마가 다르다면 예외 발생
  • none: 아무것도 안함

실제 서비스 배포시에는 create, create-drop, update 와 같은 옵션을 사용하면 안되지만 개발 초기 테스트시에는 유용하게 사용할 수 있습니다.

샘플데이터 추가 방법

그렇지만 데이터 테이블만 생기고 데이터가 없으니 오히려 테스트하기 불편한 점이 있습니다.

그렇기에 찾아보니 역시 당연하게도.. resources 폴더에 import.sql 파일을 추가하면 hibernate에서 알아서 해당 더미데이터 쿼리를 찾아 실해시켜줍니다.

만약 특정 파일을 지정하고 싶다면 아래와 같이

1
2
3
4
5
6
7
8
jpa:
  properties:
    hibernate:
      hbm2ddl:
        import_files: classpath:db/data.sql # DB 파일 명시적으로 선택
        import_files_sql_extractor: org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor # 멀티 라인 입력 가능하도록
      connection: 
        charSet: UTF-8 # 인코딩 설정

파일명을 명시주면 create에 자동으로 해당 데이터를 insert 할 수 있습니다.

예제

만약 아래와 같이 user 테이블이 있다면..

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import java.time.LocalDateTime;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.DynamicUpdate;

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Entity
@DynamicUpdate
@Table(name = "user")
public class UserEntity {
    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(nullable = false, updatable = false)
    private Long userSno;

    @Column(length = 20, nullable = false, unique = true)
    private String userId;

    @Column(length = 20)
    private String userName;

    @Column(length = 20, nullable = false)
    private String password;

    @Column(length = 30)
    private String email;

    @Column(nullable = false, updatable = false, insertable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
    private LocalDateTime createDt;

    @Column(nullable = false, updatable = false, insertable = false)
    @ColumnDefault("0")
    private int useYn;

    @Builder
    public UserEntity(Long userSno, String userId, String userName, String password, String email) {
        this.userSno = userSno;
        this.userId = userId;
        this.userName = userName;
        this.password = password;
        this.email = email;
    }
}

import.sql파일 또는 지정한 sql파일에 아래와 같이 코드를 추가해주면 빌드 시 자동적으로 데이터를 넣을 수 있습니다.

1
2
insert into `user` (`email`, `password`, `user_id`, `user_name`) values ('admin@admin.com', '$2a$10$dyiw3YfbmBkHlUdbgWhsYesqniOsXo71KBzF75le5.YtS/rsrsM22', 'admin', '관리자');
insert into `user` (`email`, `password`, `user_id`, `user_name`) values ('test@test.com', '$2a$10$PMc5QFOUViVsGmsNMQqUzOuQG2rZ2wUJjSTRGFkBo9jZR/CSnQ03K', 'test', '테스트');

주의할 점은 실제 배포시에는 꼭 ddl-autonone으로 해야 합니다.
ddl-auto의 경우 초기 DB 설정 및 간단한 테스트에서만 쓰는게 좋습니다.