728x90
문제 개요
.sql 파일로 was 실행 시 자동으로 데이터가 생성될 수 있게 조치하는 과정에서
데이터가 DB로 insert되지 않는 문제에 대해 기술한다.
원인 분석
- sql 파일을 읽지 못함: yml 파일의 설정 오류
- 테이블 생성 이전 데이터 생성: jpa hibernate이 엔티티 schema를 읽기 전 sql 파일을 먼저 읽음
- sql 파일을 읽어 생성하는 과정에서 외래키 제약 등 발생 시 -> 데이터가 생성되지 않음
해결 과정
.sql 파일 준비
init할 SQL 파일을 테이블 단위로 분할한다.
이 때 생성할 데이터는 외래키 제약, 의존성을 고려해 제약에 위배되지 않는 순서대로 작성한다.
[src/resources/sql/data1.sql / operating_company]
INSERT INTO operating_company (busi_id, bnm, is_primary)
VALUES
("PI", "차지비", "Y"),
("PW", "파워큐브", "Y"),
("EV", "에버온", "Y"),
("SF", "스타코프", "Y"),
("HM", "휴맥스이브이", "Y"),
("HS", "홈앤서비스", "Y"),
("PL", "플러그링크", "Y"),
("KP", "한국전력", "Y"),
("EC", "이지차저", "Y"),
("CV", "대영채비", "Y"),
("ME", "환경부", "Y"),
("ST", "에스트래픽", "Y"),
...
[src/resources/sql/data1.sql / region]
INSERT INTO region (zcode, region_name)
VALUES
('11', '서울특별시'),
('26', '부산광역시'),
('27', '대구광역시'),
('28', '인천광역시'),
('29', '광주광역시'),
('30', '대전광역시'),
('31', '울산광역시'),
# ...
yml 파일에서 리소스를 읽는 기본 classpath는 src/resources이므로 내부 sql 디렉토리를 만들었다.
was 실행 시 생성할 data를 sql 파일로 만들었다.
application.yml 설정
[application.yml]
spring:
sql:
init:
mode: always # spring boot 실행 시 sql 파일을 읽는다.
continue-on-error: true # 에러가 발생해도 실행한다.
# 읽을 sql 파일의 로케이션을 지정한다.
# 복수 파일을 넣을 시 파일명의 알파벳, 숫자 순으로 동작한다.
data-locations: classpath:/sql/data1.sql, classpath:/sql/data2.sql
application.yml 에서 data-locations에 실행할 sql 파일을 복수로 넣는다.
넣은 파일의 알파벳, 숫자 순으로 동작하기 때문에 외래키 제약 조건을 참고해 순서대로 sql 파일을 넣는다.
스프링부트 2.5 이상 버전부터는 자동으로 sre/resources 하위에 data.sql 파일이 있는 경우 자동으로 sql 파일의 질의어를 읽어 실행하지 않는다. (2.4 이하 버전은 실행하였음)
그래서 yml에서 위와 같이 수동으로 설정이 필요하다.
hibernate ddl-auto 와 sql 파일 읽는 순서를 교체
[application.yml]
spring:
jpa:
defer-datasource-initialization: true # jpa hibernate 실행 후 sql 파일이 실행되게 함
jpa hibernate ddl-auto에 의해 스키마와 테이블을 생성하는 경우에는 위에서 세팅한 sql 파일을 스프링부트가 먼저 읽고 실행하기 때문에 테이블 생성 이전 질의어가 실행되어 오류가 발생한다.
따라서, 위와 같이 설정을 해 jpa hibernate에 의해 테이블이 우선적으로 생성된 후 sql 파일을 읽어 데이터가 생성될 수 있도록 조치했다.
결론 / 참고사항
참고 1) 암묵적으로 shcema.sql은 ddl, data.sql은 dml로 작성한다.
참고 2) jpa hibernate ddl과 shema.sql 파일의 혼용은 지양하는 것이 좋음
'DEV > Spring' 카테고리의 다른 글
[트러블슈팅] 의존성 주입 간 순환참조 문제 해결 방법 (0) | 2024.02.20 |
---|---|
[트러블슈팅] Spring ApplicationRunner RuntimeException 발생 시 shutdown되는 오류 해결 (0) | 2024.02.20 |
[트러블슈팅][JPA] OneToOne 양방향 관계 시 의도하지 않은 N+1 문제 발생 원인과 해결 방법 (0) | 2024.02.20 |
[트러블슈팅] @ReqestParam, @PathVariable 사용 시 Name for argument of type [”type”] not specified 에러 해결 (0) | 2024.02.19 |
[Spring Data JPA] mappedBy에 의한 연관관계 주인이 트랜잭션 권한을 가지는 예시 (0) | 2024.01.16 |