Spring Boot 프로젝트를 실행하고, POST로 데이터를 전송한 후 GET으로 조회해 보니, 방금 저장한 데이터가 잘 나온다.
- application.properties에 DB 연결 정보가 없음
- MySQL이나 PostgreSQL 같은 데이터베이스를 설치하지도 않음
이게 가능한 이유는 Spring Boot의 기본 동작 때문이다.
Spring Boot의 기본 동작 — 자동 H2 인메모리 DB
Spring Boot에서 JPA(JpaRepository)를 사용하지만 DB 설정이 없는 경우,
자동으로 인메모리 H2 데이터베이스를 사용한다.
인메모리 DB란?
디스크가 아닌 메모리(RAM)에 데이터가 저장되는 데이터베이스로,
애플리케이션이 종료되면 모든 데이터가 사라진다.
Spring Boot는 다음 조건에서 H2를 자동 활성화한다.
- JPA 의존성 존재 (spring-boot-starter-data-jpa)
- 데이터베이스 설정 없음
- H2 라이브러리 사용 가능 (Spring Boot 내장 의존성)
이 경우, 실행 시점에 H2 인메모리 DB를 생성하고 JPA 엔티티를 기반으로 테이블을 자동 생성한다.
- application.properties에 DB 설정이 없음
- TodoRepository가 JpaRepository를 상속 → JPA 사용
- Spring Boot가 H2 인메모리 DB를 자동 구성
- POST 요청 시 → 인메모리 DB에 데이터 저장
- GET 요청 시 → 같은 인메모리 DB에서 조회 → 데이터 반환
프로젝트가 실행되는 동안은
H2 인메모리 DB가 진짜 데이터베이스처럼 동작하기 때문에
POST → GET으로 데이터가 이어져 보인다.
인메모리 H2의 한계
- 휘발성: 애플리케이션 재시작 시 모든 데이터가 삭제된다.
- 개발·테스트용: 운영 환경에서 쓰면 안 됨 (데이터 영속성 보장 안 됨)
- 디스크 저장 안 함: 메모리 기반이라 속도는 빠르지만, 지속성이 없다.
영구 저장이 필요하다면 운영 환경에서는 MySQL, PostgreSQL, MariaDB 등 실제 데이터베이스를 연결해야 한다.
- Spring Boot는 DB 설정이 없으면 H2 인메모리 DB를 자동 사용한다.
- POST → GET이 되는 이유는 동일한 인메모리 DB 세션을 사용하기 때문이다.
- 재시작 시 데이터가 사라지므로 운영에서는 실제 DB 설정이 필수이다.
개발 초기에는 H2를 사용하면 편리하다.
- 설치 필요 없음
- JPA 엔티티 테스트에 유용
- 빠른 속도
하지만 데이터 영속성이 필요하거나 운영 환경에서는 반드시 MySQL, PostgreSQL 같은 외부 DB를 사용해야 한다.
반응형
'IT > Spring' 카테고리의 다른 글
| JUnit의 테스트 생명주기 어노테이션 (0) | 2025.11.30 |
|---|---|
| @Transactional(readOnly = true) (0) | 2025.11.11 |
| Spring Boot에서 @Valid와 @ExceptionHandler로 유효성 검사 에러 처리 (2) | 2025.08.05 |
| Spring Data JPA 페이지네이션(Pagination) 처리 (1) | 2025.07.30 |
| JPA에서 deleteAll() vs deleteAllInBatch()의 차이와 주의할 점 (0) | 2025.07.19 |