티스토리 뷰

임베디드 모드 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편 - 데이터 접근 활용 기술/인프런”를 학습한 내용을 정리한 것

댓글
최근에 올라온 글
«   2026/03   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함
Total
Today
Yesterday