흔히 서버를 실행할 때 DB에 더미 데이터가 있으면 좋겠다는 생각을 하곤 한다.
매번 컨트롤러에서 직접적으로 넣어주는 방식으로 테스트를 진행했었지만, 더 좋은 방법이 있었다.
jpa의 ddl-auto: create 옵션 설정으로 entity 생성하고 추가적인 ddl 스크립트를 만들어서 서버가 시작함과 동시에 데이터를 삽입하는 것!
data.sql을 통해서 dml 작업을 진행해보도록 하겠다!
1. application.yml 수정
먼저 data.sql을 사용하기 위해선 반드시 jpa.ddl-auto 속성값으로 create 또는 create-drop 으로 선언해야 한다!
spring:
jpa:
database: mysql
hibernate:
ddl-auto: create # create or create-drop
properties:
hibernate:
format_sql: true
defer-datasource-initialization: true
또한 spring.jpa.defer-datasource-initialization: true로 해야 한다. 이는 Hibernate를 초기화한 후 data.sql을 실행하기 위한 속성이다.
두 번째, sql 파일을 실행하겠다는 선언이 필요하다.
spring:
sql:
init:
mode: always # 서버 시작시 항상 classpath의 sql문을 실행하도록 설정
스프링의 경우 내장 데이터베이스(H2, HSQL, Derdy)에 대해서 스크립트 기반의 초기화를 기본적으로 실행하지만, 내장 데이터베이스가 아닌 경우 해당 옵션(always)을 활성화해야 한다.
때문에 사용하는 데이터베이스가 내장 데이터베이스가 아니라 외부 데이터베이스와 연결되어 있다면 다음 옵션을 활성화해야 script 파일이 적용된다.
위 작업들이 끝나면 data.sql을 사용할 준비가 된 것!
2. data.sql 작성
해당 sql 파일은 resource 안에 작성해주어야 한다!
- Cafe entity
import jakarta.persistence.*;
import lombok.*;
@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Table(name = "cafe")
public class Cafe {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "cafe_id")
private Long id;
@Column(name = "name")
private String name;
@Column(columnDefinition = "TEXT")
private String latitude;
@Column(columnDefinition = "TEXT")
private String longitude;
}
- data.sql (예시)
-- Cafe 데이터
INSERT INTO cafe (cafe_id, name, latitude, longitude) VALUES (1, '언더그라운드커피웍스', '37.6100862904966', '126.995125457406');
INSERT INTO cafe (cafe_id, name, latitude, longitude) VALUES (2, '카페그리다', '37.60932585128242', '127.00497528986767');
INSERT INTO cafe (cafe_id, name, latitude, longitude) VALUES (3, '플레이스엔', '37.61049717085312', '126.99589444374668');
INSERT INTO cafe (cafe_id, name, latitude, longitude) VALUES (4, '카페테인', '37.6081906479131', '127.003809838548');
실제로 SQL 문으로 작성해야하기 때문에, JPQL로 헷갈려 하면 안된다
'Back-end > Spring' 카테고리의 다른 글
[Spring] WebClient를 사용한 외부 API 통신 (0) | 2024.06.16 |
---|---|
[Spring] Swagger 사용 및 JWT과 https 적용해보기 (2) | 2024.06.05 |
[Spring] JPA "Row size too large" 문제 분석하기 (0) | 2024.05.26 |
[Spring] CORS-safelisted response header 문제 해결하기 (0) | 2024.05.26 |
[Spring] JPA 동적 네이티브 쿼리, 제대로 알고 사용하자 (0) | 2024.05.22 |