flyway를 잘 사용하면 이렇게 Axel 과 Christian 라는 개발자 각자 필요한 DDL 을 만들고 배포할수 잇다. 공식사이트 소개를 예로 들자면 gradle, maven, CLI, java api 를 통하여 flyway 를 실행할수 있다고 하는데 이글에서 springboot 으로 실행하는 방법을 알아보자.
pom.xml dependency 추가
src/main/resources 폴더에 db 폴더 ,그리고 그안에 migration 폴더를 만든다.
migration 폴더에 V1__Base_version.sql 파일을 생성
주의 : .sql 경로를 혹시 자기가 원하는 폴더에 위치하고 싶으면 spring.flyway.locations 설정을 하면 된다.
User 객체 생성
Interface 작성
테스트 코드 작성
테스트 코드 실행 결과
디비테이블 확인 2개 추가 된걸 확인 할수 있다.
user 현재 테이블
flyway_schema_history : flyway가 관리하고 있는 테이블. 해당 테이블에 수행된 .sql 스크립트 내역들을 기재하고 있다.
DROP TABLE IF EXISTS user ;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'pk',
`name` varchar(20) NOT NULL COMMENT '이름',
`age` int(5) DEFAULT NULL COMMENT '나이',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
@Data
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
}
public interface UserService {
int create(String name, Integer age);
List<User> getByName(String name);
int deleteByName(String name);
int getAllUsers();
int deleteAllUsers();
}
@Service
public class UserServiceImpl implements UserService {
private JdbcTemplate jdbcTemplate;
UserServiceImpl(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
@Override
public int create(String name, Integer age) {
return jdbcTemplate.update("insert into USER(NAME, AGE) values(?, ?)", name, age);
}
@Override
public List<User> getByName(String name) {
List<User> users = jdbcTemplate.query("select * from USER where NAME = ?", (resultSet, i) -> {
User user = new User();
user.setId(resultSet.getLong("ID"));
user.setName(resultSet.getString("NAME"));
user.setAge(resultSet.getInt("AGE"));
return user;
}, name);
return users;
}
@Override
public int deleteByName(String name) {
return jdbcTemplate.update("delete from USER where NAME = ?", name);
}
@Override
public int getAllUsers() {
return jdbcTemplate.queryForObject("select count(1) from USER", Integer.class);
}
@Override
public int deleteAllUsers() {
return jdbcTemplate.update("delete from USER");
}
}
@Slf4j
@SpringBootTest
public class FlywayDemoApplicationTests {
@Autowired
private UserService userSerivce;
@Test
public void test() throws Exception {
userSerivce.deleteAllUsers();
userSerivce.create("Tom", 10);
userSerivce.create("Mike", 11);
userSerivce.create("Didispace", 30);
userSerivce.create("Oscar", 21);
userSerivce.create("Linda", 17);
// Oscar 라는 이름을 가진 사용자 조회 , 나이 가 정확한지 확인.
List<User> userList = userSerivce.getByName("Oscar");
Assertions.assertEquals(21, userList.get(0).getAge().intValue());
// 5명 있음.
Assertions.assertEquals(5, userSerivce.getAllUsers());
// 2명 삭제.
userSerivce.deleteByName("Tom");
userSerivce.deleteByName("Mike");
// 아직 5명 있을걸?
Assertions.assertEquals(3, userSerivce.getAllUsers());
}
}
ALTER TABLE `user` ADD COLUMN `address` VARCHAR(20) DEFAULT NULL;
2022-12-26 16:58:12.025 INFO 37330 --- [ main] o.f.c.i.database.base.DatabaseType : Database: jdbc:mysql://localhost:3306/test (MySQL 8.0)
2022-12-26 16:58:12.063 INFO 37330 --- [ main] o.f.core.internal.command.DbValidate : Successfully validated 2 migrations (execution time 00:00.020s)
2022-12-26 16:58:12.075 INFO 37330 --- [ main] o.f.core.internal.command.DbMigrate : Current version of schema `test`: 1
2022-12-26 16:58:12.082 INFO 37330 --- [ main] o.f.core.internal.command.DbMigrate : Migrating schema `test` to version "1.1 - alter table user"
2022-12-26 16:58:12.113 INFO 37330 --- [ main] o.f.core.internal.command.DbMigrate : Successfully applied 1 migration to schema `test` (execution time 00:00.045s)