Springboot SQL 스크립트 적용기

gwanhyeon·2022년 11월 21일

SpringBoot

목록 보기
1/2
post-thumbnail

Springboot SQL 스크립트 적용기

이번 개인 사이드 프로젝트인 멤버십 프로젝트를 진행하면서 초기 프로젝트 세팅을 진행중 발생한 이슈에 대해 공유해보려고 합니다.

JPA에서 ddl-auto를 사용하여 서버가 실행되면서 테이블 생성 시 Entity 칼럼 순서가 아니라
알파벳 a~z 순서대로 컬럼이 삽입됩니다. postman으로 생성 API Request시에 엔티티에 정의한 순서대로 생성이 되지 않아 요청시 컬럼을 맞춰주어야하나 라는 생각을 하다가, script로 sql문을 직접 작성하여 테이블 생성을 진행해보자라는 생각을 하게 되었습니다.

어떻게 적용하지?

일단 script 폴더를 생성하여 schema-h2.sql파일을 생성해주었습니다.

drop table if exists "table name"

create table "table name" (
    id                    bigint generated by default as identity,
    brdt                  varchar() ....)

의 형식으로 sql문을 작성하였습니다.

이제 제가 만든 sql파일들을 springboot가 실행시에 spring-boot의 설정 파일인 application.yml을 읽어들이면서 hibernate, JPA 등 설정 파일을 load 하기때문에 이 부분을 수정하게 되었습니다.

spring:
  datasource:
    url: jdbc:h2:~/{database name}
    username: sa
    password:
    driver-class-name: org.h2.Driver
  h2:
    console:
      enabled: true
  jpa:
    hibernate:
      ddl-auto: validate
    properties:
      hibernate:
        format_sql: true
    generate-ddl: false
    defer-datasource-initialization: true
  sql:
    init:
      schema-locations: classpath:script/schema-h2.sql
      mode: always
logging:
  config: classpath:log4j2.xml
  level:
    org.hibernate.SQL: debug

schema-locations를 통해서 classpath(src/main/resources/script/schema-h2.sql의 파일을 읽어 들입니다. classpath: 를 사용하면 해당 src/main/resources에 대한 입력을 줄일 수 있습니다.

기존에는 properties schema를 설정해주었던 것으로 보이는데 이부분은 spring 2.5이상으로 버전 업데이트가 되면서 변경되었습니다.(참고)

version 2.4 이하 설정: spring.datasource.initialization-mode
version 2.5 이상 설정: spring.sql.init.mode

ddl-auto 옵션

create: 기존테이블 삭제 후 다시 생성 (DROP + CREATE)
create-drop: create와 동일하나 종료시점에 테이블 DROP
update: 변경 반영(운영 X)
validate: 엔티티와 테이블이 정상 매핑 확인
none: 사용하지 않음

defer-datasource-initialization

스프링 부팅은 내장된 DataSource의 스키마를 자동으로 만드는데 이것에 대한 초기화 설정을 시켜주어야합니다.


해당 방법으로 응용을 해보자면, 테이블 생성과 더미 데이터삽입을 data.sql 의 형식으로 하나 만들어서 데이터를 insert 시켜놓아 테스트를 진행해도 좋을 것 같다라는 생각을 하게 되었습니다.

최근 개발 습관을 들이는 부분중 하나는 spring reference를 찾아보면서 정리해나가려고 하고 있습니다.

reference

https://www.baeldung.com/spring-boot-data-sql-and-schema-sql
https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto.data-initialization.using-basic-sql-scripts

profile
고민의 흔적을 남기자.

0개의 댓글