๐ŸƒTDD ๊ฐœ๋ฐœ - Repository Test

dev_itzel_02โœจยท2025๋…„ 2์›” 6์ผ

๐ŸƒJavaSpring

๋ชฉ๋ก ๋ณด๊ธฐ
3/11
post-thumbnail

ํ˜„์žฌ ์šด์˜์ค‘์ธ ์ฑ—๋ด‡ ์„œ๋น„์Šค๊ฐ€ ์žˆ๋Š”๋ฐ, ์„œ๋ฒ„๋ฅผ GCP๋กœ ์˜ฎ๊ธฐ๋ฉด์„œ ๋ฌด๋ฃŒ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜์—ฌ ์†๋„๊ฐ€ ํ˜„์ €ํžˆ ๋А๋ ค์กŒ๋‹ค. ๋‹จ์ง€, ์‹คํ–‰๋งŒ ๋˜๋„๋ก ์ž‘์„ฑํ–ˆ๋˜ ์ฝ”๋“œ๋“ค์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด TDD๊ธฐ๋ฐ˜ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๋ฉฐ ๋ฆฌํŒฉํ† ๋ง ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

์šฐ์„ , ๊ถ๊ธˆํ•œ ์ ๋“ค์„ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹คโ—

1. Repository ํ…Œ์ŠคํŠธ ๋ฐฉ์‹

Repository ๊ณ„์ธต์˜ ํ…Œ์ŠคํŠธ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(MySQL, PostgreSQL ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , H2์™€ ๊ฐ™์€ ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ™œ์šฉํ•ด์„œ ์ง„ํ–‰ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด์œ ๋Š” ์‹ค์ œ JPA, Hibernate, SQL ์ฟผ๋ฆฌ๋ฅผ ํฌํ•จํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์˜ ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

โœ… H2 ์ธ๋ฉ”๋ชจ๋ฆฌ DB๋ž€?

H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ€๋ฒผ์šด SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ, ํ…Œ์ŠคํŠธ์šฉ์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋กœ๋“œ๋จ.
  • ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฌ๋ผ์ง (ํœ˜๋ฐœ์„ฑ).
  • MySQL, PostgreSQL๊ณผ ๊ฐ™์€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ SQL ๋ฌธ๋ฒ•์ด ๊ฑฐ์˜ ๋™์ผํ•˜์—ฌ ์‹ค์ œ DB์™€ ์œ ์‚ฌํ•œ ํ™˜๊ฒฝ์—์„œ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ.

2. Repository ๊ณ„์ธต์˜ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

๐Ÿ”น ์ธ๋ฉ”๋ชจ๋ฆฌ DB๋ฅผ ์‚ฌ์šฉํ•œ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (H2 ๊ธฐ๋ฐ˜)

Spring Boot์—์„œ๋Š” @DataJpaTest ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ H2 ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค์ •ํ•œ๋‹ค.
์ฆ‰, @DataJpaTest๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Spring Data JPA์˜ ๊ธฐ๋Šฅ์„ ์‹ค์ œ DB ์—†์ด ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.

๐Ÿ”น ์‹ค์ œ DB์™€ ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘์„ ๊ฒ€์ฆํ•˜๋Š” ํ…Œ์ŠคํŠธ

  • Spring Data JPA ๊ธฐ๋Šฅ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ
  • JPA ์ฟผ๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์ฆ
  • Repository์˜ CRUD ๋™์ž‘์„ ์‹ค์ œ ํ™˜๊ฒฝ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์‹คํ–‰

โœ”๏ธ Mock์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ?

โ†’ Repository ํ…Œ์ŠคํŠธ๋Š” ์‹ค์ œ SQL ์‹คํ–‰์„ ํ™•์ธํ•˜๋Š” ๊ฒŒ ๋ชฉ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— Mock์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

Repository ํ…Œ์ŠคํŠธ (@DataJpaTest)

  • ์‹ค์ œ DB(H2 ๋“ฑ)์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ด๋ณธ๋‹ค.
  • Spring Data JPA๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  • Mock ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

Service ํ…Œ์ŠคํŠธ (@MockBean)

  • Repository์˜ ๋™์ž‘์„ Mockingํ•˜์—ฌ DB์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์„œ๋น„์Šค ๋กœ์ง๋งŒ ๊ฒ€์ฆํ•œ๋‹ค.
  • Service ๊ณ„์ธต์ด Repository์™€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•œ๋‹ค.
  • Mockito๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์งœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.

โœ”๏ธ GWT ํŒจํ„ด์ด๋ž€?

Given-When-Then์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ , ํ…Œ์ŠคํŠธ ํ๋ฆ„์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” BDD (Behavior-Driven Development, ํ–‰์œ„ ์ฃผ๋„ ๊ฐœ๋ฐœ) ํŒจํ„ด

์ด ํŒจํ„ด์€ ํ…Œ์ŠคํŠธ๋ฅผ ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

  • Given (์ค€๋น„) โ†’ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ์‚ฌ์ „ ์กฐ๊ฑด์„ ์„ค์ •
  • When (์‹คํ–‰) โ†’ ํ…Œ์ŠคํŠธํ•  ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰
  • Then (๊ฒ€์ฆ) โ†’ ์˜ˆ์ƒํ•œ ๊ฒฐ๊ณผ์™€ ์‹ค์ œ ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ต

โœ… @DataJpaTest vs @SpringBootTest ์ฐจ์ด

์–ด๋…ธํ…Œ์ด์…˜์„ค๋ช…์ฃผ์š” ํŠน์ง•
@DataJpaTestJPA ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ(Repository)๋งŒ ๋กœ๋“œํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜H2 ๊ฐ™์€ ์ธ๋ฉ”๋ชจ๋ฆฌ DB ์ž๋™ ์„ค์ • / @Entity, @Repository๋งŒ ๋กœ๋“œ๋จ / @Service, @Controller๋Š” ๋กœ๋“œ๋˜์ง€ ์•Š์Œ / ๋น ๋ฅธ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
@SpringBootTest์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋กœ๋“œํ•˜์—ฌ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ชจ๋“  ๋นˆ(@Service, @Controller ํฌํ•จ) ๋กœ๋“œ / ์‹ค์ œ DB๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ / ์ „์ฒด์ ์ธ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ / ์‹คํ–‰ ์†๋„๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ

โœ”๏ธ์‹ค์ œ DB์™€ ํ…Œ์ŠคํŠธ์šฉ DB ๋ถ„๋ฆฌ

ํ˜„์žฌ ์šด์˜์ค‘์ธ ์„œ๋น„์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ DB์™€ ํ…Œ์ŠคํŠธ์šฉ DB๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
ํ•˜๋‚˜์˜ application.properties ํŒŒ์ผ์— ๋™์ผํ•œ ํ‚ค๋กœ db ์„ค์ •์ด ๋ถˆ๊ฐ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— application-test.properties ํŒŒ์ผ์„ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด ์„ค์ •์„ ์ง„ํ–‰ํ•œ๋‹ค.

ํŒŒ์ผ์˜ ์œ„์น˜๋Š” ์œ„์™€ ๊ฐ™์€ ๊ฒฝ๋กœ์— ์กด์žฌํ•˜๋„๋ก ํ•œ๋‹ค.

1. build.gradle์˜ dependency์— ์˜์กด์„ฑ ์ถ”๊ฐ€

2. application-test.properties h2 ์„ค์ •

# Datasource ์„ค์ •
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:test
spring.datasource.username=sa
spring.datasource.password=

# H2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์šฉ Hibernate dialect(JPA๊ฐ€ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”Œ๋žซํผ์„ ์ง€์ •ํ•œ๋‹ค)
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ์ž‘์‹œ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ์‹œ ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•œ๋‹ค
spring.jpa.hibernate.ddl-auto=create-drop
# ํ…Œ์ด๋ธ” ๊ด€๋ จ SQL๋ฌธ ์ฝ˜์†”์— ์ถœ๋ ฅ
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

# H2 ์ฝ˜์†” ์„ค์ •
spring.h2.console.enabled=true
spring.h2.console.path=/h2

[์ถœ์ฒ˜]

profile
๐Ÿœ๐Ÿ‘ฃsteadiness๐Ÿœ๐Ÿ‘ฃ

0๊ฐœ์˜ ๋Œ“๊ธ€