spring / / 2023. 10. 16. 06:27

spring boot에서 초기화 sql

개요

스프링 부트 애플리케이션 시작 시 특정 테이블을 생성하거나 데이터를 초기화 하는 스크립트를 실행하고 싶은 경우가 있다.

spring data jpa를 사용하는 경우는 repository를 생성하여 특정 테이블이 자동생성되게 할 수도 있지만 그렇지 않은 경우는 아래 방법을 사용하면 된다.

  • schema.sql : DCL 스크립트 (테이블 생성)
  • data.sql : DML 스크립트 (데이터 생성, 수정, 삭제)

schema.sql과 data.sql로 구분한 것은 관례적으로 테이블 생성과 데이터 생성으로 분리한 것이지 반드시 그렇게 실행되는 것은 아니다.

data.sql에 DCL 스크립트가 있어도 테이블 생성이 된다.

하지만, 여러가지가 혼재되어 있으면 보기 어려우니 그 목적에 맞게 구분하여 모아두는 것이 좋다.

사용방법

src/main/resource에 schema.sql과 data.sql을 두면 된다. 또는 클래스패스 루트에 만들어 두면 된다.

스프링은 기본적으로 embedded datasource를 사용할 때만 스키마를 자동으로 생성을 한다.

그래서 embedded가 아닌 mysql이나 postgresql인 경우는 아래의 설정이 필요하다. (spring boot 2.5 이상)

spring:
  sql:
    init:
      mode: always
  • always – 항상 초기화
  • embedded – embedded로 사용할 때만 초기화. (기본값)
  • never – 초기화하지 않음

또한 이미 테이블이 존재하는 경우에는 Table "table_name" already exists; SQL statement: 오류가 발생한다.
이런 경우는 continue-on-error: true로 설정하면 된다.

spring:
  sql:
    init:
      continue-on-error: true

ddl-auto와 같이 실행하면?

hibernate의 ddl-auto와 같이 사용하게 되면 어떤 것이 먼저 실행이 될까?

schema.sql이 먼저 실행이 된다. 그런 다음 hibernate의 ddl-auto가 실행이 된다.

만일 ddl-auto가 먼저 실행이 되게 하려면 아래 설정을 추가하면 된다.

spring:
  jpa:
    defer-datasource-initialization: true

@Sql

스프링은 @Sql 어노테이션으로 테이블을 생성 및 입력을 할 수도 있다.

@Sql({"/employees_schema.sql", "/import_employees.sql"})
public class SpringBootInitialLoadIntegrationTest {

    @Autowired
    private EmployeeRepository employeeRepository;

    @Test
    public void testLoadDataForTestClass() {
        assertEquals(3, employeeRepository.findAll().size());
    }
}

참고

https://www.baeldung.com/spring-boot-data-sql-and-schema-sql

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유