-
이 글은 프로젝트를 진행 하면서 몰랐던 부분들을 정리하는 글이다
스프링 3.x 기준으로 작성된 글입니다
JPA 데이터 베이스 초기화
@Entity @Getter @Builder @Table(name = "user") @AllArgsConstructor @NoArgsConstructor public class User { @Id @Column(name = "user_id") @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "user_name) private String name; }
이 방식은 @Entity가 붙은 클래스들을 스캔해서 자동으로 스키마를 생성해주는 방식이다
이 설정에서는 JPA에서 제공하는 설정, Hibernate에서 제공하는 설정이 있다
Jpa 에서 제공하는 설정
spring.jpa.generate-ddl=(boolean 값)
- JPA에서 제공하는 스키마 생성 옵션이다
- true / false boolean 값으로 설정을 한다
- true 설정시에 자동으로 생성해준다
Hibernate 에서 제공하는 설정
spring.jpa.hibernate.ddl-auto=(create, create-drop, update, validate, none)
- Hibernate에서 제공하는 스키마 생성 옵션이다
- create : 기존 스키마 제거 후 다시 생성한다
- create-drop : 기존 스키마 제거 후 다시 생성, 종료 시 제거 한다
- update : DB 스키마와 비교해서 엔티티에 변화가 있으면 DB칼럼을 추가 한다 하지만 제거는 하지 않는다
- validate : Entity 맵핑 한거와 DB 스키마 구조를 비교해서 같은지만 확인하다 -> 일치하지 않는다면 에러 발생
- none : 아무것도 하지 않는다
보통 개발 단계에서 jpa 제공하는 설정 true 값이나
Hibernate에서 제공하는 설정 create, create-drop, update, validate 를 사용한다
하지만 프로덕트 환경에서는 none으로 설정을 한다
SQL DDL 문을 이용한 초기화
SQL 스크립트 파일을 이용해서 스키마를 생성하는 방식이다
우선 이 방식을 사용할때
spring.jpa.generate-ddl=false spring.jpa.hibernate.ddl-auto=none
앞서 말한 것 처럼 JPA 설정을 끈다
그리고 resources 아래에 schema.sql, data.sql를 생성한다 (schema.sql 은 ddl문, data.sql은 초기 데이터)
properties 에 관련된 설정을 한다
1.
spring.sql.init.mode= (always, never, embedded)
위 설정은 데이터 베이스 초기화 모드를 지정하는 설정이다
data.sql, schema.sql 파일을 어떻게 처리할지 결정할수 있다
- always : 애플리케이션이 시작될 때마다 위 파일들을 실행해서 스키마를 생성하고 데이터를 삽입한다
- 개발환경에 주로 사용됨
- never : 애플리케이션이 시작될 때 위 파일들을 실행하지 않는다
- 프로덕트 환경에서 주로 사용됨
- embedded : 내장 데이터 (H2 등등)를 사용할 때만 위 파일을 실행한다
- 내장 데이터베이스를 사용하는 테스트 환경에서 사용됨
2.
spring.jpa.defer-datasource-initialization= (boolean 값)
이 설정은 Spring Boot 2.5 이상에서 도입된 설정이다
데이터 소스 초기화를 지연시킬지 여부를 결정한다
데이터 소스 초기화 순서를 제어해서 JPA 초기화가 데이터 베이스 스키마 초기화 이후에 발생하도록 한다
- true : JPA 초기화가 데이터베이스 스키마 초기화 (schema.sql 실행) 이후에 발생 하도록 한다
- schema.sql 파일로 테이블을 생성 한 후에 JPA가 이 테이블을 인식하고 동작해야 할 때 유용하다
- false : 데이터 소스 초기화를 지연시키지 않는다
- 별도의 초기화가 필요하지 않거나 데이터 소스 초기화 순서가 중요하지 않을 때 사용
3.
spring.sql.init.schema-locations=classpath:schema.sql spring.sql.init.data-locations=classpath:data.sql
이 설정은 파일 위치를 설정하는 것이다
resources 아래에 있는 경우에 classpath:파일이름.sql 로 지정하면 된다
이외에....
간혹 이렇게 설정을 한뒤에 프로젝트를 시작하면 SQL 관련된 에러가 날 수도 있다
그러한 에러는 Spring Boot가 데이터베이스가 MySQL임을 인식하지 못했을 때 발생할 수 있다
그럴땐...
spring.jpa.database-platform=org.hibernate.dialect.MySQL8Dialect
이 설정을 추가 하면 된다이 설정은 Spring Boot가 Hibernate에게 MySQL 데이터베이스와 호환되는 SQL 방언을 사용하도록 명시적으로 지시한다
Hibernate가 MySQL의 문법과 기능에 맞는 SQL 쿼리를 생성하게 되어, 데이터베이스와의 호환성 문제를 줄일 수 있다
만약
mysql 버전이 8.x.x이면 가장 뒤에 MySQL8Dialect,
5.x.x이면 MySQL5Dialect끝!