[Spring boot] Spring ํ ์คํธ ๋ฐฉ๋ฒ๊ณผ @SpringBootTest
์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ํ ์คํธ ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํด์ผ ํ ๊น์?
์ ๊ฐ ์ฒ์ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๊ณ ๋์ ํ ์คํธ ์ฝ๋๋ฅผ ๊ตฌํํ์ ๋ ๊ฐ์ฅ ํฐ ์๋ฌธ์ ์ด ๋ค์๋ ์ ํ์ด์์ต๋๋ค. ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ๋ก ์๋๋ก์ด๋ ๊ฐ๋ฐ์ ์งํํ์ ๋๋ Unit Test์ Instrument Test ๋ ๊ฐ์ง๋ฅผ ์งํํ๊ณ , ๊ฐ๊ฐ DB I/O ํ ์คํธ์ UI/UX ๋์ ํ ์คํธ๋ฅผ ์งํํ ๊ฒ์ด์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋จ๊น์? ๋ํ์ ์ธ Spring boot๋ฅผ ์ด๋ฒ ํฌ์คํธ์์ ๋ค๋ค๋ณผํ ๋ฐ, Spring boot์์๋ JUnit ์ด๋ผ๋ ํ ์คํธ ๋๊ตฌ์ Mockito๋ผ๋ Mock ๊ฐ์ฒด ์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ํ ์คํธ๋ฅผ ์งํํ ์ ์๊ณ , ํ ์คํธ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ์ 3๊ฐ์ง๋ก ๋ถ๋ฅํ ์ ์์ต๋๋ค.
Spring boot์ ํ ์คํธ ๋ถ๋ฅ
https://spring.io/guides/gs/testing-web/
๊ณต์ Spring์์ ๊ฐ์ด๋ํ๋ ํ ์คํธ ๋ฐฉ๋ฒ์ ๋ณด๋ฉด, Web Layer(Controller)๋ง์ ํ ์คํธํ๋ @WebMvcTest์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด๋ฅผ ๋ก๋ํ์ฌ ์งํํ๋ @SpringBootTest๋ฅผ ๋ณผ ์ ์์์ต๋๋ค.
- WebMvcTest
WebMvcTest๋ Controller(API) Layer๋ง์ ํ ์คํธํ๊ธฐ ์ ํฉํ ํ ์คํธ ์ด๋ ธํ ์ด์ ์ผ๋ก ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๊ฒ์ด ์๋ Controller๋ง์ ๋ก๋ํ์ฌ ํ ์คํธ๋ฅผ ์งํํ ์ ์๋ ์์ฃผ ์ผ๋ชฉ์์ฐํ ํ ์คํธ ๋ฐฉ๋ฒ - SpringBootTest
SpringBootTest๋ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ์ ๋ก์ปฌ ์์ ์ฌ๋ ค์ ํฌํธ ์ฃผ์๊ฐ Listening ๋์ด์ง๊ณ , ์ค์ Database์ ์ปค๋ฅ์ ์ด ๋ถ์ด์ง๋ ์ํ์์ ์งํ๋๋ Live ํ ์คํธ ๋ฐฉ๋ฒ
์ธ๋ป๋ณด๋ฉด ๋ ํ ์คํธ๊ฐ์ ์ฐจ์ด๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋์ด๋ค๋ ์ ๊ณผ ์ผ๋ถ Controller๋ง์ ๋์ด๋ค๋ ์ ์ผ๋ก ๋ณด์ฌ์ง๋๋ฐ, ๋ชฉ์ ์ผ๋ก๋ง ๋ณธ๋ค๋ฉด ์ด ์ ์ด ๊ฐ์ฅ ํต์ฌ์ด๋ฉฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ท๋ชจ๊ฐ ์ปค์ง๊ฒ ๋๋ ๊ฒฝ์ฐ ํ ์คํธ ์๊ฐ์ด ๊ทธ๋งํผ ๊ธธ์ด์ง๊ธฐ ๋๋ฌธ์ ์ ๊ท ๊ธฐ๋ฅ์ด๋ ๋ฒ๊ทธ ํจ์น ๋ฑ ์ผ๋ถ ๊ธฐ๋ฅ๋ง์ ํ ์คํธํ๊ณ ์ ํ ๋๋ WebMvcTest๊ฐ ์ ๋นํ๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค.
์ด ์ธ์๋ Data I/O๋ง์ ํ ์คํธํ ์ ์๋ ๋ฐฉ๋ฒ๋ ์กด์ฌํฉ๋๋ค.
https://docs.spring.io/spring-boot/docs/1.4.2.RELEASE/reference/html/boot-features-testing.html
์ ํ๋ฆฌ์ผ์ด์ ์์ DB์ ์ฐ๊ฒฐ์ Spring Data JPA๋ก ํ๊ณ ์๋ค๋ฉด DataJpaTest๋ ์ด์ ์ ํฉํ ์ ํ์ ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ์คํํ์ง ์๊ณ , Transaction ์ฝ๋์ EntityManager๋ง์ ์ด์ฉํด Database์ ํธ๋์ญ์ ์ด ์๋๋์ง๋ฅผ ๋ณด๊ธฐ ์ํ ์ ์ฉ ํ ์คํธ์ ๋๋ค.
How to use
๋ ์์ธํ ์ด์ผ๊ธฐ๋ ๋ค์ ํฌ์คํธ์์ ๋ค๋ค๋ณผ ์์ ์ด์ง๋ง ๊ฐ๋จํ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
gradle์์ Spring boot test ๋ชจ๋์ ์ถ๊ฐํด์ค๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Spring boot์์ ๋ง๋ค์ด์ฃผ๋ ํ ์คํธ ์ฝ๋๋ ์์ ๊ฐ์ต๋๋ค. @SpringBootTest๋ ์์์ ๋งํ๋๋๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ง์ ๊ตฌ๋ํด์ ํ ์คํธ๋ฅผ ์งํํ๋ ๋ผ์ด๋ธ ํ ์คํธ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ฌ์ฉํ Controller(API)๋ฅผ ๋ง๋ ๋ค์ ์ด๋ฅผ ํ ์คํธ ์ฝ๋์ ์์กด์ฑ ์ฃผ์ ํ์ ๋ ์ ์์ ์ผ๋ก ๊ตฌ๋๋๋์ง ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
ํ์ด์ง์ hello๋ฅผ ์ถ๋ ฅํด์ฃผ๋ HelloController๋ฅผ ํ ๊ฐ ๋ง๋ค์ด์ค๋๋ค.
๊ทธ๋ฐ ๋ค์ HelloController๋ฅผ IoC์์ ์ฃผ์ ๋ฐ๋ ํํ๋ก ์ฝ๋๋ฅผ ๊ตฌํํ ๋ค์ ์ด๊ฒ์ด ์ ๋๋ก ๋ฐ์์ง๋์ง๋ฅผ ํ์ธํ๋ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. (@SpringbootTest๊ฐ ์ ๋ง๋ก ์ปจํ ์คํธ๋ฅผ ์ฌ๋ ค์ ๋ชจ๋ ๋น์ ๊ฐ์ ธ์ค๋์ง๋ฅผ ๋ณด๊ธฐ ์ํจ์ ๋๋ค.)
์คํํด๋ณด๋ฉด, ์ ์์ ์ผ๋ก ๋์ํ๊ณ ์์์ ๋ณผ ์ ์์ต๋๋ค.
๋ ๋์๊ฐ์ PORT ์ฃผ์๋ฅผ 8080(๊ธฐ๋ณธ๊ฐ)์ด ์๋ ๋ฌด์์ํ ํฌํธ ์ฃผ์๋ก ์ค์ ํ์ฌ ํ ์คํธ ๋ฒ์๋ฅผ ๋ํ๋ณผ ์ ์๊ณ , Controller์ ํจ์๊ฐ ์ ๋์ํ๋์ง๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
์ ๋ฆฌ
๊ฐ๋จํ๊ฒ @SpringBootTest๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธ๋ฅผ ์งํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ดค์ต๋๋ค. @SpringBootTest๋ ์คํ๋ง ์ ํ๋ฆฌ์ผ์ด์ ์ ํตํฉ ํ ์คํธ๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ณธ์ ์ธ Spring boot ์ด๋ ธํ ์ด์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์์ฒด์ ์ค์ ์ ๋ฐ๊ฟ๊ฐ๊ฑฐ๋ Properties๋ฅผ ์์๋ก ๋ง๋๋ ๋ฑ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ญ ์ค์ ์ ์งํํ๋ฉด์ ์ฌ๋ฌ ๋จ์ ํ ์คํธ๋ฅผ ํ๋๋ก ๋ฌถ์ด ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด ํ ์คํธ ๋ฐฉ๋ฒ์ ๋๋ค.
์ข ๋ฅ | ์์ฝ | Bean ๋ฒ์ |
@SpringBootTest | ์ ์ฒด ํ ์คํธ ์ด๋ ธํ ์ด์ | ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ ๋ Bean ์ ์ฒด |
@WebMvcTest | Controller Layer ํ ์คํธ | MVC ๊ด๋ จ Bean (Controller, Service) |
@DataJpaTest | Jpa (DB I/O) ํ ์คํธ | JPA ๊ด๋ จ Bean (EntityManager) |
@RestClientTest | Rest API ํ ์คํธ | RestTemplate ๋ฑ ์ผ๋ถ Bean |
@JsonTest | Json ๋ฐ์ดํฐ ํ ์คํธ | Json ๊ด๋ จ ์ผ๋ถ Bean |
๊ฐ๋จํ๊ฒ ๋๊ณ ๋ณด๋ฉด, @SpringBootTest๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด Bean์ ๋ชจ๋ ๊ฐ์ ธ์ค๊ณ , ๊ทธ๋ ์ง ์์ 4๊ฐ์ ์ด๋ ธํ ์ด์ ์ ํ ์คํธ๋ฅผ ์ํ ์ผ๋ถ Bean์ ์์ง๋์ด๊ฐ ์ง์ ํด์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค. ๋ค๋ง ์ด๋ ธํ ์ด์ ๋ณ๋ก ๊ทธ๋ค๋ง์ด ์ฌ์ฉํ ์ ์๋ ํ ํ๋ฆฟ์ ์ ๊ณตํด์ค์ผ๋ก์จ ๋ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด ์ธ์๋ Spring WebFlux๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ์๋ WebFluxTest๊ฐ ๋ณ๋๋ก ์กด์ฌํ์ง๋ง ์ด๋ ์ฐจํ WebFlux๋ฅผ ๋ค๋ฃฌ ์ดํ์ ๋ณ๋๋ก ๋ค๋ค๋ณด๋ ๊ฒ์ผ๋ก ์งํํ๊ฒ ์ต๋๋ค.
๋ง์น๋ฉฐ...
๊ฐ๋จํ @SpringBootTest๊ฐ ์ด๋ค์์ผ๋ก ์งํ๋๋์ง๋ฅผ ์์๋ดค์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด๋ฅผ ๋ก๋ํ์ฌ ์ ์ฒด์ ์ธ ํ ์คํธ๋ฅผ ์งํํ๋ฉด ๋ค๋ฅธ ํ ์คํธ๋ ์๋ฏธ๊ฐ ์์ง ์์๊น ๋ผ๋ ์๊ฐ์ ๊ฐ์ง๊ณ ์์์ง๋ง ๋จ์๋ณ๋ก ํ ์คํธ๋ฅผ ์งํํจ์ผ๋ก์จ ํ ์คํธ ์๊ฐ์ ์ค์ด๊ณ , ๋ถํ์ํ ๋ฆฌ์์ค๋ฅผ ์ ์ธ์ํด์ผ๋ก์จ ๊ฐ๋ฐ ์๊ฐ์ ๋จ์ถ์ํค๋ ๊ฒ์ ๋งค์ฐ ์ค์ํ๋ค๊ณ ๋ด ๋๋ค.
ํนํ Spring ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋จํ ๋ง์ดํฌ๋ก์๋น์ค๋ณด๋ค๋ ๋ชจ๋๋ฆฌ์ค์ ์ปค๋ค๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ค๋ ํฌํจ๋ ์ ์๋๋ฐ, ๋ง์ฝ ๋จ์ ํ ์คํธ๋ฅผ ์ํด ์ ์ฒด ํ ์คํธ์ธ @SpringBootTest๋ฅผ ์ด์ฉํ๋ค๋ฉด ๋ชจ๋ Bean์ด ๋ค ๋ก๋๋๊ธฐ ๋๋ฌธ์ JVM์์ ์ด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ Heap์ ํ ๋นํ๋ ๋ฐ๊น์ง ๋ง์ ์๊ฐ์ด ์์๋๋ฏ๋ก ํ ์คํธ ๋น์ฉ์ ์ค์ด๊ณ ์ ํ๋ค๋ฉด ์ด ๋ฐฉ๋ฒ์ ๊ถ์ฅ๋๋ฆฌ์ง ์์ต๋๋ค.
๋ค์ ํฌ์คํธ์์๋ @WebMvcTest๋ก ํ ์คํธ ์ฝ๋๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Data] Spring Data JDBC๋ฅผ ์ด์ฉํ DB ์ฐ๋ (๊ธฐ๋ณธํธ) (0) | 2021.06.05 |
---|---|
[Spring Data] Spring Data module (0) | 2021.05.29 |
[Spring boot] Axon Framework ๋ง๋ณด๊ธฐ (0) | 2021.03.27 |
[Spring] Jib(์ง๋ธ)๋ฅผ ์ด์ฉํ Docker ์ด๋ฏธ์ง ๋ง๋ค๊ธฐ (2) | 2020.08.26 |
[Spring boot] Spring boot Security๋ฅผ ์ด์ฉํ OAuth2 ์ธ์ฆ ๊ตฌํ 3 - ๊ตญ๋ด ํฌํธ ์ธ์ฆ (8) | 2020.08.25 |