๐ ์ธ์ํ ์คํธ ๊ฒฉ๋ฆฌํ๊ธฐ
์ธ์ ํ ์คํธ๋ฅผ ๊ฒฉ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
- @Transactional ์ด๋ ธํ ์ด์ ํ์ฉ
- @DirtiesContext ์ด๋ ธํ ์ด์ ํ์ฉ
- @Sql ํน์ ์ฟผ๋ฆฌ ์ํ
- ์ฝ๋ ์์ผ๋ก ํ ์ด๋ธ truncate
๋์ ๊ฒฝ์ฐ์๋ 3๋ฒ์งธ ๋ฐฉ๋ฒ ์ค ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ @interface๋ก ์ ์ธํ์ฌ ํด๋์ค๋จ์ ์ด๋ ธํ ์ด์ ์ ๋ถ์ด๋ฉด ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํ์๋ค. ์ด ๋ฐฉ๋ฒ์ DB๋ง๋ค ๋์ํ์ง ์์ ์ ์์ง๋ง, JPA์์ @Embeddable๊ณผ ๊ฐ์ด ์ค๊ฐ ํ ์ด๋ธ์ด ์๊ธฐ๋ ๊ฒฝ์ฐ๋ ์ด๊ธฐํ๋ฅผ ์ฝ๊ฒ ํ ์ ์์ด์ ์ด ๋ฐฉ๋ฒ์ ์ ํํ๋ค.
@Transactional
- RANDOM_PORT๋ DEFINED_PORT ์ฌ์ฉ ํ ๊ฒฝ์ฐ ์ค์ ์๋ธ๋ฆฟ ํ๊ฒฝ์ด ์ ๊ณต๋จ
- HTTP Client์ Server๋ ๋ค๋ฅธ ์ค๋ ๋์์ ๋์
- ๋ฐ๋ผ์ @Transactional์ ํตํ roll back์ ๋์ํ์ง ์์
@DirtiesContext
- ํจ๊ณผ์ ์ธ ํ ์คํธ ์ํ์ ์ํด ์คํ๋ง์์๋ context caching ๊ธฐ๋ฅ ์ง์
- context caching์ ์กฐ๊ฑด์ด ๋น์ด ์ค์ผ(๋ณ๊ฒฝ)๋์ง ์์ ๊ฒฝ์ฐ
- @DirtiesContext๋ฅผ ํ์ฉํ์ฌ (๋น์ ์ค์ผ์์ผ) ์บ์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ์๊ฒ ์ค์ ๊ฐ๋ฅ
- ๋งค๋ฒ Context๋ฅผ ์๋ก ๊ตฌ์ฑํ๋ค๋ณด๋ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆผ
@Sql ํน์ ์ฟผ๋ฆฌ ์ํ
- ํ ์คํธ๊ฐ ์ํ๋ ๋ ๋ง๋ค ํ ์ด๋ธ๋ค์ truncate ์ํค๋ ์ฟผ๋ฆฌ ์ํ
- ์ปจํ ์คํธ๋ฅผ ๋ค์ ๋์ฐ๋ ๊ฒ ๋ณด๋ค ๋ฎ์ ๋น์ฉ
- ํ ์ด๋ธ์ด ์ถ๊ฐ๋ ๋ ๋ง๋ค ํด๋น ์ฟผ๋ฆฌ ์์ ์ด ํ์
์ฝ๋ ์์ผ๋ก ํ ์ด๋ธ truncate
- JPA ์ฌ์ฉ์ EntityManager๋ฅผ ์ด์ฉํ์ฌ ํ ์ด๋ธ ์ด๋ฆ ์กฐํ
- ์๋ ๊ฒฝ์ฐ DataSource๋ฅผ ์ด์ฉํ์ฌ ํ ์ด๋ธ ์ด๋ฆ ์กฐํ
- ๊ฐ ํ ์ด๋ธ์ truncate ์์ผ์ฃผ๋ ์ฟผ๋ฆฌ ์ํ
- ํ ์ด๋ธ ์ํ์ ์์กดํ์ง ์๋ ์ด๊ธฐํ ํ๊ฒฝ ๊ตฌ์ถ ๊ฐ๋ฅ
๐ ์ธ์ ํ ์คํธ ๋ฆฌํฉํฐ๋ง
ํ ์คํธ๋ฅผ ๋ฆฌํฉํฐ๋ง ํ ๋๋ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ด ์๋ค.
ํ ์คํธ์ ์๋๋ฅผ ๋ช ํํ ๋๋ฌ๋ด์ผ ํ๋ค.
์ด๋ฅผ ํตํด ๊ฐ๋ ์ฑ์ ์ฑ๊ธธ ์ ์๋ค.
๊ฐ๋ ์ฑ์ด ์ข์ง ์์ ํ ์คํธ๋ ๋ฐฉ์น๋ ๊ฐ๋ฅ์ฑ์ด ์๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ์์ ํ๊ธฐ ์ด๋ ต๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ ์ฑ์ด ์ข์ผ๋ฉด ํด๋น ๊ธฐ๋ฅ์ ์คํฉ์ ๋ํ๋ผ ์ ์๋ค. ์ด๋ ํ๋ก๋์ ์ฝ๋๋ ๋์ผํ๋ค.
ํ ์คํธ ์ฝ๋ ์ค๋ณต์ ์ ๊ฑฐํด๋ผ.
ํ ์คํธ ์ฝ๋๋ ์ฝ๋๋ค. ์ฝ๋ ์์ฑ์ ์ค๋ณต ๋ด์ฉ์ด ๋ง์ด ๋ฐ์ํ์ฌ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง๋ณด์๋ฅผ ์ํด ์ค๋ณต์ ๊ฑฐ๋ฅผ ํด์ผํ๋ค.
๋ฉ์๋๋ฅผ ๋ถ๋ฆฌํ๊ณ , CRUD๋ฅผ ์ถ์ํํ๊ณ , Cucumber๋ JBehave์ ๊ฐ์ BDD ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ณต ์ ๊ฑฐ๊ฐ ๊ฐ๋ฅํ๋ค.
๋ค๋ฅธ ํ ์คํธ์์ ์ฌ์ฌ์ฉ ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ฝ๋๋ค์ ๋ณ๋์ ํด๋์ค๋ก ๋ถ๋ฆฌํ์ฌ static ์ ์ธํ์ฌ ์ฝ๊ฒ ๋ค๋ฅธ๊ณณ์์ ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ฌ ์ผ๊ด์ฑ์๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ CRUD๋ฅผ ์ถ์ํํ์ฌ ์๋๋ฅผ ๋๋ฌ๋ผ ์ ์๋ค. ๋ฉ์๋๋ฅผ ํ๊ธ๋ช ์ผ๋ก ๋ํํ์ฌ ์ฝ๊ธฐ ์ฌ์ด ํ ์คํธ๋ฅผ ๋ง๋ค ์ ์๋ค.
โ ๋ชจ๋ ์๊ตฌ์ฌํญ์ ์ธ์ ํ ์คํธ๋ก ์์ฑํด์ผ ํ ๊น?
์ด๋ ์ ๋ ์๋๋ค. ๋นํจ์จ์ ์ด๋ฉฐ, ํ ์คํธ์ ์๊ฐ ๋ง์๊ฒ ์ค์ํ๊ฒ ์๋๋ค.
์ฑ๊ณตํ๋ ํดํผ ์ผ์ด์ค์ ๋ํ ๊ฒ์ฆ ์์ฃผ๋ก ์์ฑํ๊ณ , ์์ธ ์ผ์ด์ค์ ๋ํ ๊ฒ์ฆ์ ๋น์ฉ์ด ๋ฎ์ ํ ์คํธ๋ก ์์ฑํ์.
๐ TDD์ ๋จ์ ํ ์คํธ
๋จ์ ํ ์คํธ๋ ์์ ์ฝ๋ ์กฐ๊ฐ์ ๊ฒ์ฆํ๋ค. ๋น ๋ฅด๊ฒ ์ํ์ด ๊ฐ๋ฅํ๊ณ ๊ฒฉ๋ฆฌ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ ๋๋ ํ๋ ฅ ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค.
ํตํฉ๊ณผ ๊ณ ๋ฆฝ์ด๋ผ๋ ํน์ง์ ํตํด ํ๋ ฅ ๊ฐ์ฒด๋ฅผ ์ค์ ๊ฐ์ฒด๋ก ์ฌ์ฉํ๋์ง, Mock ๊ฐ์ฒด๋ก ์ฌ์ฉํ๋์ง์ ๋ฐ๋ผ์ ํ ์คํธ ๊ตฌํ์ด ๋ฌ๋ผ์ง๋ค.
๐ญ Solitary Tests
Mock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ Test Double๊ณผ, Stub์ ๋ํด ์์์ผ ํ๋๋ฐ,
Test Double - ์ค ๊ฐ์ฒด ๋์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์ข ๋ฅ์ ๊ฐ์ฒด์ ๋ํ ์ผ๋ฐ์ฉ์ด, ์ฆ ์ค์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๋ก ๋์ฒด
Stub - Test Double์ ๋์์ ์ฌ์ ์ ์ ์ํ๋ ํ์
์ผ๋ฐ์ ์ผ๋ก 3๊ฐ์ง ๋ฐฉ๋ฒ์ ํตํด Mock ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ Subbing ํ ์ ์๋ค.
- Mockito ํ์ฉ
- MockitoExtension ํ์ฉ
- Spring์ ํ์ฉํ Stubbing
๐ ํตํฉ vs ๊ณ ๋ฆฝ
ํ๋ ฅ ๊ฐ์ฒด๋ฅผ ์ค์ ๊ฐ์ฒด๋ก ํด์ผํ ๊น? ๊ฐ์ง ๊ฐ์ฒด๋ก ํด์ผํ ๊น?
์ค์ ๊ฐ์ฒด๋ก ์ฌ์ฉํ๋ฉด ํ๋ ฅ ๊ฐ์ฒด์ ํ์๋ฅผ ํ๋ ฅ ๊ฐ์ฒด ์ค์ค๋ก ์ ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ํ๋ ฅ ๊ฐ์ฒด์ ์์ธ ๊ตฌํ์ ๋ํด ์ ํ์๊ฐ ์์ง๋ง, ํ๋ ฅ ๊ฐ์ฒด์ ์ ์ ๋์ ์ฌ๋ถ์ ์ํฅ์ ๋ฐ๋๋ค.
ํ์ง๋ง ๊ฐ์ง ๊ฐ์ฒด๋ก ํ๋ค๋ฉด ํ๋ ฅ ๊ฐ์ฒด์ ํ์๋ฅผ ํ ์คํธ๊ฐ ์ ์ํ๋ค. ํ ์คํธ ๋์์ ๊ฒ์ฆํ ๋ ์ธ๋ถ ์์ธ์ ๋ํด ์ฒ ์ ๋ฆฌ ๊ฒฉ๋ฆฌ๋์ด ์์ง๋ง ์์ธ ๊ตฌํ์ ์์์ผ ํ๋ค๋ ์ฐจ์ด๊ฐ ์๋ค. ์กฐ๊ธ ๋ ํธํ๊ฒ ํ ์คํธ๊ฐ ๊ฐ๋ฅํ์ง๋ง, ์์ธ ๊ตฌํ์ ์์กดํ๋ ํ ์คํธ๊ฐ ๋ ์ ์์ด ์ด๋ฅผ ๊ณ ๋ คํด์ ์ ํํด์ผ ํ๋ค.
๋ด ์๊ฐ์ผ๋ก, ํ ์คํธ๊ฐ ๊ฐ๋ฅํ๋ค๋ฉด ์ค ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋์์ด ๋ณ๊ฒฝ๋๋ฉด ํ ์คํธ๋ฅผ ์์ ํ์ฌ ๋ชจ๋ ํ ์คํธ๊ฐ ์ด์์๋ ํ ์คํธ๊ฐ ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋ค. ๋ง์ฝ, ๋์์ ์์ธกํ ์ ์๋ ํด๋์ค์ธ๋ฐ mock ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ํด๋น ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋์์๋๋ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ํตํด ํ ์คํธ๋ฅผ ํ๋ค๋ฉด ์คํจํด์ผ ํ ํ ์คํธ๊ฐ ์ฑ๊ณตํ๋ ์ผ์ด ๋ฐ์ํ ์ ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค. ํ์ง๋ง, ๋๋คํ ๊ฐ์ ์ถ๋ ฅํ๋ ํด๋์ค๊ฑฐ๋ ์ธ๋ถ์ ํต์ ์ ํตํด ์์ธกํ ์ ์๋ ๊ฐ์ ๊ฐ์ ธ์ค๋ ๊ฒฝ์ฐ๋ผ๋ฉด mock์ ํ์ฉํ๋๊ฒ ๋ง๋ค๊ณ ์๊ฐํ๋ค.
'Study > Next Step' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Next Step] ATDD, ํด๋ฆฐ ์ฝ๋ with Spring 8๊ธฐ 3์ฃผ์ฐจ ๋ฆฌ๋ทฐ (0) | 2024.03.05 |
---|---|
[Next Step] ATDD, ํด๋ฆฐ ์ฝ๋ with Spring 8๊ธฐ 1์ฃผ์ฐจ ๋ฆฌ๋ทฐ (2) | 2024.02.02 |