[SpringBoot] - 서버 시작 시 데이터를 넣고 싶다면

yeom yaloo·2024년 3월 2일
0

트러블 슈팅

목록 보기
2/5

Spring Boot 애플리케이션에서 서버 시작 시에 데이터를 초기화

두 방법 모두 인터페이스를 구현한 빈을 생성하고 해당 빈이 초기화 로직을 실행하게 됩니다.
또한 해당 인터페이스를 구현한 구현체를 빈으로 등록해준다면 애플리케이션이 구동될 때 자동으로 실행되게 됩니다.

1. CommandLineRunner

1-1. 코드

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class DataInitializer implements CommandLineRunner {

    private final ExtensionService extensionService;

    public DataInitializer(ExtensionService extensionService) {
        this.extensionService = extensionService;
    }

    @Override
    public void run(String... args) throws Exception {
        // 서버 시작 시 초기화 로직을 여기에 작성
        extensionService.saveAllExtensionsFromEnum();
    }
}
  • 해당 방법은 커맨드 라인 인자를 받을 수 있습니다.

2. ApplicationRunner

2-1. 코드

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class DataInitializer implements ApplicationRunner {

    private final ExtensionService extensionService;

    public DataInitializer(ExtensionService extensionService) {
        this.extensionService = extensionService;
    }

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 서버 시작 시 초기화 로직을 여기에 작성
        extensionService.saveAllExtensionsFromEnum();
    }
}
  • 이 방법은 위의 방법보다 더 유연하게 사용이 가능하다고 합니다.

script 코드를 이용한 방법

1. yml 파일 추가

1-1. 코드 추가

spring:
  sql:
    init:
      mode: always

1-2. 스프링부트 버전에 따른 설정 옵션

// spring boot 2.4.x 
spring.datasource.initialization-mode=always
// spring boot 2.5.x 
spring.sql.init.mode=always
// script 파일이 hibernate 초기화 이후 동작하게 하기 위한 옵션
spring.jpa.defer-datasource-initialization=true
  • application.properties나 application.yml 파일에 해당 옵션을 추가해준다.

2. script 코드 추가

1. 경로?

  • resources/data.sql: 데이터 추가에 사용
  • resources/schema.sql: 테이블 생성 등에 사용

직접 본인이 사용한 방법

코드로 보는 예제

package com.extension.common;
import com.extension.domain.entity.Extension;
import com.extension.domain.entity.ExtensionType;
import com.extension.persistence.ExtensionRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;

@Component
@RequiredArgsConstructor
public class DataInitializer implements CommandLineRunner {

    private final ExtensionRepository extensionRepository;

    @Override
    public void run(String... args) {
        initializeExtensions();
    }

    private void initializeExtensions() {
        Arrays.stream(ExtensionType.values())
                .forEach(extensionType -> {
                    Extension extension = Extension.createExtension(extensionType);
                    extensionRepository.save(extension);
                });
    }
}
  • Enum으로 타입을 설정한 엔티티에서 해당 기본 정보를 그냥 서버가 켜지면 넣어두고 사용하고 싶었다.
  • 그래서 해당 작업을 위해서 enum의 개수만큼 돌수 있도록 스트림을 이용해서 새로 entity를 생성해서 save해주고 있다.
  • 이 작업을 sql문으로 바꾼다면 insert into Extension values("bat", false); 이런식으로 7개를 작성해서 진행했을 것

확인

profile
즐겁고 괴로운 개발😎

0개의 댓글