Miracle Morning, LHWN

14-2. Flyway 사용해보기 - Flyway API (Java) 본문

IT 기술/[JAVA] Spring Boot

14-2. Flyway 사용해보기 - Flyway API (Java)

Lee Hye Won 2021. 5. 25. 08:38

# 이번에는 API 형태로 Flyway 를 사용해보고, 데이터의 신뢰성을 위해 실행될 때마다 (1) 초기화 Clean - (2) Migrate 의 순서로 수행할 것이다. 

이때 Clean 하는 작업을 따로 Class 로 분리하여 Configuration annotation 을 지정한다.

 

# 먼저 API 형태로 Flyway 를 사용하기 위해 데이터베이스 정보를 설정한다.

// FlywayConfig.java

package com.springJPAPractice.springJPAPractice.Configs;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

import org.flywaydb.core.Flyway;

@Configuration
public class FlywayConfig {
    @Value("${spring.datasource.url}")
    private String URL;

    @Value("${spring.datasource.username}")
    private String USERNAME;

    @Value("${spring.datasource.password}")
    private String PASSWORD;

    @Bean
    @Profile("test")
    public Flyway flyway() {
        Flyway flyway = Flyway
                .configure()
                .dataSource(URL, USERNAME, PASSWORD)
                .load();

        return flyway;
    }
}

 

# 데이터의 신뢰성을 위해 (= 상태에 따라 실행 결과가 달라지는 것을 방지) Clean 후 Migrate 하는 설정을 작성한다.

// ResetDatabase.java

package com.springJPAPractice.springJPAPractice.Models;

import org.flywaydb.core.Flyway;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.TestInstance;
import org.springframework.beans.factory.annotation.Autowired;

@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class ResetDatabase {
    @Autowired
    private Flyway flyway;

    @BeforeEach
    public void setUp() {
        // 1. DB Clean
        flyway.clean();

        // 2. DB Migrate
        flyway.migrate();
    }
}

 

# 위에서 작성한 내용을 토대로 실제로 데이터베이스에 데이터를 주입하고, 제대로 불러와지는지 테스트한다.

여기서는 일단 아래 세 가지 조건을 만족해야 한다.

 

   1. TEST DB 를 바라봐야 한다. > build.gralde 에서 설정 완료
   2. 테스트를 수행할 때마다 DB가 초기화되어야 한다. (데이터의 상태에 따라 결과가 달라지는 것을 방지)

            > extends ResetDatabase 를 통해 BeforeEach annotation 이 동작하면서 Clean 후 Migrate 를 한다.
   3. Book 개체가 DB 에 생성되는지 테스트한다. > 이 테스트 내용은 또 (1) Given (2) When (3) Then 의 순서로 진행한다.

 

package com.springJPAPractice.springJPAPractice.Models;

import com.springJPAPractice.springJPAPractice.DAO.BookDAO;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;

import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;

// 모든 클래스패스에 대해 테스트를 수행하는게 아니라 데이터에 관련된 내용만 스캔하여 수행
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class BookTest extends ResetDatabase {
    @Autowired
    private BookDAO bookDAO;

    @Test
    public void createSuccess() 
        // 테스트 수행 단계
        // Given (사전 준비) : Book 생성을 위한 사전 준비
        Book book = new Book();
        book.setId((long) 1);
        book.setName("Flyway 정복");
        book.setAuthor("LHWN");

        // When (테스트 수행 시점) : Book 생성
        bookDAO.save(book);

        // Then (이후 테스트 검증 결과) : 제대로 생성되었는지 검증
        Optional<Book> bookFromDB = bookDAO.findById((long) 1);

        assertThat(bookFromDB.get().getId()).isEqualTo(book.getId());
        assertThat(bookFromDB.get().getName()).isEqualTo(book.getName());
        assertThat(bookFromDB.get().getAuthor()).isEqualTo(book.getAuthor());
    }
}

출처 : https://fastcampus.co.kr/courses/204729/clips/

 

패스트캠퍼스 온라인 강의 - 스프링 아카데미아 15개 영상강의 코스(5월)

 

fastcampus.co.kr

 

Comments