705 words
4 minutes
[Spring Boot] 개발/테스트 환경에서 인메모리 DB 설정하는 방법

개요#

Spring Boot 애플리케이션을 개발할 때, 로컬 및 테스트 환경에서 인메모리 데이터베이스 (H2 Database, Embedded Redis) 를 사용하면 별도 컨테이너나 외부 프로세스를 띄우지 않고 쉽고 빠르게 테스트 환경을 구성할 수 있다.

이 글에서는 Spring Boot의 로컬 개발, 테스트 환경에서 H2 Database 와 Embedded Redis 를 설정하는 방법을 다룬다.

H2 Database 설정하기#

먼저 build.gradle 에 H2 데이터베이스 의존성을 추가한다.

dependencies {
runtimeOnly 'com.h2database:h2'
}

그리고 application-local.yml (또는 application-test.yml) 파일에 다음과 같이 설정한다.

spring:
datasource:
url: jdbc:h2:mem:test
username: sa
password:
h2:
console:
enabled: true
path: /h2-console
  • h2-console 설정을 활성화하면 로컬 서버 실행 시 http://localhost:8080/h2-console 경로에서 웹 기반 콘솔을 사용할 수 있다.
  • H2는 인메모리 기반이므로 애플리케이션이 꺼지면 데이터도 함께 사라집니다.

Embedded Redis 설정하기#

다음의 라이브러리를 사용한다.

codemonstur
/
embedded-redis
Waiting for api.github.com...
00K
0K
0K
Waiting...

build.gradle 에 라이브러리를 추가한다.

implementation 'com.github.codemonstur:embedded-redis:1.4.3'

EmbeddedRedisConfiguration.java 을 작성한다.

@Configuration
@Profile({"local", "test"}) // 로컬 및 테스트 환경에서만 활성화
public class EmbeddedRedisConfiguration {
@Value("${spring.data.redis.port}")
private int redisPort;
private RedisServer redisServer;
@PostConstruct
public void startRedis() throws IOException {
try {
redisServer = new RedisServer(redisPort);
redisServer.start();
} catch (Exception e) {
if (isRedisRunning()) {
return; // 이미 실행 중인 경우 무시
}
throw e;
}
}
@PreDestroy
public void stopRedis() throws IOException {
if (redisServer != null && redisServer.isActive()) {
redisServer.stop();
}
}
private boolean isRedisRunning() {
try (Socket socket = new Socket()) {
socket.connect(new InetSocketAddress("localhost", redisPort), 100);
return true;
} catch (IOException e) {
return false;
}
}
}

이 설정은 다음과 같은 조건에서 작동한다:

  • 현재 지정된 포트에 Redis가 이미 실행 중이면, Embedded Redis를 실행하지 않는다.
  • 로컬 및 테스트 프로파일에 한해 활성화되므로 운영 환경에는 영향이 없다.

테스트 코드#

인메모리 환경에서 H2 DB와 Redis 설정이 잘 적용되었는지 다음과 같은 테스트 코드로 확인할 수 있다.

H2 Database 테스트#

@SpringBootTest
@ActiveProfiles("test") // H2 설정이 활성화되어 있는 프로파일
class H2Test {
@Autowired
private DataSource dataSource;
@Test
@DisplayName("H2 데이터베이스에 직접 쿼리를 날려 테이블을 생성하고 데이터를 저장할 수 있다")
void shouldInsertAndSelectUsingRawJdbc() throws Exception {
try (Connection conn = dataSource.getConnection()) {
// 테이블 생성
conn.createStatement().executeUpdate("CREATE TABLE test_user (id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(255))");
// 데이터 삽입
conn.createStatement().executeUpdate("INSERT INTO test_user (username) VALUES ('h2test')");
// 데이터 조회
ResultSet rs = conn.createStatement().executeQuery("SELECT username FROM test_user WHERE id = 1");
assertThat(rs.next()).isTrue();
assertThat(rs.getString("username")).isEqualTo("h2test");
}
}
}

Embedded Redis 테스트#

@SpringBootTest
@ActiveProfiles("test") // EmbeddedRedisConfiguration이 활성화된 프로파일
class RedisTemplateTest {
@Autowired
private StringRedisTemplate redisTemplate;
@Test
@DisplayName("Embedded Redis에 값을 저장하고 조회할 수 있다")
void shouldSetAndGetValueDirectlyUsingRedisTemplate() {
// given
String key = "redis:test";
String value = "check";
// when
redisTemplate.opsForValue().set(key, value);
String result = redisTemplate.opsForValue().get(key);
// then
assertThat(result).isEqualTo("check");
}
}

참고 자료#

[Spring Boot] 개발/테스트 환경에서 인메모리 DB 설정하는 방법
https://punchdrunkard.github.io/posts/spring-boot/01-inmemory-db-config/
Author
42
Published at
2025-04-24
License
CC BY-NC-SA 4.0