Testcontainers
ํ ์คํธ์ H2์ ๊ฐ์ ์ธ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง, ์ค์ ์ด์ ํ๊ฒฝ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค(์: MySQL)์ ๋ฌธ๋ฒ(Dialect)์ด๋ ๋์ ๋ฐฉ์์ด ๋ฌ๋ผ ํ ์คํธ์ ์ ๋ขฐ๋๋ฅผ ๋จ์ด๋จ๋ฆด ์ ์๋ค.
ํต์ฌ ๊ธฐ๋ฅ: ํ ์คํธ ์คํ ์ ์ค์ MySQL, Kafka, Redis ๋ฑ์ ์ํํธ์จ์ด๊ฐ ์ค์น๋ ๋์ปค ์ปจํ ์ด๋๋ฅผ ์คํํ๊ณ , ํ ์คํธ ์ข ๋ฃ ์ ์ปจํ ์ด๋๋ฅผ ์๋์ผ๋ก ์ค์ง ๋ฐ ์ญ์
์ฅ์
ํ๊ฒฝ ์ผ๊ด์ฑ: ๊ฐ๋ฐ, ํ ์คํธ, ์ด์ ํ๊ฒฝ์์ ๋์ผํ ๋ฒ์ ์ ์ํํธ์จ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ ๋ขฐ๋์ ํ ์คํธ ๊ฐ๋ฅ
์์ ํ ๊ฒฉ๋ฆฌ: ๊ฐ ํ ์คํธ(ํน์ ํ ์คํธ ํด๋์ค)๋ง๋ค ๊นจ๋ํ ์ํ์ ์ปจํ ์ด๋๋ฅผ ์ ๊ณตํ์ฌ ํ ์คํธ ๊ฐ ๊ฒฉ๋ฆฌ์ฑ ๋ณด์ฅ
Testcontainers๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ํ ์คํธ ์ฝ๋ ๋ด์์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก ๋์ปค(Docker) ์ปจํ ์ด๋๋ฅผ ์ ์ดํ ์ ์๊ฒ ํด์ค๋ค.
1. Spring Boot 3.1+ ์๋ ์ค์
Spring Boot 3.1 ๋ฒ์ ๋ถํฐ Testcontainers์์ ๊ณต์ ํตํฉ ๊ธฐ๋ฅ์ด ๋์
๋์ด, application.yml ์ค์ ๋ง์ผ๋ก Testcontainers๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์์กด์ฑ ์ถ๊ฐ
// build.gradle
testImplementation "org.springframework.boot:spring-boot-testcontainers"
testImplementation "org.testcontainers:mysql"
testImplementation "org.testcontainers:junit-jupiter" // ์๋ ์ค์ ์ ํ์application-test.yml ์ค์
application-test.yml ์ค์ ํ
์คํธ์ฉ ์ค์ ํ์ผ(src/test/resources/application-test.yml)์ spring.datasource.url์ jdbc:tc: ์ ๋์ฌ๋ก ๋ณ๊ฒฝํ๋ค.
# application-test.yml
spring:
datasource:
# jdbc:tc:[๋ฐ์ดํฐ๋ฒ ์ด์ค์ข
๋ฅ]:[๋ฒ์ ํ๊ทธ]///[DB์ด๋ฆ]
url: "jdbc:tc:mysql:8.0.33:///testdb"
username: "test"
password: "test"
driver-class-name: "org.testcontainers.jdbc.ContainerDatabaseDriver"๋์ ๋ฐฉ์
@ActiveProfiles("test")๋ฑ์ผ๋ก ํ ์คํธ ํ๋กํ์ด ํ์ฑํ๋๋ฉด ์คํ๋ง ๋ถํธ๊ฐjdbc:tc:URL์ ์ธ์Testcontainers ๋ชจ๋์ด
mysql:8.0.33์ด๋ฏธ์ง๋ฅผ ์ฐพ์ ๋์ปค ์ปจํ ์ด๋๋ฅผ ์คํ์ปจํ ์ด๋๊ฐ ์คํ๋๋ฉด,
jdbc:tc:...URL์ ์ค์ ์ปจํ ์ด๋์ ๋์ JDBC URL(์:jdbc:mysql://localhost:32768/testdb) ์๋ ๊ต์ฒดํ ์คํธ๊ฐ ์ข ๋ฃ๋๋ฉด ํด๋น ์ปจํ ์ด๋๋ฅผ ์๋์ผ๋ก ์ข ๋ฃ
์ด ๋ฐฉ์์ Kafka, RabbitMQ, Redis ๋ฑ ๋ค๋ฅธ ๋ชจ๋์๋ @ServiceConnection ์ ๋
ธํ
์ด์
์ ํตํด ๋งค์ฐ ๊ฐํธํ๊ฒ ์ ์ฉํ ์ ์๋ค.
2. ์๋ ์ค์ (@Testcontainers ๋ฐ @DynamicPropertySource)
@Testcontainers ๋ฐ @DynamicPropertySource)Spring Boot 3.1 ๋ฏธ๋ง ๋ฒ์ ์ ์ฌ์ฉํ๊ฑฐ๋, JDBC ์ธ์ ์ปค์คํ ์ปจํ ์ด๋(์: Kafka, Redis)๋ฅผ ์ธ๋ฐํ๊ฒ ์ ์ดํด์ผ ํ ๋ ์ฌ์ฉํ๋ ์ ํต์ ์ธ ๋ฐฉ์์ด๋ค.
@Testcontainers: JUnit 5 ํ์ฅ ๊ธฐ๋ฅ์ผ๋ก, ํ ์คํธ ํด๋์ค๊ฐ Testcontainers์ ๋ผ์ดํ์ฌ์ดํด์ ๊ด๋ฆฌํ๋๋ก ์ค์ @Container: ๊ด๋ฆฌํ ์ปจํ ์ด๋ ์ธ์คํด์ค๋ฅผ ์ ์ธstatic์ผ๋ก ์ ์ธํ๋ฉด ํด๋น ํ ์คํธ ํด๋์ค ๋ด์ ๋ชจ๋ ๋ฉ์๋๊ฐ ์ปจํ ์ด๋๋ฅผ ๊ณต์
@DynamicPropertySource: ๋์ ์์ฑ์ ์คํ๋ง์Environment(ํ๋กํผํฐ)์ ์ฃผ์ ํ๋ ์ญํ
๊ณตํต ์ค์ (์ถ์ ํด๋์ค)
์๋ ์ค์ ์ ์ฃผ๋ก ๊ณตํต ์ค์ ์ ๋ด์ ์ถ์ ํด๋์ค๋ฅผ ๋ง๋ค์ด ์์๋ฐ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋๋ค.
ํ
์คํธ ํด๋์ค ์ ์ฉ
์ด์ ์ด ์ถ์ ํด๋์ค๋ฅผ ์์๋ฐ๊ธฐ๋ง ํ๋ฉด ๋๋ค.
Last updated
Was this helpful?