테스트용 임베디드 데이터베이스
빠르고 격리된 통합 테스트를 위해 인메모리 또는 임베디드 데이터베이스를 구성하고 활용합니다.
테스트용 임베디드 데이터베이스은(는) CoddyKit의 무료 Testing Mastery: JUnit, Mockito & Integration Tests 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Testing Mastery: JUnit, Mockito & Integration Tests 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Testing Mastery: JUnit, Mockito & Integration Tests 강의에는 총 4개의 강의가 포함되어 있습니다.
이 강의의 일부는 아직 번역되지 않았으며 영어로 표시됩니다.
Embedded DBs for Tests
When writing integration tests for Spring Boot applications, especially those interacting with a database, you need a database instance for your tests to run against.
Embedded databases provide a lightweight, in-memory solution that's perfect for this scenario.
Why Use Embedded DBs?
Embedded databases offer several key benefits for testing:
- Isolation: Each test run gets a clean, fresh database, preventing side effects.
- Speed: Being in-memory, they are incredibly fast, reducing test execution time.
- Simplicity: No need for external database servers or complex setup.
- Repeatability: Tests are consistent because they always start with the same data state.
H2 & HSQLDB Options
Two popular choices for embedded databases in Java applications are H2 Database and HSQLDB.
- H2: A fast, open-source, JDBC-compliant in-memory database. It's widely used with Spring Boot.
- HSQLDB: Another lightweight, relational database written in Java.
We'll focus on H2 as it's a common default in Spring Boot.
Adding H2 Dependency
To use H2 in your Spring Boot project, you typically add it as a test scope dependency in your pom.xml (for Maven) or build.gradle (for Gradle).
This ensures it's only available during testing.
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>Spring Boot Auto-Config
One of Spring Boot's magic tricks is auto-configuration. When it detects H2 on the classpath during tests, it automatically configures an in-memory H2 database for you.
You often don't need to specify a database URL in application.properties for tests, making setup trivial!
User Entity & Repository
Let's consider a simple User entity and a UserRepository. We want to test if our repository correctly saves and retrieves users.
These are standard JPA components.
// User.java
package com.coddykit.demo;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
public User() {}
public User(String name, String email) {
this.name = name;
this.email = email;
}
// Getters and Setters
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
}
// UserRepository.java
package com.coddykit.demo;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
User findByName(String name);
}@DataJpaTest with H2
Spring Boot provides @DataJpaTest specifically for testing JPA components. It auto-configures an in-memory database (like H2 if present) and an EntityManager.
It also rolls back transactions after each test, ensuring a clean state.
UserRepository Test Example
Here's how you might write an integration test for our UserRepository using H2 and @DataJpaTest:
package com.coddykit.demo;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.autoconfigure.orm.jpa.TestEntityManager;
import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest
class UserRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private UserRepository userRepository;
@Test
void whenFindByName_thenReturnUser() {
// given
User alice = new User("Alice", "alice@example.com");
entityManager.persist(alice);
entityManager.flush();
// when
User found = userRepository.findByName(alice.getName());
// then
assertThat(found.getName()).isEqualTo(alice.getName());
assertThat(found.getEmail()).isEqualTo(alice.getEmail());
}
@Test
void whenInvalidName_thenReturnNull() {
// when
User found = userRepository.findByName("InvalidName");
// then
assertThat(found).isNull();
}
}Schema & Data Initialization
For more complex scenarios, you might need to pre-populate your in-memory database with a schema or initial data.
- Place
schema.sqlinsrc/test/resourcesfor DDL (Data Definition Language). - Place
data.sqlinsrc/test/resourcesfor DML (Data Manipulation Language).
Spring Boot will automatically pick these up for your tests.
Quick Check
Which of the following is NOT a primary benefit of using an embedded database like H2 for Spring Boot integration tests?
Recap & Next Steps
We've explored how embedded databases like H2 are invaluable for fast and isolated Spring Boot integration tests.
- They offer speed, isolation, and simplicity.
- Spring Boot auto-configures them with minimal effort.
@DataJpaTestsimplifies testing JPA repositories with these databases.- You can initialize schemas and data using
schema.sqlanddata.sql.
Next, you might explore testing RESTful APIs with MockMvc!
자주 묻는 질문
“테스트용 임베디드 데이터베이스” 강의는 무료인가요?
네 — “테스트용 임베디드 데이터베이스” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Testing Mastery: JUnit, Mockito & Integration Tests 강의 전체를 잠금 해제할 수 있습니다. Testing Mastery: JUnit, Mockito & Integration Tests 강의에는 총 4개의 강의가 포함되어 있습니다.
“테스트용 임베디드 데이터베이스”에서 뭘 배우나요?
빠르고 격리된 통합 테스트를 위해 인메모리 또는 임베디드 데이터베이스를 구성하고 활용합니다. 브라우저에서 직접 실행하는 실습 코드로 Testing Mastery: JUnit, Mockito & Integration Tests을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Testing Mastery: JUnit, Mockito & Integration Tests을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Testing Mastery: JUnit, Mockito & Integration Tests은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.
“테스트용 임베디드 데이터베이스” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Testing Mastery: JUnit, Mockito & Integration Tests 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Testing Mastery: JUnit, Mockito & Integration Tests 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.