스프링 부트 - 데이터베이스 초기화
JPA를 사용한 데이터베이스 초기화
appication.properties1
2
3
4
5
6
7
8
9
10
11
12=org.mariadb.jdbc.Driver
# database명이 springboot이다.
=jdbc:mariadb://localhost:3307/springboot
# 자신의 userid (루트 계정이라면 root)
=userid
# 자신의 password
=password
=update
# 기본값 : false
=true
=true- spring.jpa.hibernate.ddl-auto 의 옵션에는 다음과 같은 값들을 넣을 수 있다.
update: 기존의 스키마를 유지하며 JPA에 의해 변경된 부분만 추가한다.validate: 엔티티와 테이블이 정상적으로 매핑되어있는지만 검증한다.create: 기존에 존재하는 스키마를 삭제하고 새로 생성한다.create-drop: 스키마를 생성하고 애플리케이션이 종료될 때 삭제한다.none: 초기화 동작을 하지 않는다.
- spring.jpa.generate-ddl 은 위의 spring.jpa.hibernate.ddl-auto 속성을 사용할지 말지를 결정하는 옵션이다. 기본값이 false이기 JPA에 의한 자동 초기화 기능을 사용하려면 true로 바꾸고 사용한다.
- spring.jpa.show-sql 를 true로 하면 JPA가 생성한 SQL문을 보여준다.
1 | spring.jpa.hibernate.ddl-auto=create |
- 다음 이미지는 위와 같이 설정을 주고 실행한 결과이다.
- 기존에 존재하는 테이블이 drop되고 새로운 테이블이 생성되는 것을 볼 수 있다.
서비스 운영 시에는 다음과 같은 설정을 주로 사용한다.
1
2
3spring.jpa.hibernate.ddl-auto=validate
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true위와 같이 설정한 후 아래와 같이 기존 스키마를 가지는 Account클래스에 email필드를 추가한다.
다시 서버를 실행하면 다음과 같은 에러가 발생한다.
이번에는 다음과 같이 설정하고 실행해보자.(개발할 때만 이런 설정을 주로 한다고 한다.)
1
2
3spring.jpa.hibernate.ddl-auto=update
spring.jpa.generate-ddl=true
spring.jpa.show-sql=true다음과 같이 테이블에 email 컬럼이 추가되어 alter 가 적용된 것을 볼 수 있다.
- 위와 같이 변경 사항이 적용된 것을 볼 수 있다. 하지만 이미 존재하는 컬럼의 이름을 바꾸는 것은 JPA가 자동으로 업데이트 해주지는 않는다.
Account.java1
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
54
55
56
57
58
59
public class Account {
// @GeneratedValue : Primary Key의 값을 자동 생성하기 위해 명시하는데 사용되는 어노테이션
private Long id;
private String username;
private String password;
private String email;
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Account account = (Account) o;
return Objects.equals(id, account.id) &&
Objects.equals(username, account.username) &&
Objects.equals(password, account.password);
}
public int hashCode() {
return Objects.hash(id, username, password);
}
}
SQL 스크립트를 사용한 데이터베이스 초기화
다음과 같이 schema.sql 또는 schema-${platform}.sql 과 같은 파일을 생성하여 자동으로 데이터베이스를 초기화할 수 있다.
resources/schema.sql1
2
3
4drop table account if exists
drop sequence if exists hibernate_sequence
create sequence hibernate_sequence start with 1 increment by 1
create table account (id bigint not null, email varchar(255), password varchar(255), username varchar(255), primary key (id))위와 같이 SQL 스크립트 파일로 초기화를 한다면 아래와 같이
application.properties를 설정해도 스프링 부트에서 자동으로schema.sql의 sql을 실행하기 때문에 테이블이 삭제되었다가 다시 생성된다.1
2
3spring.jpa.hibernate.ddl-auto=validate
spring.jpa.generate-ddl=false
spring.jpa.show-sql=true
참조
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8/dashboard
https://engkimbs.tistory.com/794?category=767865