이 포스트는 SprinBboot Application이 구동될 때 sql 파일을 직접 읽어서 실행하는 샘플을 보여드립니다.

Springboot 는 모든 빈이 초기화되고 애플리케이션이 실행되기 전에 ApplicationRunner interface를 찾아서 실행시켜줍니다. 이 타이밍에 sql을 실행하는 구문을 넣어서 돌려봅니다.

아래 샘플은 샘플일 뿐 프로덕트에 그대로 사용하지는 마시기 바랍니다.

@Component
@Slf4j
public class Runner implements ApplicationRunner {
    final
    JdbcTemplate jdbcTemplate;
    final
    EntityManagerFactory entityManagerFactory;

    public Runner(JdbcTemplate jdbcTemplate, EntityManagerFactory entityManagerFactory) {
        this.jdbcTemplate = jdbcTemplate;
        this.entityManagerFactory = entityManagerFactory;
    }

    @Override
    public void run(ApplicationArguments args) throws FileNotFoundException {
        log.debug("Runner start!");
        URL resource = getClass().getClassLoader().getResource("data-mysql.sql");
        if (resource == null)
            return;
        StringBuilder stringBuilder = new StringBuilder();
        try (Stream<String> lines = Files.lines(Paths.get(resource.toURI()), StandardCharsets.UTF_8)) {
            lines.forEach(stringBuilder::append);
        } catch (IOException | URISyntaxException e) {
            e.printStackTrace();
        }

        String[] split = stringBuilder.toString().split(";");

        JpaTransactionManager transactionManager = new JpaTransactionManager(entityManagerFactory);
        TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
        transactionTemplate.execute(transactionStatus -> {
            for (String s : split) {
                if (s.startsWith("#"))
                    continue;
                jdbcTemplate.execute(s);
            }
            return null;

        });
    }
}