프로젝트를 하던 중 스프링이 시작할 때부터 데이터베이스에 값이 필요한데 어떻게 해야 할까 고민이 되었다. 심지어 이 테이블은 추가, 수정이 일어나지 않기 때문에 굳이 DAO, Service, Controller 등이 필요하지도 않았다. 그래서 검색해 본 결과 data.sql을 사용하여 스프링이 실행될 때 값을 넣어 주면 된다고 했다.
그래서 아래와 같이 작성 했었는데 어떤 블로그에서 schema와 data 를 나누는 게 좋을 것 같다는 글을 보았다.
DROP TABLE IF EXISTS ott;
CREATE TABLE ott
(
type VARCHAR(255) NOT NULL,
price INT NOT NULL,
maxppl INT NOT NULL,
PRIMARY KEY (type)
);
INSERT INTO ott (type,price,maxppl)
values('Netflix', 17000,4);
INSERT INTO ott (type,price,maxppl)
values('Tving', 13900,4);
INSERT INTO ott (type,price,maxppl)
values('Wave', 13900,4);
INSERT INTO ott (type,price,maxppl)
values('Disney+', 9900,4);
INSERT INTO ott (type,price,maxppl)
values('Watcha', 12900,4);
INSERT INTO ott (type,price,maxppl)
values('Apple', 20900,5);
근데 그러면 둘이 각각 뭘까?
[schema.sql]
chema.sql 파일은 데이터베이스 스키마를 정의하는 파일로 스키마는 데이터베이스 구조와 구성요소를 나타내며, 테이블, 뷰, 인덱스 등의 객체를 정의한다.
[data.sql]
data.sql 파일은 데이터베이스에 삽입할 초기 데이터를 정의하는 파일로 INSERT 문을 사용하여 데이터를 삽입하며, 데이터베이스를 초기화하고 초기 상태를 설정한다.
언제 어떻게 실행 되는걸까?
schema.sql과 data.sql는 데이터베이스의 초기화를 담당하는 인터페이스인 DataSourceInitializer라는 빈을 사용하여 실행이 된다. src/main/resources 디렉토리에 schema.sql과 data.sql을 작성해 두어야 하고, 애플리케이션 시작 시점에 두 파일이 실행되며 schema.sql 파일이 먼저, 그다음에 data.sql 파일이 차례로 실행된다.
이것만 하면 끝난 걸까?
아니다.. application.properties에 작성해주어야 할 것이 있다. 바로 애플리케이션의 데이터베이스 초기화와 초기 데이터 로딩에 관련된 여러 옵션들이다. 아래와 같이 사용하면 된다.
# sql
#데이터베이스 초기화 모드 설정
spring.sql.init.mode=always
#데이터소스 초기화를 지연시킬지 여부를 설정
spring.jpa.defer-datasource-initialization=true
#data.sql 파일의 내용을 실행할 때, 오류가 발생해도 계속해서 실행할지 여부
spring.sql.init.continue-on-error=true
# data.sql 파일을 사용하여 초기 데이터 로딩 (기본값: data.sql)
spring.sql.init.data-locations=classpath:data.sql
이렇게 하면 스프링이 실행되고 따로 값을 넣어주지 않아도 데이터가 잘 입력된 것을 확인할 수 있다.
'spring 스프링' 카테고리의 다른 글
제어의 역전 (IOC, Inversion Of Control) (0) | 2023.08.20 |
---|---|
[Spring Boot] 일정 주기로 실행하는 @Scheduled 사용해보기 (0) | 2023.08.15 |
application.properties 의 값을 불러와 사용하기 (0) | 2023.08.07 |
[JAVA] Gson 라이브러리 JsonParser() is deprecated (0) | 2023.08.01 |
[Spring boot] Rest Api + Vue.js를 이용한 SMTP 초 간단 이메일 인증 구현 (0) | 2023.06.23 |