Spring

애플리케이션 시작 시 데이터를 데이터베이스에 삽입방법 3가지

MDanderson 2023. 6. 13. 05:32

1. SQL 파일 사용: Spring Boot는 schema.sql 파일과 data.sql 파일을 자동으로 실행합니다. 각각 스키마 생성과 데이터 삽입을 위한 SQL 명령어들을 포함할 수 있습니다. 이 파일들은 src/main/resources 디렉터리에 위치해야합니다. data.sql 파일에 INSERT INTO 구문을 작성하여 애플리케이션 시작 시 데이터를 삽입할 수 있습니다.

 

예를 들어, data.sql 파일에서 INSERT INTO 명령을 사용할 때, 중복되는 데이터가 이미 데이터베이스에 있는 경우 SQL 오류가 발생합니다. 이는 대부분의 데이터베이스에서 기본적인 동작 방식입니다.


하지만, 중복된 데이터를 처리하는 방법은 데이터베이스와 SQL 스크립트 작성에 따라 다릅니다.
INSERT IGNORE: 이 구문을 사용하면, 이미 존재하는 데이터를 삽입하려고 시도할 때 오류가 발생하지 않고 무시됩니다.
REPLACE INTO or INSERT ON DUPLICATE KEY UPDATE: 이 구문은 중복된 키가 있을 경우 해당 행을 대체하거나 업데이트합니다.

이들 구문의 사용 가능 여부는 사용하는 데이터베이스에 따라 달라집니다.

REPLACE INTO, INSERT IGNORE, 그리고 INSERT ... ON DUPLICATE KEY UPDATE는 MySQL에서 사용할 수 있는 SQL 구문입니다.

REPLACE INTO: 이 구문은 행이 이미 존재할 경우 해당 행을 삭제한 후 새로운 행을 삽입합니다. 이는 INSERT 구문과 유사하지만, 주어진 값이 기존의 유니크 키와 충돌할 경우 해당 행을 대체(replace)합니다.

INSERT IGNORE: 이 구문은 행을 삽입하려 할 때 유니크 키 제약조건에 위배되는 경우 무시하고 계속 진행합니다. 유니크 키 제약 조건이 위반될 경우 삽입이 무시되고 에러가 발생하지 않습니다.

INSERT ... ON DUPLICATE KEY UPDATE: 이 구문은 새로운 행을 삽입하려고 할 때 유니크 키가 이미 존재하면 해당 행을 업데이트합니다. 이는 REPLACE INTO와 유사하지만, 기존 행을 삭제하지 않고 대신 업데이트하므로 불필요한 삭제 작업을 피할 수 있습니다.

이 세가지 명령문은 모두 MySQL에서 사용할 수 있으며 다른 SQL 데이터베이스에서는 지원하지 않을 수 있습니다. 예를 들어, PostgreSQL은 이러한 구문을 지원하지 않습니다. 대신 PostgreSQL에서는 INSERT ... ON CONFLICT DO UPDATE 또는 INSERT ... ON CONFLICT DO NOTHING을 사용할 수 있습니다

 


또한, data.sql이 매번 애플리케이션 시작 시 실행되므로, 이미 존재하는 데이터에 대해 적절한 처리 방식을 선택해야 합니다. 이는 전체 애플리케이션의 동작 방식, 데이터 요구사항 등에 따라 결정해야할 사항입니다.

마지막으로, Spring Boot의 spring.jpa.hibernate.ddl-auto 속성을 적절히 설정하여 데이터베이스 스키마가 어떻게 생성되고 관리되는지 제어할 수 있습니다. 이 속성을 'create' 또는 'create-drop'으로 설정하면, 애플리케이션 시작 시 마다 데이터베이스 스키마가 새로 생성되므로 data.sql에서 중복 데이터 오류를 방지할 수 있습니다.

 


2.

CommandLineRunner 또는 ApplicationRunner 인터페이스 구현: 이 인터페이스들을 구현하는 빈은 Spring Boot가 시작될 때 실행됩니다. 이를 통해 애플리케이션 시작 시 데이터를 프로그래밍 방식으로 삽입할 수 있습니다.

 

3. @PostConstruct 메서드 사용: @PostConstruct 애노테이션이 붙은 메서드는 해당 빈이 생성된 후 자동으로 호출됩니다. 이를 사용해 데이터를 삽입하는 로직을 구현할 수 있습니다.

'Spring' 카테고리의 다른 글

@ManyToMany  (0) 2023.06.13
@Builder  (0) 2023.06.13
JPQL vs Native SQL  (0) 2023.06.13
JPA @EntityGraph(attributePaths = "authorities")  (0) 2023.06.13
Spring Security 관련 CORS에러  (0) 2023.06.12