반응형
💋 인트로
data.sql 파일은 데이터베이스에 삽입할 초기 데이터를 정의하는 파일이다.
이 파일은 INSERT 문을 사용하여 데이터를 삽입하며, 데이터베이스를 초기화하고 초기 상태를 설정하는 데 사용된다.
이것만 알고, 아래와 같이 data.sql 파일을 작성했다.
DROP TABLE IF EXISTS product;
CREATE TABLE PRODUCT
(
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
img_url VARCHAR(255),
price INT NOT NULL,
PRIMARY KEY (id)
);
INSERT INTO PRODUCT (name, img_url, price)
values ('피자',
'https://cdn.dominos.co.kr/admin/upload/goods/20200311_x8StB1t3.jpg',
13000);
INSERT INTO PRODUCT (name, img_url, price)
values ('샐러드',
'https://m.subway.co.kr/upload/menu/K-%EB%B0%94%EB%B9%84%ED%81%90-%EC%83%90%EB%9F%AC%EB%93%9C-%EB%8B%A8%ED%92%88_20220413025007802.png',
20000);
INSERT INTO PRODUCT (name, img_url, price)
values ('치킨',
'https://cdn.thescoop.co.kr/news/photo/202010/41306_58347_1055.jpg',
10000);
그랬다가, 누누한테 아래와 같은 피드백을 받았다.
schema.sql이랑 data.sql은 어떤 차이가 있고, 이건 어떻게 실행이 되는거지...?
✔ schema.sql vs data.sql
챗 지피티와의 대화 내용을 첨부하겠다!
1. schema.sql 파일은 데이터베이스 스키마를 정의하는 파일입니다.
스키마는 데이터베이스 구조와 구성요소를 나타내며, 테이블, 뷰, 인덱스 등의 객체를 정의합니다.
2. data.sql 파일은 데이터베이스에 삽입할 초기 데이터를 정의하는 파일입니다.
이 파일은 INSERT 문을 사용하여 데이터를 삽입하며, 데이터베이스를 초기화하고 초기 상태를 설정하는 데 사용됩니다.
3. 따라서 schema.sql 파일은 데이터베이스 스키마를 정의하고, data.sql 파일은 초기 데이터를 정의합니다. 두 파일은 데이터베이스 생성과 초기화에 모두 사용됩니다.
자 그러면 둘이는 언제 실행되는거지?
✔ schema.sql, data.sql 파일의 실행 시점과 실행 방법
스프링에서는 애플리케이션 시작 시점에 schema.sql과 data.sql 파일이 실행됩니다.
보통 스프링 부트에서는 src/main/resources 디렉토리에 위치한 schema.sql과 data.sql 파일이 자동으로 실행됩니다.
따라서, 스프링 애플리케이션을 구동할 때, 이 파일들이 실행되어 데이터베이스 스키마와 초기 데이터가 설정됩니다. 이후에는 데이터베이스와 스키마가 생성되어 있으므로, 이 파일들은 더 이상 실행되지 않습니다.
어떻게 실행되는거지...?
스프링에서는 DataSourceInitializer라는 빈을 사용하여 schema.sql과 data.sql 파일을 실행합니다.
DataSourceInitializer는 데이터베이스의 초기화를 담당하는 인터페이스이며, 스프링에서는 DataSourceInitializer를 빈으로 등록해주면 자동으로 실행됩니다. DataSourceInitializer는 data-source와 schema.sql 파일의 위치를 설정하는 속성을 가지고 있습니다. 이 설정에 따라 DataSourceInitializer가 스키마를 생성하고, 초기 데이터를 삽입합니다.
마지막으로, 둘의 실행 순서가 중요할 것 같은데, 실행 순서는 어떻게 될까?
✔ schema.sql, data.sql 파일의 실행 순서
스프링에서는 schema.sql 파일이 먼저 실행되고, 그 다음에 data.sql 파일이 실행됩니다.
이유는 schema.sql 파일이 데이터베이스 스키마를 정의하는 파일이기 때문입니다.
스키마를 먼저 생성한 후, 데이터를 삽입하는 것이 좋은 방법입니다.
만약 schema.sql 파일이 먼저 실행되지 않고 data.sql 파일이 먼저 실행된다면, 데이터베이스 스키마가 없는 상태에서 데이터를 삽입하려고 하기 때문에 오류가 발생합니다.
💋 리팩터링
schema.sql 파일은 아래와 같이,
DROP TABLE IF EXISTS product;
CREATE TABLE PRODUCT
(
id BIGINT NOT NULL AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
img_url VARCHAR(255),
price INT NOT NULL,
PRIMARY KEY (id)
);
data.sql 파일은 아래와 같이 수정하면 된다!
INSERT INTO PRODUCT (name, img_url, price)
values ('피자',
'https://cdn.dominos.co.kr/admin/upload/goods/20200311_x8StB1t3.jpg',
13000);
INSERT INTO PRODUCT (name, img_url, price)
values ('샐러드',
'https://m.subway.co.kr/upload/menu/K-%EB%B0%94%EB%B9%84%ED%81%90-%EC%83%90%EB%9F%AC%EB%93%9C-%EB%8B%A8%ED%92%88_20220413025007802.png',
20000);
INSERT INTO PRODUCT (name, img_url, price)
values ('치킨',
'https://cdn.thescoop.co.kr/news/photo/202010/41306_58347_1055.jpg',
10000);
근데 이런 더미 데이터를 저장할 때는 다른 방법도 많다!
더미 데이터를 저장하는 3가지 다른 방법에 대해서는 이 포스팅에서 확인할 수 있다.
반응형