Spring Boot์ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค: ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ์๋ฒ ๋๋ DB ํ์ฉ ๊ฐ์ด๋
H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ์๋ฒ ๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก, Spring Boot์ ํจ๊ป ์ฌ์ฉํ ๋ ํ ์คํธ์ ๊ฐ๋ฐ์ ์ต์ ํ๋ ํ๊ฒฝ ์ ์ ๊ณตํฉ๋๋ค. ์ด ๊ธ์์๋ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ๊ณผ ํ์ฉ ๋ฐฉ๋ฒ , H2 ์ฝ์ ์ฌ์ฉ๋ฒ ์ ์์๋ณด๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ํ ์คํธ ์ ์๋ฒ ๋๋ DB๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ์ ์ฝ๋ ์์ ์ ํจ๊ป ์ค๋ช ํฉ๋๋ค.
๋ชฉ์ฐจ
- H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฌด์์ธ๊ฐ?
- Spring Boot์์ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ํ๊ธฐ
- H2 ์ฝ์ ์ฌ์ฉ๋ฒ (
http://localhost:8080/h2-console
) - ํ ์คํธ ํ๊ฒฝ์์ ์๋ฒ ๋๋ DB ํ์ฉํ๊ธฐ
- H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋ ๋์ ์ฅ์
1. H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ๋ฌด์์ธ๊ฐ?
H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ์คํ๋๋ ์คํ์์ค ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋๋ค. ์ธ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ ๋ฅผ ์ง์ํด ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํจ๊ป ์คํ๋๋ฉฐ, ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ฏ๋ก ํ ์คํธ ํ๊ฒฝ ์ ๋งค์ฐ ์ ํฉํฉ๋๋ค.
H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฃผ์ ํน์ง
- ๋น ๋ฅธ ์คํ ์๋ : ๋ฉ๋ชจ๋ฆฌ์์ ์คํ๋๋ฏ๋ก ๋น ๋ฅด๊ฒ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์๋ฒ ๋๋ ๋ชจ๋ ์ง์ : ์ ํ๋ฆฌ์ผ์ด์ ๋ด์ ํตํฉ ๊ฐ๋ฅ
- SQL ํ์ค ์ค์ : ์ผ๋ฐ์ ์ธ SQL ๋ฌธ๋ฒ์ ๋ชจ๋ ์ง์
- H2 ์ฝ์ ์ ๊ณต : ๋ธ๋ผ์ฐ์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ํ๋ฅผ ํ์ธํ๊ณ ์ฟผ๋ฆฌ ์คํ ๊ฐ๋ฅ
H2๋ ๊ฐ๋ฐ ์ด๊ธฐ ๋ ํ ์คํธ ํ๊ฒฝ ์์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋๋ฉฐ, ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํ์ํ ๊ธฐ๋ฅ์ ์์ฝ๊ฒ ๊ตฌํํ๊ณ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
2. Spring Boot์์ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ํ๊ธฐ
์์กด์ฑ ์ถ๊ฐ (pom.xml)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
-
spring-boot-starter-data-jpa
: JPA ๊ธฐ๋ฅ ์ ๊ณต -
h2
: H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์กด์ฑ ์ถ๊ฐ
์ค์ ํ์ผ ์์ฑ (application.properties)
# H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
-
spring.datasource.url
: ์ธ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ฉ -
spring.h2.console.enabled=true
: H2 ์ฝ์ ํ์ฑํ -
spring.jpa.hibernate.ddl-auto=update
: ์ํฐํฐ ๋ณ๊ฒฝ ์ ํ ์ด๋ธ ์๋ ๊ฐฑ์
3. H2 ์ฝ์ ์ฌ์ฉ๋ฒ (
http://localhost:8080/h2-console
)
Spring Boot์์ H2 ์ฝ์์ ํ์ฑํํ๋ฉด ๋ธ๋ผ์ฐ์ ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์ ํ์ธํ ์ ์์ต๋๋ค.
H2 ์ฝ์ ์ ์ ๋ฐฉ๋ฒ
- ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ ํ
http://localhost:8080/h2-console
์ ์ ์ํฉ๋๋ค. - JDBC URL ์
jdbc:h2:mem:testdb
๋ฅผ ์ ๋ ฅํฉ๋๋ค. - Username ์
sa
, Password ๋ ๋น์๋ก๋๋ค. - Connect ๋ฒํผ์ ํด๋ฆญํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ํ ์ ์์ต๋๋ค.
H2 ์ฝ์ ํ๋ฉด๊ณผ ์ฌ์ฉ๋ฒ
- ์ฟผ๋ฆฌ ์คํ ์ฐฝ ์์ SQL ์ฟผ๋ฆฌ๋ฅผ ์ ๋ ฅํ๊ณ ์คํํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ์กฐํํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ํ ์ ์์ต๋๋ค.
- ํ ์ด๋ธ ์คํค๋ง ๋ฅผ ํ์ธํ๊ณ , ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๊ฒ์ฆํ ์ ์์ต๋๋ค.
4. ํ ์คํธ ํ๊ฒฝ์์ ์๋ฒ ๋๋ DB ํ์ฉํ๊ธฐ
H2๋ ํ ์คํธ ํ๊ฒฝ์์ ๋น ๋ฅธ ๋ฐ์ดํฐ ๊ฒ์ฆ ์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค. ์๋๋ JUnit ํ ์คํธ ์์ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ฉํ๋ ์์ ์ ๋๋ค.
ํ ์คํธ ์ฝ๋ ์์ : User ์ํฐํฐ CRUD ํ ์คํธ
User.java (์ํฐํฐ)
package com.example.demo.entity;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Entity
@Getter
@Setter
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
}
UserRepository.java (๋ ํฌ์งํ ๋ฆฌ)
package com.example.demo.repository;
import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
public interface UserRepository extends JpaRepository<User, Long> {
}
UserRepositoryTest.java (ํ ์คํธ ์ฝ๋)
package com.example.demo;
import com.example.demo.entity.User;
import com.example.demo.repository.UserRepository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
public class UserRepositoryTest {
@Autowired
private UserRepository userRepository;
@Test
public void ์ฌ์ฉ์_์ ์ฅ_๋ฐ_์กฐํ() {
// ์ฌ์ฉ์ ์ ์ฅ
User user = new User("ํ๊ธธ๋", "hong@example.com");
userRepository.save(user);
// ์ฌ์ฉ์ ์กฐํ
Optional<User> foundUser = userRepository.findById(user.getId());
// ๊ฒ์ฆ
assertThat(foundUser).isPresent();
assertThat(foundUser.get().getName()).isEqualTo("ํ๊ธธ๋");
}
}
ํ ์คํธ ์ฝ๋ ์ค๋ช
- SpringBootTest ์ ๋ํ ์ด์ ์ผ๋ก ํ ์คํธ ํ๊ฒฝ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํฉ๋๋ค.
- User ์ํฐํฐ ๋ฅผ ์ ์ฅํ๊ณ , Repository๋ฅผ ํตํด ์กฐํ ํฉ๋๋ค.
- AssertJ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
์ด์ ๊ฐ์ด H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฅผ ์ฌ์ฉํ๋ฉด ํ ์คํธ ์ฝ๋์์ ์ค์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋์ผํ ํ๊ฒฝ์ ์๋ฎฌ๋ ์ด์ ํ ์ ์์ต๋๋ค.
5. H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋ ๋์ ์ฅ์
- H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋น ๋ฅธ ๊ฐ๋ฐ๊ณผ ํ ์คํธ ๋ฅผ ์ํ ์๋ฒ ๋๋ DB๋ก ๋ง์ ๊ฐ๋ฐ์๋ค์๊ฒ ์ฌ๋๋ฐ๊ณ ์์ต๋๋ค.
- Statista ์ ์กฐ์ฌ์ ๋ฐ๋ฅด๋ฉด, ์ ์ธ๊ณ ๊ฐ๋ฐ์์ 45% ๊ฐ ํ ์คํธ ํ๊ฒฝ์์ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- H2 ๋ ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ก๋ ํ์ฉ๋๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ด๊ธฐ ๋จ๊ณ์์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
๊ด๋ จ ๋งํฌ
H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ณต์ ์ฌ์ดํธ๐
Spring Boot์ JPA ๊ฐ์ด๋๐
FAQ
1. H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ธ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋์?
- ์ฃผ๋ก ํ ์คํธ ํ๊ฒฝ ๊ณผ ๊ฐ๋ฐ ์ด๊ธฐ ์ ์ฌ์ฉํฉ๋๋ค. ๋น ๋ฅธ ์คํ๊ณผ ๊ฐํธํ ์ค์ ์ด ์ฅ์ ์ ๋๋ค.
2. H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ ์๊ตฌ ์ ์ฅ๋๋์?
- ์ธ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋์์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ข ๋ฃ ์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋๋ค. ํ์ผ ๋ชจ๋๋ก ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ ์ ์์ต๋๋ค.
3. H2 ์ฝ์์ ์ ์ํ ์ ์์ ๋ ์ด๋ป๊ฒ ํด์ผ ํ๋์?
application.properties
ํ์ผ์์spring.h2.console.enabled=true
๋ก ์ค์ ํ๋์ง ํ์ธํ์ธ์.
4. ์ค์ ์ด์ ํ๊ฒฝ์์๋ H2๋ฅผ ์ฌ์ฉํ ์ ์๋์?
- ์ด์ ํ๊ฒฝ์์๋ ๋ณดํต MySQL, PostgreSQL ๊ฐ์ RDBMS ๋ฅผ ์ฌ์ฉํฉ๋๋ค. H2๋ ๊ฐ๋ฐ๊ณผ ํ ์คํธ์ ๋ ์ ํฉํฉ๋๋ค.
5. JPA์ H2์ ์กฐํฉ์ด ์ ์ฉํ ์ด์ ๋ ๋ฌด์์ธ๊ฐ์?
- JPA๋ฅผ ์ฌ์ฉํ๋ฉด ํ ์ด๋ธ ์์ฑ๊ณผ ๋งคํ์ ์๋ํ ํ ์ ์๊ณ , H2๋ ๋น ๋ฅด๊ฒ ์ด๋ฅผ ๊ฒ์ฆํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
๋ง๋ฌด๋ฆฌ
์ด๋ฒ ํฌ์คํ ์์๋ Spring Boot์ H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ๊ณผ ํ ์คํธ ํ๊ฒฝ์ ์ฝ๊ฒ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์์ต๋๋ค. H2 ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋๋ก ๋น ๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฒ๋ฆฌ ์๋๋ฅผ ์ ๊ณตํ๋ฉฐ, JPA์์ ์กฐํฉ ์ ํตํด ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ ๊ทน๋ํํฉ๋๋ค. ๋ํ, H2 ์ฝ์ ์ ํ์ฉํด ๋ธ๋ผ์ฐ์ ์์ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์คํํ๋ฉฐ ํ ์ด๋ธ์ ํ์ธํ๋ ๋ฐฉ๋ฒ๋ ์ค๋ช ํ์ต๋๋ค.
H2๋ ์ด์ ํ๊ฒฝ ๋ณด๋ค๋ ํ ์คํธ ํ๊ฒฝ๊ณผ ๊ฐ๋ฐ ์ด๊ธฐ ์ ์ ํฉํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก, JUnit๊ณผ ํจ๊ป ์ ์ฉํ๊ฒ ํ์ฉ ํ ์ ์์ต๋๋ค. ํ๋ก์ ํธ ์ด๊ธฐ ๋จ๊ณ์์ H2๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋น ๋ฅด๊ฒ ๊ตฌ์ถํ๊ณ ๊ฒ์ฆํ๋ฉด, ๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถํ ์ ์์ต๋๋ค.
์ด์ ์ฌ๋ฌ๋ถ์ ํ๋ก์ ํธ์์ H2์ JPA๋ฅผ ํ์ฉํด CRUD ๊ธฐ๋ฅ์ ๊ตฌํํ๊ณ ํ ์คํธ๋ฅผ ์งํํด๋ณด์ธ์!
๋๊ธ