๋ธ”๋กœ๊ทธ

  • @SpringBootTest ์‚ฌ์šฉ ํ…Œ์ŠคํŠธ ์„ฑ๋Šฅ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ต๋ณ€

    Spring ์‘์šฉํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ์— TDD๋ฅผ ์ ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์†๋„์™€ ๊ด€๋ จ๋œ ์งˆ๋ฌธ์ด ์ž์ฃผ ์ œ๊ธฐ๋œ๋‹ค. ํŠนํžˆ, @SpringBootTest๋ฅผ ์‚ฌ์šฉํ•œ ํ…Œ์ŠคํŠธ์˜ ์‹คํ–‰ ์„ฑ๋Šฅ๊ณผ ๊ด€๋ จํ•œ ๊ณ ๋ฏผ์„ ๋งŽ์ด ๋“ฃ๋Š”๋‹ค. ์ด์™€ ๊ด€๋ จ๋œ ์ธํ”„๋Ÿฐ Spring Boot TDD ๊ฐ•์˜์˜ ์งˆ๋ฌธ์ด ์˜ฌ๋ผ์™€์„œ ์‘์šฉํ”„๋กœ๊ทธ๋žจ ์ปจํ…์ŠคํŠธ(Spring application context)๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ…Œ์ŠคํŠธ์˜ ์‹คํ–‰ ์„ฑ๋Šฅ์— ๋Œ€ํ•œ ๊ฒฝํ—˜์œผ๋กœ ๋‹ต๋ณ€ํ–ˆ๊ณ  ์ด ๊ธ€์—์„œ ํ•œ ๋ฒˆ ๋” ์ •๋ฆฌํ•œ๋‹ค.

  • set DSL API

    AutoParams์˜ 10.3.1 ๋ฒ„์ „ ๋ฆด๋ฆฌ์Šค์—๋Š” ํ˜• ์•ˆ์ •์ ์œผ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•˜๋Š” set ๋ฉ”์„œ๋“œ๊ฐ€ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋๋‹ค. ์ด ๊ธ€์€ ๊ธฐ์กด ๋ฐฉ์‹๊ณผ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ set DSL์˜ ์ฐจ์ด์ ๊ณผ ์‚ฌ์šฉ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค.

  • @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์€ ๊ด€๋ จ๋œ ๊ธ€์„ ์ผ๋‹ค.

    RIP TDD

    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();
        }
    }
    
  • ์Šคํƒ€ํŠธ์—…์— ์ทจ์—…ํ•˜๊ธฐ

    ๋ฐ•์žฌ์„ฑ๋‹˜์˜ โ€˜์ตœ๊ทผ ๊ตฌ์ง, ๊ตฌ์ธ ๊ธ€์„ ๋ณด๋ฉด์„œ ๋А๋ผ๋Š” ๋‹จ์ƒโ€™์ด๋ž€ ๊ธ€์„ ์ฝ์—ˆ๋Š”๋ฐ ๋ฌด์ฒ™์ด๋‚˜ ๊ณต๊ฐํ–ˆ๋‹ค. ํŠนํžˆ ๋‹ค์Œ ๊ตฌ์ ˆ์—์„œ ์ƒ๊ฐ๋‚˜๋Š” ์ผํ™”๊ฐ€ ์žˆ์–ด์„œ ์ ์–ด๋ณธ๋‹ค.

    ๋‹ค์–‘ํ•œ ์ŠคํŽ™์„ ์Œ“๋Š” ๊ฒƒ์— ์ง‘์ค‘ํ•˜๊ธฐ ๋ณด๋‹ค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž์ฒด๋ฅผ ์ฆ๊ธฐ๋Š” ์ง„์ •์„ฑ์„ ๋ณด์—ฌ์ฃผ๋ฉด ๋” ์ข‹๊ฒ ๋‹ค. ๊ฒฝํ—˜๋„ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒฝํ—˜๋ณด๋‹ค๋Š” ํ•œ ๊ฐ€์ง€ ๊ฒฝํ—˜์ด๋ผ๋„ ๊นŠ์ด ์žˆ๋Š” ๊ฒฝํ—˜์„ ํ•˜๋ฉด ์ข‹๊ฒ ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž์ฒด์— ๋Œ€ํ•œ ์—ด์ •์€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋“œ๋Ÿฌ๋‚œ๋‹ค.

RSS ๊ตฌ๋