SprongBoot DbInit 설정방법 (@PostConstruct, CommandLineRunner, schema.sql)

devdo·2023년 10월 3일
0

SpringBoot

목록 보기
33/34
post-thumbnail

처음 SpringBoot 어플리메이션을 실행시, DB 데이터를 미리 insert 하는 작업을 할시,
SpringBoot에서 할 수 있는 대표적인 3가지를 소개합니다.

개인적으로, @PostConstruct를 더 추천합니다!
🌟 2) CommandLineRunner 를 주로 사용


1) @PostConstruct

@Slf4j
@Component
@Profile("test")
@RequiredArgsConstructor
public class TestDataInit {

    private final CouponRepository couponRepository;

    /**
     * 테스트용 데이터 추가
     */
    @PostConstruct
    public void init() {
        log.info("test data init run...");
        LongStream.rangeClosed(1,3).forEach(i -> {
            couponRepository.save(
                    Coupon.builder()
                            .name("coupon" + i)
                            .code("code" + i)
                            .type(CouponType.DISCOUNT)
                            .status(CouponStatus.PUBLIC)
                            .startDate(LocalDate.now())
                            .endDate(LocalDate.now().plusDays(7))
                            .build()
            );
        });
    }

}

2) CommandLineRunner

@Configuration
@Profile({"test", "dev"})    // test 환경에서만 실행
public class TestInitData {

    // CommandLineRunner : 애플리케이션 실행 시점에 특정 코드를 실행하고 싶을 때 사용

    @Bean
    CommandLineRunner init(RoleRepository roleRepository) {
        return (args) -> {
            Optional<Role> role = roleRepository.findByName("ROLE_USER");
            if (!role.isPresent()) {
                roleRepository.save(Role.builder().name("ROLE_USER").build());
            }
        };
    }
}

3) Schema.sql

설정
build.gradle

    // h2
    runtimeOnly 'com.h2database:h2'

application-test.yml

spring:
  sql:
    init:
      schema-locations: classpath:/h2/schema.sql  # 테이블 생성 파일 경로
			data-locations: classpath:/h2/data.sql

schema.sql

DROP TABLE IF EXISTS coupon;

CREATE TABLE coupon
(
    id          bigint auto_increment primary key,
    code        VARCHAR(255) not null,
    end_date    DATE         null,
    name        VARCHAR(255) not null,
    start_date  DATE         null,
    status      VARCHAR(255) not null,
    type        VARCHAR(255) not null,
    created_at  TIMESTAMP    null,
    modified_at TIMESTAMP    null
);

data.sql

DROP TABLE IF EXISTS coupon;

CREATE TABLE coupon
(
    id          bigint auto_increment primary key,
    code        VARCHAR(255) not null,
    end_date    DATE         null,
    name        VARCHAR(255) not null,
    start_date  DATE         null,
    status      VARCHAR(255) not null,
    type        VARCHAR(255) not null,
    created_at  TIMESTAMP    null,
    modified_at TIMESTAMP    null
);
profile
배운 것을 기록합니다.

0개의 댓글