티스토리 뷰

 

 

프로젝트 내부의 schema.sql을 사용하려는 이유

 

application-yml에 spring:jpa:hibernate:ddl-auto를 validate, none을 두고,
직접 DB에 쿼리문을 계속 실행하고 있었다.

 

개발하면서 수정할게 있으면 ERD, 노션(문서), 쿼리문 수정을 해야하니 여간 귀찮은게 아니였다.

DDL문 수정하고, DML문으로 데이터 넣고...

 

그래서 프로젝트 내에서 쿼리문만 수정하고 바로 기동하면 적용되도록 schema.sql, data.sql을 이용하여 편하게 개발을 하려고 한다.

 

 

 

 

schema.sql, data.sql 만으로 쿼리가 실행되지 않는다.

 

파일만 생성해두고, 기동해보았지만 뭐 달라지는게 없었다.

 

 

삽질 1)  ddl-auto: create로 변경하고,  로컬 서버 기동 (실패)

내가 의도하는 schema.sql로 실행되게 아니라 엔티티 기준으로 테이블이 생성되 었다.

그리고 엔티티 기준으로 생성되어서 그런지 원하지 않는 UNIQUE 제약조건까지 생겼다.

 

JPA가 자동으로 테이블 생성하는 쿼리
[그림1] 테이블 생성 쿼리

 

 

삽질 2) ddl-auto: create를 그대로 두고, spring:sql:init:mode 옵션을 추가 (실패)

스프링 공식문서에 보면 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-2.7-Configuration-Changelog

 

Spring Boot 2.7 Configuration Changelog

Spring Boot helps you to create Spring-powered, production-grade applications and services with absolute minimum fuss. - spring-projects/spring-boot

github.com

스프링 2.7.0 버전 공식 문서
[그림2] 스프링 옵션 명 변경 2.7.0

 

이것과 같이 옵션명이 변경되었고, sql을 사용할 수 있도록 always 라는 옵션으로 설정해 주었다.

spring:
  sql:
    init:
      mode: always # 스크립트 실행 활성화
  jpa:
    hibernate:
      ddl-auto: create
    show-sql: true
    properties:
      hibernate:
        format_sql: true
    database: postgresql

 

우선 내가 의도 하려는 schema.sql, data.sql문은 실행이 안될 뿐더러

create 할 때, 엔티티 기준으로 생성되어서 그런지 원하지 않는 UNIQUE 제약조건까지 생겼다.

 

 

삽질3) 실행할 쿼리.sql 지정과 ddl-auto 옵션 valudate, none으로 설정 (성공)

기동할 때 마다 create로 하는건 validate로 꺼주고,

내가 의도한 schema.sql, data.sql을 실행하도록 해당 위치에 실행하도록 설정해주었다.

 

프로젝트 디렉토리 구조
[그림3] yml 파일과 sql파일 위치

spring:
  sql:
    init:
      mode: always # 스크립트 실행 활성화
      schema-locations: classpath:sql/schema.sql
      data-locations: classpath:sql/data.sql
  jpa:
    hibernate:
      ddl-auto: validate
    show-sql: true
    properties:
      hibernate:
        format_sql: true
    defer-datasource-initialization: false
    database: postgresql

데이터 INSERT된 모습
[그림4] 서버 기동했을 때 정상적으로 들어가 있는 데이터

 

 

 

 

defer-datasource-initialization: false 옵션 설명

 

이 옵션은 쉽게 말해 "JPA야, 나대지 말고(?) 잠깐 기다려. 내가 SQL 스크립트 먼저 돌리고 올게" 라고 순서를 정해주는 옵션이다.

 

  • false : "데이터소스 초기화(SQL 스크립트)를 미루지마!" (defer = False). 즉, 지금 당장, JPA 보다 먼저 실행해!
  • true : "SQL 스크립트 실행을 나중으로 미뤄 (defer = True)" 즉, JPA가 테이블 다 만들고 나면 그 다음에 실행해!

 

나는 ddl-auto를 validate로 두었기 때문에 SQL 스크립트를 먼저 실행했어야 했다.

그래야 JPA가 테이블을 유효성 검사를 하기 때문이다.

 

뭐 ddl-auto: none으로 두면 굳이 이 옵션을 둘 필요는 없을 것 같다. ^_^

 

감사합니다.

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/12   »
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
글 보관함