Spring Boot

[Spring Boot] Spring Boot 에서 Mysql 설정 값들 및 schema.sql, data.sql 초기화

hyeonit 2024. 7. 8. 02:11

이 글은 프로젝트를 진행 하면서 몰랐던 부분들을 정리하는 글이다

스프링 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

 

 

 

끝!