티스토리 뷰
임베디드 모드 DB이란?
임베디드 모드 DB란 애플리케이션을 실행할 때 DB를 JVM 메모리에 포함해서 함께 실행할 수 있다. 단 애플리케이션이 종료되면 임베디드 모드로 동작하는 데이터베이스도 함께 종료된다.
장점
- 테스트 케이스를 실행할 때 별도의 임베디드(JVM 내장)이므로 데이터베이스를 설치할 필요가 없다.
- 애플리케이션이 종료되면 DB도 종료되므로 테스트 데이터를 운영 및 관리할 필요가 없다.
- 스프링 부트 환경에서 추가로 작성할게 없다. (밑에 예제를 통해 확인)
- 테스트를 반복 실행할 수 있다. (밑에 예제를 통해 확인)
예제
프로젝트 정보(스프링 부트 환경)

도메인 정보
@Data
public class Item {
private final String itemName;
public Item(String itemName) {
this.itemName = itemName;
}
}
레포지토리 정보
@Repository
public class JdbcTemplateRepository {
private final JdbcTemplate template;
public JdbcTemplateRepository(DataSource dataSource) {
this.template = new JdbcTemplate(dataSource);
}
public Item save(Item item) {
String sql = "insert into item(item_name) values (?)";
template.update(connection -> {
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1, item.getItemName());
return ps;
});
return item;
}
public List<Item> findAll() {
String sql = "select * from item";
return template.query(sql, itemRowMapper());
}
private RowMapper<Item> itemRowMapper() {
return (rs, rowNum) -> {
Item item = new Item(rs.getString("item_name"));
return item;
};
}
}
save() 메서드는 item 테이블에 간단히 이름을 insert 하는 예제이고 findAll() 메서드는 테이블에 저장되어 있는 item을 전부 조회한다.
테스트 케이스
@Slf4j
@SpringBootTest
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class EmbeddedApplicationTests {
@Autowired
JdbcTemplateRepository repository;
@Test
@Order(1)
void save() {
Item item1 = new Item("test1");
Item savedItem1 = repository.save(item1);
Assertions.assertThat(item1).isEqualTo(savedItem1);
}
@Test
@Order(2)
void findAll() {
List<Item> itemAll = repository.findAll();
for (Item item : itemAll) {
log.info("item {}", item);
}
Assertions.assertThat(itemAll).isNotEmpty();
}
}
데이터를 먼저 저장하고 그 다음 테이블을 조회하기 위해 @Order로 메서드 순서를 정하였다.
스키마 정보

.
schema.sql
drop table if exists item CASCADE;
create table item
(
item_name varchar(10)
);
(※ schema.sql은 필수이므로 해당 경로에 DB 스키마 정보를 작성해야 한다. 단 해당 테스트는 JdbcTemplate로 실행 했기 때문에 만약 JPA로 테스트할 경우 생략이 가능하다.)

스프링 부트 환경에서는 이것이 끝이다. 테스트를 실행하면 위에 캡쳐와 같이 스프링 부트가 HikariPool 커넥션 풀을 생성해줄뿐만 아니라 만약 test/resources 내에 application.properties 파일에서 테스트용 데이터베이스의 대한 url과 username 등등이 없으면 알아서 JVM 내에 임베디드 DB를 포함해 준다.
정리
임베디드 DB는 위에서 봤듯이 스프링 부트 환경에서 추가로 작성할 게 없고 (schema.sql를 제외) 테스트를 반복 실행해도 애플리케이션이 종료되면 DB가 사라지기 때문에 반복 실행해도 데이터가 중복되지 않는다. 임베디드 DB는 복잡한 테이블 구조보다는 단순한 테이블 구조에서 테스트하기에 좋을 것 같다.
본 포스팅은 “스프링 DB 2편 - 데이터 접근 활용 기술/인프런”를 학습한 내용을 정리한 것
