두 방법 모두 인터페이스를 구현한 빈을 생성하고 해당 빈이 초기화 로직을 실행하게 됩니다.
또한 해당 인터페이스를 구현한 구현체를 빈으로 등록해준다면 애플리케이션이 구동될 때 자동으로 실행되게 됩니다.
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();
}
}
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();
}
}
spring:
sql:
init:
mode: always
// 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
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);
});
}
}