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 ์„ค์ •

ํ…Œ์ŠคํŠธ์šฉ ์„ค์ • ํŒŒ์ผ(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"

๋™์ž‘ ๋ฐฉ์‹

  1. @ActiveProfiles("test") ๋“ฑ์œผ๋กœ ํ…Œ์ŠคํŠธ ํ”„๋กœํ•„์ด ํ™œ์„ฑํ™”๋˜๋ฉด ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ jdbc:tc: URL์„ ์ธ์‹

  2. Testcontainers ๋ชจ๋“ˆ์ด mysql:8.0.33 ์ด๋ฏธ์ง€๋ฅผ ์ฐพ์•„ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰

  3. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹คํ–‰๋˜๋ฉด, jdbc:tc:... URL์„ ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ์˜ ๋™์  JDBC URL(์˜ˆ: jdbc:mysql://localhost:32768/testdb) ์ž๋™ ๊ต์ฒด

  4. ํ…Œ์ŠคํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ž๋™์œผ๋กœ ์ข…๋ฃŒ

์ด ๋ฐฉ์‹์€ Kafka, RabbitMQ, Redis ๋“ฑ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—๋„ @ServiceConnection ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ๋งค์šฐ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ์ˆ˜๋™ ์„ค์ • (@Testcontainers ๋ฐ @DynamicPropertySource)

Spring Boot 3.1 ๋ฏธ๋งŒ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, JDBC ์™ธ์˜ ์ปค์Šคํ…€ ์ปจํ…Œ์ด๋„ˆ(์˜ˆ: Kafka, Redis)๋ฅผ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ „ํ†ต์ ์ธ ๋ฐฉ์‹์ด๋‹ค.

  • @Testcontainers: JUnit 5 ํ™•์žฅ ๊ธฐ๋Šฅ์œผ๋กœ, ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๊ฐ€ Testcontainers์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ๊ด€๋ฆฌํ•˜๋„๋ก ์„ค์ •

  • @Container: ๊ด€๋ฆฌํ•  ์ปจํ…Œ์ด๋„ˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์„ ์–ธ

    • static์œผ๋กœ ์„ ์–ธํ•˜๋ฉด ํ•ด๋‹น ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ๋‚ด์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ณต์œ 

  • @DynamicPropertySource: ๋™์  ์†์„ฑ์„ ์Šคํ”„๋ง์˜ Environment (ํ”„๋กœํผํ‹ฐ)์— ์ฃผ์ž…ํ•˜๋Š” ์—ญํ• 

๊ณตํ†ต ์„ค์ •(์ถ”์ƒ ํด๋ž˜์Šค)

์ˆ˜๋™ ์„ค์ •์€ ์ฃผ๋กœ ๊ณตํ†ต ์„ค์ •์„ ๋‹ด์€ ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด ์ƒ์†๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค ์ ์šฉ

์ด์ œ ์ด ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

Last updated

Was this helpful?