Projects/[Spring] Coffee Shop Project

[트러블슈팅] : data.sql 실행 시 Table doesn't exist 오류 해결하기

montmer27 2026. 4. 3. 20:59

상황

개발 중 메뉴 데이터를 매번 직접 넣기 번거로워 src/main/resources/data.sql 파일을 생성하고 아래와 같이 초기 데이터를 작성했다.

INSERT INTO menus (name, price, deleted, created_at, updated_at)
VALUES
    ('아메리카노', 4500, false, NOW(), NOW()),
    ('카페라떼', 5000, false, NOW(), NOW()),
    ('카푸치노', 5500, false, NOW(), NOW()),
    ('에스프레소', 4000, false, NOW(), NOW()),
    ('카라멜마키아또', 6000, false, NOW(), NOW());

application.yml에 아래 설정도 추가했다.

spring:
  sql:
    init:
      mode: always

그런데 앱 기동 시 아래 오류가 발생했다.

Caused by: java.sql.SQLSyntaxErrorException: Table 'gigacoffee.menus' doesn't exist

원인 분석

Spring Boot가 data.sql을 실행하는 시점이 JPA가 테이블을 생성하는 시점보다 빠르기 때문이다. 테이블이 아직 존재하지 않는 상태에서 INSERT를 시도해 오류가 발생한 것이다.

실행 순서가 문제였다.

기존 순서 : data.sql 실행 → JPA 테이블 생성 필요한 순서 : JPA 테이블 생성 → data.sql 실행

해결 방법

application.yml에 아래 설정을 추가한다.

spring:
  jpa:
    defer-datasource-initialization: true

defer-datasource-initialization 옵션은 JPA가 테이블 생성을 완료한 뒤에 data.sql을 실행하도록 순서를 보장한다.

결과

설정 추가 후 재기동 시 JPA가 테이블을 먼저 생성하고, 이후 data.sql이 정상적으로 실행돼 메뉴 데이터 5개가 DB에 저장됐다.

인사이트

Spring Boot에서 data.sql과 JPA를 함께 사용할 때는 실행 순서를 반드시 고려해야 한다. ddl-auto로 테이블을 자동 생성하는 환경에서는 defer-datasource-initialization: true를 기본으로 설정해두는 것이 좋다.