๋ธ๋ก๊ทธ
-
@SpringBootTest ์ฌ์ฉ ํ ์คํธ ์ฑ๋ฅ ๋ฌธ์ ์ ๋ํ ๋ต๋ณ
Spring ์์ฉํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์ TDD๋ฅผ ์ ์ฉํ๋ ๊ณผ์ ์์ ํ ์คํธ ์คํ ์๋์ ๊ด๋ จ๋ ์ง๋ฌธ์ด ์์ฃผ ์ ๊ธฐ๋๋ค. ํนํ,
@SpringBootTest๋ฅผ ์ฌ์ฉํ ํ ์คํธ์ ์คํ ์ฑ๋ฅ๊ณผ ๊ด๋ จํ ๊ณ ๋ฏผ์ ๋ง์ด ๋ฃ๋๋ค. ์ด์ ๊ด๋ จ๋ ์ธํ๋ฐ Spring Boot TDD ๊ฐ์์ ์ง๋ฌธ์ด ์ฌ๋ผ์์ ์์ฉํ๋ก๊ทธ๋จ ์ปจํ ์คํธ(Spring application context)๋ฅผ ์ฌ์ฉํ๋ ํ ์คํธ์ ์คํ ์ฑ๋ฅ์ ๋ํ ๊ฒฝํ์ผ๋ก ๋ต๋ณํ๊ณ ์ด ๊ธ์์ ํ ๋ฒ ๋ ์ ๋ฆฌํ๋ค. -
set DSL API
AutoParams์ 10.3.1 ๋ฒ์ ๋ฆด๋ฆฌ์ค์๋ ํ ์์ ์ ์ผ๋ก ๋งค๊ฐ๋ณ์๋ฅผ ์ง์ ํ๋
set๋ฉ์๋๊ฐ ์๋กญ๊ฒ ์ถ๊ฐ๋๋ค. ์ด ๊ธ์ ๊ธฐ์กด ๋ฐฉ์๊ณผ ์๋กญ๊ฒ ์ถ๊ฐ๋setDSL์ ์ฐจ์ด์ ๊ณผ ์ฌ์ฉ๋ฒ์ ์ค๋ช ํ๋ค. -
@Size ์ ๋ ธํ ์ด์ ์ฌ์ฉ ์ปฌ๋ ์ ํฌ๊ธฐ ์ง์
AutoParams๋ ์ปฌ๋ ์ ํ์ ์ธ์๋ฅผ ์์ฑํ ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 3๊ฐ์ ์์๋ฅผ ํฌํจํ๋ค. ๋ง์ ๊ฒฝ์ฐ ์ด ๊ธฐ๋ณธ ํฌ๊ธฐ๋ก ์ถฉ๋ถํ์ง๋ง, ํ ์คํธ ๋์์ ๋ฐ๋ผ ๋ ํฌ๊ฑฐ๋ ๋ ์์ ์ปฌ๋ ์ ์ด ํ์ํ ๊ฒฝ์ฐ๋ ์๋ค.
Factory<T>ํด๋์ค๋@Customization์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํด์ ์ปฌ๋ ์ ํฌ๊ธฐ๋ฅผ ์กฐ์ ํ ์ ์์ง๋ง, 10.1.1 ๋ฒ์ ๋ฆด๋ฆฌ์ค์@Size์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํด ์ปฌ๋ ์ ์ ์์ฑํ ๋ ํฌ๊ธฐ๋ฅผ ์ง์ ํ ์ ์๋ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์๋ค. -
๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์์กดํ๋ AutoParams ๊ธฐ๋ฅ ์ฌ์ฉ
Java๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ์ดํธ์ฝ๋์ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ํฌํจํ์ง ์๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ผ๋ถ ๋งค๊ฐ๋ณ์ ์ด๋ฆ์ ์์กดํ๋ AutoParams ๊ธฐ๋ฅ์ด ์ ๋๋ก ์๋ํ๋ ค๋ฉด ๋ค์ ๋ฐฉ๋ฒ ์ค ํ๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค:
-
@AutoParams ์ ๋ ธํ ์ด์
AutoParams๋ฅผ ์ฒ์ ๋ง๋ค๊ธฐ ์์ํ ๋น์, JUnit 5์
@Test๋ฉ์๋๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ์ ์๊ณ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ํ ์คํธ๋ ๋ฐ๋์@ParameterizedTest๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๊ณ ์คํดํ๋ค. ์ด๋ฐ ์ธ์ ๋๋ฌธ์@ParameterizedTest์ ํจ๊ป ์ฌ์ฉํ ์ ์๋@AutoSource์ ๋ ธํ ์ด์ ์ ๋ง๋ค์๊ณ , ์ดํ AutoParams์ ๊ธฐ๋ฅ์ ์ด@AutoSource์ ๋ ธํ ์ด์ ์ ์ค์ฌ์ผ๋ก ํ์ฅ๋์๋ค.ํ์ง๋ง ์๊ฐ์ด ์ง๋๊ณ JUnit 5 API์ ๋ํ ์ดํด๊ฐ ๊น์ด์ง๋ฉด์,
@Test๋ฉ์๋๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ์ ์๊ณ , ์ด๋ฅผ ์ง์ํ๋ ํ์ฅ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค๋ ์ ์ ์๊ฒ ๋์๋ค.์ด๋ฐ ๋ฐฐ๊ฒฝ์์ 10.0.0 ๋ฒ์ ๋ฆด๋ฆฌ์ค์์๋
@Test๋ฉ์๋์ ์ฌ์ฉํ ์ ์๋@AutoParams์ ๋ ธํ ์ด์ ์ด ์๋ก ์ถ๊ฐ๋์๋ค. -
@UseBeans ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ AutoParams์ Spring ํ ์คํธ ํตํฉ
AutoParams์ ํต์ฌ ๋ชจ๋์ Spring์ ์ ํ ์์กดํ์ง ์๋๋ค. ์ด ์ ์ AutoParams๋ฅผ ๋ค์ํ ํ๊ฒฝ์์ ๊ฐ๋ณ๊ฒ ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ๋์ง๋ง, Spring ๊ธฐ๋ฐ ํ ์คํธ์์๋ ์กฐ๊ธ ๋ถํธํจ์ ์ ๋ฐํ๊ธฐ๋ ํ๋ค.
์๋ฅผ ๋ค์ด, ํ ์คํธ ๋ฉ์๋์์ AutoParams๊ฐ ์๋์ผ๋ก ์์ฑํด์ฃผ๋ ํ ์คํธ ๋ฐ์ดํฐ์ ํจ๊ป Spring ๋น์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๊ณ ์ถ์ ๋๊ฐ ์๋ค. ํ์ง๋ง ๋ณ๋์ ์กฐ์น๋ฅผ ํ์ง ์์ผ๋ฉด AutoParams๋ Spring ๋น์ ์ง์ ์์ฑํ๋ ค๊ณ ์๋ํ๊ณ , ์ด ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
์ด ๊ธ์ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ธฐ์กด์ ๋ฐฉ์๊ณผ 10.0.0 ๋ฒ์ ๋ฆด๋ฆฌ์ค์ ์ถ๊ฐ๋
@UseBeans์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋น๊ต ์ค๋ช ํ๋ค. -
AutoParams์ ๋์ ๋ DSL(Domain-Specific Language)
AutoParams์ 10.0.0 ๋ฒ์ ๋ฆด๋ฆฌ์ค์๋ ์ฒ์์ผ๋ก DSL(domain-specific language)์ด ๋์ ๋๋ค. ์ด ๋ฒ์ ์ ์ถ๊ฐ๋ DSL์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ๋ ๋งค๊ฐ๋ณ์ ์ธ์๋ฅผ ๊ณ ์ ํ๋ ๋ช ๊ฐ์ง ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค. ์ด ๊ธ์ DSL ์ฌ์ฉ ์ฌ๋ก๋ฅผ ํ๋๋ฅผ ์๊ฐํ๊ณ ๊ธฐ์กด ๋ฐฉ์๊ณผ์ ์ฐจ์ด๋ฅผ ๋น๊ตํ๋ค.
-
์ด๋ฒคํธ์ ๋ช ๋ น
์์ฃผ ์ฌ์ฉ๋๋ ์ค๊ฐ(brokered) ๋ฉ์์ง ์ ํ์ผ๋ก ์ด๋ฒคํธ(events)์ ๋ช ๋ น(commands)์ด ์๋ค. ๋ ๋ฉ์์ง ์ ํ์ ๊ตฌํ์ ์ผ๋ถ๊ฐ ๋น์ทํ ์ ์์ง๋ง ์ผ๋ฐ์ ์ผ๋ก ์๋ก ๋ค๋ฅธ ํน์ง์ ๊ฐ๋๋ค.
-
์ธ๋ชจ์๋ Java ํจํค์ง ์ด๋ฆ ๊ด์ต
Oracle์ ์ด ํ์ด์ง์์ ๋ค์๊ณผ ๊ฐ์ด ํจํค์ง ์ด๋ฆ ๊ด์ต์ ์ ์ํ๋ค.
Companies use their reversed Internet domain name to begin their package namesโfor example, com.example.mypackage for a package named mypackage created by a programmer at example.com.
๊ด์ต ์ ์์ ์ด์ ๋ ์ด๋ ๋ค.
This works well unless two independent programmers use the same name for their packages. What prevents this problem? Convention.
์ด๊ฑด ์ ํต์ธ๊ฐ ์ ์ต์ธ๊ฐ?
-
์ปค๋ฐ ๋ฉ์์ง ์ฃผ๋ ๊ฐ๋ฐ
๋๋ ์์ ์ด ์๋ ์ฝ๋ฉ์ ํ ์๋ก ๊ณํ์ ์๊ฒ ๋๋๋ค. ์์ ๊ณํ์ ์ค์ฒํ๋๋ก ์ฌ์ฉํ๋ ๋๊ตฌ ์ค ํ๊ฐ์ง๋ ์ฝ๋๋ฅผ ์ฐ๊ธฐ ์ ์ ๋ด๊ฐ ์ด๋ค ์ฝ๋๋ฅผ ์ธ ์ง ์ปค๋ฐ ๋ฉ์์ง๋ฅผ ๋จผ์ ์์ฑํ๋ ๊ฒ์ด๋ค. ๋๊ตฐ๊ฐ์๊ฒ ์ด ๊ธฐ๋ฒ์ ์๊ฐํ ๋์ โ์ปค๋ฐ ๋ฉ์์ง ์ฃผ๋ ๊ฐ๋ฐโ์ด๋ ํํ์ ์ด๋ค.
-
์ข์ ์ฝ๋๋ ๋ฌด์์ธ๊ฐ
๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค์ด ์ข์ ์ฝ๋์ ๋ํด ์๊ธฐํ๋ค. ์ต๊ทผ ์ฝ๋ฉ ๊ฒฝํ์ด ์ ์ ํ ์ฃผ๋์ด๊ฐ ๋์๊ฒ ์ข์ ์ฝ๋๋ ์ ์ง๋ณด์ ๋น์ฉ์ ๋ฎ์ถ๋ค๊ณ ๋งํ๋ค. ๋ฐ๋ฉด ์ ํ๋ จ๋๊ณ ๊ฒฝํ ๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค๋ก๋ถํฐ๋ ๊ทธ๋ฐ ํ์ ์ ์ฐฌ ์๊ธฐ๋ฅผ ๋ฃ๊ธฐ ์ด๋ ต๋ค. ์ด๋ค ์ฝ๋๊ฐ ์ข์ ์ฝ๋์ธ๊ฐ? ์์ฆ ์ ํํ๋ ํด๋ฆฐ ์ฝ๋๊ฐ ์ข์ ์ฝ๋์ธ๊ฐ? ๋ชจ๋ฅด๊ฒ ๋ค. โ์ฝ๋โ๊ฐ ๋ญ์ง๋ ์๋ค. ๊ทธ๋ผ โ์ข์โ์ด ๋ญ์ง๋ง ๋ถ๋ช ํด์ง๋ฉด ์ข์ ์ฝ๋๋ ์ดํดํ ์ ์์ ๊ฒ ๊ฐ๋ค.
-
React์๋ 'ํจ์ํ ์ปดํฌ๋ํธ'๊ฐ ์๋ค
์ด ๊ธ์ด ์์ฑ๋๋ ์์ ์ React์๋ โํจ์ํ(functional) ์ปดํฌ๋ํธโ๊ฐ ์๋ค. ๋ด๊ฐ ๋ฏธ์ณค๋ค๊ณ ? ํ. ๋ฐ๋ก ์ฆ๋ช ํ๊ฒ ๋ค. ์ง๊ธ ๋น์ฅ ๊ณต์ ์ฌ์ดํธ์ ๋ค์ด๊ฐ์ โfunctional componentโ๋ผ๋ ๋ง์ด ๋์ค๋์ง ๋์ป๊ณ ์ฐพ์๋ณด๋ผ. ํ๊ตญ์ด ์ฌ์ดํธ์ ๋ค์ด๊ฐ์ โํจ์ํ ์ปดํฌ๋ํธโ๋ผ๋ ๋ง๋ ์ฐพ์๋ณด๋ผ. ๊ฒ์ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ ๋ช ์ด๋ฉด ๋ด๊ฐ ์ ์ ์ ์ด๋ ๊ฑธ ์๊ฒ ๋ ๊ฑฐ๋ค. React๋ ํจ์ํ ์ปดํฌ๋ํธ๋ ๊ฑธ ์ ๊ณตํ์ง ์๋๋ค.
ํ์ง๋ง ๋์ ์ธํฐ๋ท ์ธ์์ React์ ๊ด๋ จํด โํจ์ํ ์ปดํฌ๋ํธโ ๋๋ โfunctional componentโ๋ผ๋ ๋ง์ด ๋์น๋ค. ๊ตญ๋ด์ ๋ฐํ๋ ๊ฐ์ข ์์ ์ญ์ ๋ง์ฐฌ๊ฐ์ง๋ค. ์ด๋ป๊ฒ ๋๊ฑฐ์ผ?
-
์ด๋ฒคํธ ์์ฑ์ ๋ณธ์ง
์ด๋ฒคํธ ์์ฑ์ ๊ทธ๋ ๊ฒ ์ด๋ ต์ง ์๋ค. ์ด๋ฒคํธ ์์ฑ ํจํด์ ๋ช ๋ น ํจํด, CQRS, EDA, DDD ๋ฑ๊ณผ ์์ฃผ ํจ๊ป ์ค๋ช ๋์ง๋ง ๊ทธ๊ฒ๋ค์ ์ด๋ฒคํธ ์์ฑ๊ณผ ์กฐํฉ๋ ์ ์๋ ์ค๊ณ ๋๊ตฌ์ผ ๋ฟ ์ด๋ฒคํธ ์์ฑ์ ํต์ฌ์ด ์๋๋ค. ์ด๋ฒคํธ ์์ฑ์ ๋ณธ์ง์ ํจ์ํ ๋ฐ์ดํฐ ๊ธฐ๋ก๊ณผ ๋ณต์์ด๋ค. ์ด๋ฒคํธ ์์ฑ์ ์ฌ์ฉํ๋ ์์คํ ์ ๊ณผ๊ฑฐ์ ์ด๋ฒคํธ์ ๊ธฐ๋ฐํด ์ ๋ ฅ์ ์๋ก์ด ์ด๋ฒคํธ๋ก ๋ณํํ๋ค. ์์คํ ์ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ๋ง๋ค์ด๊ฐ๋ ๊ณผ์ ์ด ์ด๋ฒคํธ ์์ฑ์ ์ ์๋ค.
-
์ ๋ง๋ก ํ ์คํธ ๋์ญ์ด ํ์ํ๊ฐ
์ผ๋ง์ ์ฃผ๋์ด ๋๋ฃ๊ฐ ๋ด ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐํ๋ฉฐ ์ด๋ฐ ์ง๋ฌธ์ ํ๋ค.
์์กด ๋์์ ์ถ์ํ ํด์ ํ ์คํธ ๋์ญ์ ์ฌ์ฉํ๋ฉด ํ ์คํธ ์กฐ๊ฑด์ ์ค์ ํ๊ธฐ ์ฌ์ธ ๊ฒ ๊ฐ์๋ฐ ์ ์ค์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋?
์ฒ์ ๋ฐ๋ ์ง๋ฌธ์ด ์๋๋ค. ๊ทธ๋์ ๊ฐ์ ์ง๋ฌธ์ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋จธ๋ค์๊ฒ์ ์์ญ ๋ฒ์ ๋ฐ์๋ค. ํ ์คํธ ๋์ญ(test double)๋ณด๋ค ์ค์ DOC(depended-on component)๋ฅผ ์ ํธํด์ผ ํ๋ค๋ ์ฃผ์ฅ์ด ์ต๊ทผ์ ์์๋ ๊ฑด ์๋์ง๋ง ์์ง ๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค์ด ๋จ์ ํ ์คํ ์ ์ํด ํ ์คํธ ๋์ญ์ด ํ์๋ผ๊ณ ์๊ฐํ๋ค.
๋ค๋ฅธ ์ฃผ๋์ด ๋๋ฃ๊ฐ ๋ฐ๋ฌธํ๋ค.
ํ ์คํธ๋ฅผ ํธํ๊ฒ ํ๊ธฐ ์ํด ์ด์ ์ฝ๋ ์ค๊ณ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ณ์ ์ ํ์ธ๊ฐ?
-
MV* ํจํด์์ ๋ชจ๋ธ์ด๋ ๋ฌด์์ธ๊ฐ
์ด ๊ธ์ด ์ฐธ์กฐํ ๋ ๋ฌธ์์ ๋งํฌ๊ฐ ํ์ฌ ์ ์์ ์ผ๋ก ๋์ํ์ง ์๋๋ค. ๋์ ์ฌ๊ธฐ์ ๋ฐฉ๋ฌธํ๋ฉด ๋ ๋ฌธ์์ ๋ด์ฉ์ด ๋ชจ๋ ๋ด๊ธด ํ์ผ์ ํ์ธํ ์ ์๋ค.
๋๊ด์์ผ๋ก ๊ฒฐ๋ก ๋ถํฐ ์ ์ํ๋ค.
โModels represent knowledge.โ - MODELS - VIEWS - CONTROLLERS, 1979
-
๋น์ ์ ์์คํ ์ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ์ ๊ธฐ๋ฐํ๋๊ฐ
๋น์ ์ ์์คํ ์ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ์ ๊ธฐ๋ฐํ๋๊ฐ?
์ด๋ฐ ์ง๋ฌธ์ ์ข ์ข ๋ฐ๋๋ฐ ๋ ๊ทธ๋ ๊ฒ ์๊ฐํ์ง ์๋๋ค๊ณ ๋ตํ๋ค. ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ์์ ๊ธด๋ฐํ ํ๋ ฅ ์์ด๋ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ(domain-driven design)์ ์๋ฏธ์ ๊ฐ์น๊ฐ ๊ธ๊ฐํ๋๋ฐ ์ด๊ฒ ์ํํธ์จ์ด ์ ๋ฌธ๊ฐ์ ๋ ธ๋ ฅ๋ง์ผ๋ก ํด๊ฒฐ๋์ง ์๋๋ผ. ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ๋ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ์ ์ฒ ํ๊ณผ ๋ฐฉ์์ ์ด๋ ์ ๋๋ ๊ณต๊ฐ์ ๊ฐ์ ธ์ผ ํ๋ค. ๊ทธ๋ฐ๋ฐ ํ๋ก๊ทธ๋๋จธ๋ค๋ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ๋ฅผ ์ ์ดํดํ์ง ๋ชปํ๋๋ฐ ์ด๋ป๊ฒ ๋น์ฆ๋์ค ์กฐ์ง์ ์ค๋ํ ๊ฒ์ธ๊ฐ?
-
ํ์ค ์ธ์์ TDD
ํ์ค ์ธ์์์ TDD๋ ๊ฐ๋ฅํ์ง ์๋ค๊ฑฐ๋ ํจ์จ์ด ๋๋ฌด ๋จ์ด์ ธ ์ธ๋ชจ์๋ค๋ ์ฃผ์ฅ์ ์ง๊ฒน๋๋ก ๋ค์ด์์ง๋ง ์ฌ์ ํ ์ํ๊น๋ค. ๋๋ 2018๋ ์ ์ด๋ฐ ๋ต๋ตํจ์ ์กฐ๊ธ์ด๋ผ๋ ํ์ด๋ณด๊ณ ์ ํ์ด์ค๋ถ์ ํตํด 5๊ฐ์๊ฐ ์ฝ 60๋ช ์ ๋์์ผ๋ก โTDD ์ฐธ๊ดโ์ด๋ผ๋ ํ์ฌ๋ฅผ ์งํํ๋ค.
-
TDD๋ ์ค๊ณ ๋ฐฉ๋ฒ๋ก ์ด ์๋๋ค
์์ ๋ฏธ๋์ด์์ ๊ตญ๋ด ์ ์์ ์ด๋ค ์์ ์์ ๋ฐ์ทํ๋ค๋ ๋ค์ ๋ฌธ์ฅ์ ๋ฐ๊ฒฌํ๋ค.
TDD๋ ์ค๊ณ๋ฅผ ์ํ ๊ธฐ๋ฒ์ด๋ค.
๋๋ ๊ทธ ์ฑ ์ ์ฝ์ง ์์๊ธฐ ๋๋ฌธ์ ์ ํ ๋งฅ๋ฝ์ ๋ชจ๋ฅด์ง๋ง ๋ง์ฝ ์ด ๋ฌธ์ฅ์ ํตํ ์๊ฐ์ ์๋๊ฐ TDD(Test-Driven Development)๋ฅผ ์ค๊ณ ๋ฐฉ๋ฒ๋ก ์ด๋ผ๊ณ ๋งํ๋ ๊ฒ์ด๋ผ๋ฉด ๊ทธ ์ํํ ์๊ฐ์ ์์ด์น ์๊ณ ๋ฐ๋ํ๊ฒ ๋ค. ๋๋ TDD๋ฅผ ์ฆ๊ฒจ ์ฌ์ฉํ์ง๋ง TDD๊ฐ ์ ๋ชป ์ฌ์ฉ๋์ด ํ๋ก์ ํธ๋ ์ ํ์ ๋์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ ๋ฐ๋ผ์ง ์๋๋ค.
-
์ฝ๋ฉ ์ํ๊ณผ TDD
๊ตฌ์ง ๊ณผ์ ์ ์ฝ๋ฉ ์ํ์ด ์์๋ค. ๋ฉด์ ๊ด์ ์ปดํจํฐ์ ์์ฌ์์ ์ปดํจํฐ๊ฐ ์ฝ๋ฉ ์ํ ๋๊ตฌ๋ก ์ฐ๊ฒฐ๋์ด ๋ฉด์ ๊ด์ด ์์์์ ์ฝ๋ฉ์ ์ง์ผ๋ณด๊ฑฐ๋ ๊ฐ์ ํ ์ ์๋ ํ๊ฒฝ์ด์๋ค. ์ด๋ค ๋ฌธ์ ์ ๋ต ์ฝ๋๋ฅผ ์ฐ๋ค 10์ค ์ด์์ด ๋๋ ์์ ๊ฐ์ด ๋จ์ด์ ธ TDD๋ฅผ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค. ์ฌ๊ธฐ์ ๋๋ ํฅ๋ฏธ๋ก์ด ๊ฒฝํ์ ํ๋ค.
-
์ํํธ์จ์ด ํ ์คํ ์ False Positive
False Positive๋ ์ด์ง ๋ถ๋ฅ(binary classification) ์คํ ์ค๋ฅ ์ค ํ๋๋ก ํต๊ณ ์คํ์์๋ 1์ข ์ค๋ฅ(Type I Error)๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ ์ํํธ์จ์ด ํ ์คํ ์์๋ ์ฐ์ด๋ ์ฉ์ด๋ค. ํ์ง๋ง ์ด์ง ๋ถ๋ฅ์ ํต๊ณ ์คํ์ ๋ํ ๋ฐฐ๊ฒฝ์ง์์ด ์๋ ๊ฒฝ์ฐ ์ํํธ์จ์ด ํ ์คํ ์ False Positive๋ ๋ณธ๋์ ๋ป๊ณผ ๋ฐ๋์ ์๋ฏธ๋ก ์ ๋ชป ์ฌ์ฉ๋๊ณค ํ๋ค. ์ธ์ด๊ฐ ์ ๋ชป ์ฌ์ฉ๋๋ฉด ๋น์ฐํ ์์ฌ์ํต ์ฅ์ ๋ก ์ด์ด์ง๋ค.
-
TDD๊ฐ ํด๊ฒฐํด ์ฃผ๋ ๊ฒ๋ค
2014๋ ์ DHH๋ โTDD is dead. Long live testing.โ์ด๋ผ๋, ์ ๋ชฉ์ด ์๋๋ผ ๋ด์ฉ์ด, ๋ค์ ํฉ๋นํ ๊ธ์ ์ผ๊ณ ์ผ๋ง ํ Kent Beck์ ๊ด๋ จ๋ ๊ธ์ ์ผ๋ค.
DHH๊ฐ TDD๋ฅผ ์ฃฝ์ฌ์ TDD๋ฅผ ๋์ ํ ๋ฐฉ๋ฒ์ ์ฐพ์์ผ ํ๋ค๋ ๊ธ์ธ๋ฐ, ์ ๋๋ก ์ฝ์๋ค๋ฉด ๋๊ตฌ๋ ์ด๊ฒ์ด Kent Beck์ด TDD๋ฅผ ๋ ๋๋ค๊ณ ๋งํ๋ ๊ธ์ด๋ผ๊ณ ๋ ์๊ฐํ์ง ์์ ๊ฒ์ด๋ค. ๋ด ๊ฐ์ค์ ์ฆ๊ฑฐ๋ ๋๊ธ๋ค์ด๋ค. ์ฌ๋ฏธ์์ผ๋ ๋๊ธ๋ค๋ ํ ๋ฒ ์ฝ์ด๋ณด๊ธฐ๋ฅผ ์ถ์ฒํ๋ค.
๊ทธ๋ผ ์ค์ ๋ด์ฉ์ ๋ญ๊น? ํ๋ก๊ทธ๋๋จธ๊ฐ TDD๋ฅผ ํตํด ์ป์ ์ ์๋ ๊ฐ์น์ ๋์ด์ด ๋๋ถ๋ถ์ด๊ณ ๋๋จธ์ง ์กฐ๊ธ์ DHH์ ๋ํ ์กฐ๋กฑ์ด๋ค. ๋๋ ์ฌ๊ธฐ์ ๋์ด๋ TDD์ ํจ๊ณผ ๋ชจ๋๋ฅผ ๋๊ปด์๊ณ ๊ทธ๋์ TDD๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ์น๋ค์ด ๋์ฑ ์๋ ค์ง๊ธฐ๋ฅผ ๋ฐ๋ผ๋ ๋ง์์ ํ๊ตญ์ด๋ก ๋ฒ์ญํ๋ค. ๋ด ์์ด ์ค๋ ฅ์ ์์ฃผ ํํธ ์์ด์, ๋ ธ๋ ฅํ์ง๋ง ๋ ๊ตฌ์ ์ ์ถฉ๋ถํ ์ดํดํ์ง ๋ชปํด ์ง์ญํ๋ค. ํ์ํด ๋์ผ๋ ์ข์ ํด์ ์๊ฒฌ์ด ์๋ค๋ฉด ๋ํ์์ด๋ค. ์ดํ๋ก๋ ๋ชจ๋ ๋ด ๊ธ์ด ์๋๋ผ ๋ฒ์ญ์ด๋ค.
-
MVVM ์ํคํ ์ฒ ํจํด
MVVM(Model/View/ViewModel) ํจํด์ UI๋ฅผ ๊ฐ์ง๋ ์์ฉํ๋ก๊ทธ๋จ์ ์ํ ์ํคํ ์ฒ ํจํด(architectural pattern)์ด๋ค. MVVM ํจํด์ MVC(Model/View/Controller) ํจํด์ ๋ณํ์ผ๋ก ๋ทฐ์ ์ถ์ํ๋ฅผ ๋ง๋๋ ๊ฒ์ด ํต์ฌ์ด๋ค. ๋ทฐ์ ์ถ์ํ๋ ์ฌ์ฌ์ฉํ ์ ์๊ณ (reusable) ํ ์คํธํ๊ธฐ ์ฝ๋ค(testable). ๋ทฐ์ ์ถ์ํ๋ฅผ ํตํด ์์ฉํ๋ก๊ทธ๋จ ๊ตฌ์กฐ๋ ๋จ์ํด์ง๊ณ , ์ด์์ ์ผ๋ก, ์๊ฐ ๋์์ธ๊ณผ ํํ ๋ ผ๋ฆฌ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ตฌํํ ์ ์๋ค.
-
๋๋ ต๋ค๋ฉด ํ ์คํธ๋ฅผ ์์ฑํ๋ผ
์ผ๋ง์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋์ ๋งค๊ฐ๋ณ์
param์ ๋ํnull์ฌ๋ถ ๊ฒ์ฌ๊ฐ ํ์ํ์ง ์๊ฒฌ์ ๋ฌป๋ ๊ธ์ ๋ฐ๊ฒฌํ๋ค.public void MyCode(string param) { if (TheirCode(param)) { DoSomething(); } } -
์คํํธ์ ์ ์ทจ์ ํ๊ธฐ
๋ฐ์ฌ์ฑ๋์ โ์ต๊ทผ ๊ตฌ์ง, ๊ตฌ์ธ ๊ธ์ ๋ณด๋ฉด์ ๋๋ผ๋ ๋จ์โ์ด๋ ๊ธ์ ์ฝ์๋๋ฐ ๋ฌด์ฒ์ด๋ ๊ณต๊ฐํ๋ค. ํนํ ๋ค์ ๊ตฌ์ ์์ ์๊ฐ๋๋ ์ผํ๊ฐ ์์ด์ ์ ์ด๋ณธ๋ค.
๋ค์ํ ์คํ์ ์๋ ๊ฒ์ ์ง์คํ๊ธฐ ๋ณด๋ค ํ๋ก๊ทธ๋๋ฐ ์์ฒด๋ฅผ ์ฆ๊ธฐ๋ ์ง์ ์ฑ์ ๋ณด์ฌ์ฃผ๋ฉด ๋ ์ข๊ฒ ๋ค. ๊ฒฝํ๋ ๋๋ฌด ๋ง์ ๊ฒฝํ๋ณด๋ค๋ ํ ๊ฐ์ง ๊ฒฝํ์ด๋ผ๋ ๊น์ด ์๋ ๊ฒฝํ์ ํ๋ฉด ์ข๊ฒ ๋ค. ํ๋ก๊ทธ๋๋ฐ ์์ฒด์ ๋ํ ์ด์ ์ ์์ฐ์ค๋ฝ๊ฒ ๋๋ฌ๋๋ค.