[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/
Testing the Web Layer
this guide is designed to get you productive as quickly as possible and using the latest Spring project releases and techniques as recommended by the Spring team
spring.io
๊ณต์ 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
40. Testing
A few test utility classes are packaged as part of spring-boot that are generally useful when testing your application. TestRestTemplate is a convenience alternative to Spring’s RestTemplate that is useful in integration tests. You can get a vanilla temp
docs.spring.io
์ ํ๋ฆฌ์ผ์ด์ ์์ 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 |