ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot] Spring Boot 에서 Mysql 설정 값들 및 schema.sql, data.sql 초기화
    Spring Boot 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

     

     

     

    끝!

Designed by Tistory.