-
TDD์ ๋จ์ํ ์คํธ์ ์ฐจ์ด
TDD
: ํ ์คํธ๊ฐ ์ฃผ๋ํ๋ ๊ฐ๋ฐ, ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๋ ๊ฒ- ํญ์ ์คํจํ๋ ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑ
- ํ ์คํธ๊ฐ ํต๊ณผํ๋ ํ๋ก๋์ ์ฝ๋ ์์ฑ
- ํ ์คํธ๊ฐ ํต๊ณผํ๋ฉด ํ๋ก๋์ ์ฝ๋ ๋ฆฌํฉํ ๋ง
๋จ์ํ ์คํธ(Unit Test)
: ๊ธฐ๋ฅ ๋จ์์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ- ์์ํ๊ฒ ํ ์คํธ ์ฝ๋๋ง ์์ฑํ๋ ๊ฒ
-
ํ ์คํธ ์ฝ๋ ์์ฑ์ ์ด์
- ๋น ๋ฅธ ํผ๋๋ฐฑ
- ์๋๊ฒ์ฆ
- ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ ๋ ๊ธฐ์กด ๊ธฐ๋ฅ์ด ์ ์๋๋๋ ๊ฒ ๋ณด์ฅ
-
๊ธฐ๋ณธ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ
src/main/java
๋๋ ํ ๋ฆฌ์์ ์ ํจํค์ง ์์ฑ- ์ผ๋ฐ์ ์ผ๋ก ํจ์งํค๋ช
์ ์น์ฌ์ดํธ ์ฃผ์์ ์ญ์ (
com.seohyun.book.springboot
) Application
ํด๋์ค๋ ๋ฉ์ธ ํด๋์ค@SpringBootApplication
์ผ๋ก ์คํ๋ง๋ถํธ ์๋ ์ค์ ๋ฐ ์คํ๋ง Bean ์ฝ๊ธฐ ์์ฑ ๋ชจ๋ ์๋ ์ค์ ๋จ- ํ๋ก์ ํธ์ ์ต์๋จ์ ์์นํด์ผํจ
SpringApplication.run
์ผ๋ก ๋ด์ฅ WAS ์คํ- ํฐ์บฃ ์ค์นํ ํ์ ์์
- ์คํ๋ง ๋ถํธ๋ก ๋ง๋ค์ด์ง Jar(Java ํจํค์ง ํ์ผ)๋ก ์คํํ๋ฉด ๋จ
- ์ธ์ ๋ ๊ฐ์ ํ๊ฒฝ์์ ์คํ๋ง ๋ถํธ๋ฅผ ๋ฐฐํฌํ ์ ์์
Controller
@RestController
- JSON์ ๋ฐํํ๋ ์ปจํธ๋กค๋ฌ
@GetMapping
- HTTP Method์ธ Get ์์ฒญ์ ๋ฐ์ ์ ์๋ API ๋ง๋ค์ด์ค
-
ํ ์คํธ ์ฝ๋ ์์ฑํ๊ธฐ
@RunWith(SpringRunner.class)
- JUnit์ ๋ด์ฅ๋ ์คํ์ ์ธ์ ๋ค๋ฅธ ์คํ์๋ฅผ ์คํ์ํด
- SpringRunner๋ผ๋ ์คํ๋ง ์คํ์๋ฅผ ์ฌ์ฉํจ
- ์คํ๋ง ๋ถํธ ํ ์คํธ์ JUnit ์ฌ์ด์ ์ฐ๊ฒฐ์ ์ญํ
- JUnit5์์๋
ExtendWith()
์ ์ฌ์ฉํจ
@WebMvcTest
- Spring MVC Controllers๊ฐ ์์๋๋ก ๋์ํ๋์ง ํ ์คํธํ ๋ ์ฌ์ฉ
- ํน์ ์ด๋
ธํ
์ด์
์ ๊ฐ์ง Beans๋ง ์ค์บํจ
- Web์ ์ง์คํ ์ ์๋ ์ด๋ ธํ ์ด์
@Controller
,@ControllerAdvice
,@JsonComponent
๋ฑ
@Autowired
- ์คํ๋ง DI์ ์ฌ์ฉ๋๋ ์ด๋ ธํ ์ด์
- ์คํ๋ง์ด ๊ด๋ฆฌํ๋ Bean์ ์ฃผ์ ๋ฐ์
private MockMvc mvc
- ์น API ํ ์คํธ ์์ ์ฌ์ฉํ๋ฉฐ GET, POST ๋ฑ์ ๋ํ API ํ ์คํธ ๊ฐ๋ฅ
mvc.perform(get("/hello"))
/hello
์ฃผ์๋ก HTTP GET ์์ฒญ์ ๋ณด๋- ์ฒด์ด๋์ผ๋ก ์ฌ๋ฌ ๊ฒ์ฆ์ ์ด์ด์ ์ ์ธํ ์ ์์
.andExpect(status().isOk()
- HTTP Header์ Status๋ฅผ ๊ฒ์ฆํจ
.andExpect(content().string(hello))
- response ๋ณธ๋ฌธ์ ๋ด์ฉ์ ๊ฒ์ฆํจ
-
๋กฌ๋ณต (Lombok)์ผ๋ก ํ ์คํธ ์ฝ๋ ์ ํํ๊ธฐ
- Getter, Setter, ๊ธฐ๋ณธ์์ฑ์, toString ๋ฑ์ ์ด๋ ธํ ์ด์ ์ ์๋ ์์ฑํด์ค
implementation('org.projectlombok:lombok')
@Getter()
- ์ ์ธ๋ ๋ชจ๋ ํ๋์ get ๋ฉ์๋๋ฅผ ์์ฑํด์ค
@RequiredArgsConstructor
- ์ ์ธ๋ ๋ชจ๋ final ํ๋๊ฐ ํฌํจ๋ ์์ฑ์๋ฅผ ์์ฑํด์ค
- final์ด ์๋ ํ๋๋ ์์ฑ์์ ํฌํจ๋์ง ์์
@assertThat()
- assertj๋ผ๋ ํ ์คํธ ๊ฒ์ฆ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฒ์ฆ ๋ฉ์๋
- ๊ฒ์ฆํ๊ณ ์ถ์ ๋์์ ๋ฉ์๋ ์ธ์๋ก ๋ฐ์
- ๋ฉ์๋ ์ฒด์ด๋ ์ง์
@isEqualTo()
- assertj์ ๋๋ฑ ๋น๊ต ๋ฉ์๋
- assertThat์ ์๋ ๊ฐ๊ณผ isEqualTo์ ๊ฐ์ ๋น๊ตํด์ ๊ฐ์๋๋ง ์ฑ๊ณต
- assertj์ ์ฅ์
- ์ถ๊ฐ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์์์
- IDE์์ ์๋์์ฑ ์ง์ ํธ์์ฑ
-
์ถ๊ฐ๋ก ์ค์ ํ ๋ด์ฉ๋ค
- Gradle 7.x ๋ฒ์ ์์ Lombok ์ฌ์ฉํ๊ธฐ
- ์ฑ ์ Gradle 4๋ฒ์ ์ ์ฌ์ฉํ๊ณ ์์ด์ ์ฑ ๋๋ก ์ค์ ํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
- ๋ฒ์ ์ ๋ฎ์ถ๊ธด ์ซ์ผ๋, 7๋ฒ์ ๋์์ Lombok ์ฌ์ฉ๋ฒ์ ์ถ๊ฐ๋ก ๊ณต๋ถํจ
build.gradle
์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํจdependencies { compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testCompileOnly 'org.projectlombok:lombok' testAnnotationProcessor 'org.projectlombok:lombok' }
- JUnit ํ
์คํธ๋ช
์ด ์๋์ค๋ ๋ฌธ์ ํด๊ฒฐํ๊ธฐ
- Settings - Build, Execution, Deployment - Build tools - Gradle - Run tests using "IntelliJ IDEA"๋ก ์ค์
- Gradle 7.x ๋ฒ์ ์์ Lombok ์ฌ์ฉํ๊ธฐ