Search
โš’๏ธ

TDD, BDD, Clean Code, Refactoring

๐Ÿง‘๐Ÿผโ€๐Ÿš€ ํ…Œ์ŠคํŠธ๋ฅผ ์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ 

โ—TDD๋ผ๋Š” ๋ง์„ ๋“ค์–ด๋ด์„œ ์ ์šฉํ•ด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด? โ—ํด๋ฆฐ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ธฐ์ค€์„ ์žก์•„๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด? โ—๋ฆฌํŒฉํ„ฐ๋ง์€ ์–ธ์ œ, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ์ข‹์„์ง€ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด?

๐Ÿ™‹๐Ÿปโ€โ™‚๏ธ ์ด ๋ฌธ์„œ๋ฅผ ๋ณด๊ณ  ๋‚˜๋ฉด

TDD๋กœ ๊ฐ„๋‹จํ•œ counter ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํด๋ฆฐ์ฝ”๋“œ๋กœ ๋‚˜์•„๊ฐ€๊ธฐ ์œ„ํ•œ ๋ฆฌํŒฉํ„ฐ๋ง ๊ธฐ์ค€์ ์„ ์Šค์Šค๋กœ ๋งŒ๋“ค์–ด ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

1. TDD(Test Driven Development)

TDD๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  ๊ทธ ํ›„ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. TDD๋Š” ์ผ„ํŠธ ๋ฐฑ(Kent Beck) ์ด ๊ฐœ๋ฐœ ํ˜น์€ ๋„๋ฆฌ ์•Œ๋ฆฐ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ํ”ํžˆ๋“ค ๊ฐœ๋ฐœ์ „์— ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์งœ๋Š”๊ฒŒ TDD๋ผ๊ณ ๋งŒ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ๊ทธ๋ณด๋‹ค ๋ณธ์งˆ์ ์ธ ์˜๋ฏธ๋Š” ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ทธ ํ•ด๋‹ต์„ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ •์ด๋ผ๋Š”๊ฒŒ TDD์˜ ๊ธฐ๋ณธ ์ทจ์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ…Œ์ŠคํŠธ๋„๊ตฌ๋Š” ๊ทธ ์ฒ ํ•™์„ ์ดํ–‰ํ•˜๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. TDD๋Š” ์ฃผ๋กœ ๊ฐœ๋ฐœ ์ฝ”๋“œ๋ฅผ ์œ ๋‹›์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ์˜ ๊ธฐ๋Šฅ์„ ๊ฒ€์ฆํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•œ ๋ชฉํ‘œ

์žฅ์ 

1.
ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ์ฝ”๋“œ์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ๋˜๋Š”๊ฐ€๋ฅผ ์ธก์ •ํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๋น„์œจ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋†’์•„์ง„๋‹ค.
2.
ํ…Œ์ŠคํŠธ ๋˜๋Š” ๊ฒƒ๋งŒ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๋ฏ€๋กœ ์ฝ”๋“œ๊ฐ€ ๋ฐฉ๋Œ€ํ•ด์ง€์ง€ ์•Š๋Š”๋‹ค.
3.
๋ฒ„๊ทธ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ์‹œ๊ฐ„ ๋‚ญ๋น„ ์ค„์—ฌ์ฃผ๊ณ , ์ฝ”๋“œ๊ฐ€ ์›ํ•˜๋Š” ๋ฐ”๋ฅผ ๋ช…ํ™•ํžˆ ๋‹ฌ์„ฑํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ํ™•์ธ

๋ฐฉ๋ฒ•

1.
ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•œ๋‹ค. ๋งŒ์กฑํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๋Š” ์ƒํƒœ์ด๋ฏ€๋กœ ํ…Œ์ŠคํŠธ๋Š” ์‹คํŒจํ•จ
2.
ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
3.
๋ฆฌํŒฉํ„ฐ๋ง: ์ค‘๋ณต์ด ๋ณด์ด๊ฑฐ๋‚˜ ๋” ๊ฐœ์„ ํ•  ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ๊ฐœ์„ ํ•œ๋‹ค.

3๋Œ€ ์›์น™ - ๋กœ๋ฒ„ํŠธ C. ๋งˆํ‹ด (๋ฐฅ ์•„์ €์”จ, ํด๋ฆฐ ์ฝ”๋”)

1.
์‹คํŒจํ•  ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์ „์—๋Š” ์•„๋ฌด๋Ÿฐ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ๋„ ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.
2.
์‹คํŒจํ•  ํ…Œ์ŠคํŠธ ๋ง๊ณ ๋Š” ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.
3.
ํ˜„์žฌ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์ฝ”๋“œ ์™ธ์—๋Š” ์ž‘์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค.

์ข‹์€ ํ…Œ์ŠคํŠธ์˜ ์กฐ๊ฑด

โ€ข
์‹คํ–‰ ์†๋„๊ฐ€ ๋นจ๋ผ์•ผ ํ•จ.
โ€ข
๋‚ด๋ถ€ ๊ตฌํ˜„(ํ…Œ์ŠคํŠธํ•˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„)์„ ๋ณ€๊ฒฝํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋ฉด ์•ˆ๋œ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค(์ž…์ถœ๋ ฅ ์œ„์ฃผ)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ž‘์„ฑ.
โ€ข
๋ฒ„๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๋งŒ๋“ค์—ˆ๋‹ค๊ณ  ๋์ด ์•„๋‹˜ ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ž˜ ์„ค์ •ํ•ด์•ผ ํ•จ.
โ€ข
ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์— ์ผ๊ด€์„ฑ์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค. ์ฝ”๋“œ๊ฐ€ ๋ณ€ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋Š” ํ•ญ์ƒ ๋™์ผ ํ•ด์•ผ ํ•œ๋‹ค.
โ€ข
์˜๋„๊ฐ€ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•œ๋‹ค.

2. BDD(Behaviour Driven Development)

BDD์—์„œ๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ž์ฒด๊ฐ€ ์š”๊ตฌ์‚ฌ์–‘์ด ๋˜๋„๋ก ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์œ ์ € ์Šคํ† ๋ฆฌ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”๋ฐ์š”. TDD์— ๋Œ€ํ•œ ์ฝ”์นญ์„ ํ•˜๋˜ BDD์˜ ์•„๋ฒ„์ง€ ๋Œ„ ๋…ธ์Šค(Dan north)๋Š” TDD์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฒฝ์— ๋งˆ์ฃผ์ณค์—ˆ์Šต๋‹ˆ๋‹ค.
1.
ํ”„๋กœ์„ธ์Šค์˜ ์–ด๋””์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์•ผ ํ•˜๋Š”๊ฐ€(Where to start in the process).
2.
๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ๋˜ ๋ฌด์—‡์„ ํ•˜์ง€ ๋ง์•„์•ผ ํ•˜๋Š”๊ฐ€(What to test and what not to test).
3.
ํ•œ ๋ฒˆ์— ์–ผ๋งˆ๋งŒํผ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋Š”๊ฐ€(How much to test in on go).
4.
ํ…Œ์ŠคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ช…๋ช…ํ•ด์•ผ ํ•˜๋Š”๊ฐ€(What to call the tests).
5.
ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ์ด์œ ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š”๊ฐ€(How to understand why a test fails).
์ด์— ๋Œ„ ๋…ธ์Šค์™€ ๊ทธ์˜ ๋™๋ฃŒ๋“ค์€ ํ•˜๋‚˜์˜ ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค์–ด ์ฑ„ํƒํ–ˆ๋Š”๋ฐ ์•„๋ž˜์™€ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค.
1.
ํŠน์ • ๊ฐ’์ด ์ฃผ์–ด์ง€๊ณ (Given)
2.
์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ(When)
3.
๊ทธ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•ด์•ผ ํ•œ๋‹ค(Then).
๋Œ„ ๋…ธ์Šค๋Š” TDD ์ฝ”์นญ์„ ํ•˜๋˜ ์‹œ์ ˆ โ€˜Testโ€™๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํŽธ์ด ์‚ฌ๋žŒ๋“ค์ด ์ข€๋” TDD์˜ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€๋  ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ–ˆ๊ณ , Test๋ผ๋Š” ๊ฐœ๋…๋ณด๋‹ค๋Š” โ€˜Behaviourโ€™๋ผ๋Š” ๊ฐœ๋…์„ ์ผ์„ ๋•Œ ํ…Œ์ŠคํŠธ ์œ ๋‹›์˜ ์˜๋„๊ฐ€ ์ข€๋” ๋ช…ํ™•ํ•ด์ง„๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ ๋Š” ๋ชจ๋“  ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋ช…์— โ€˜shouldโ€™๋ฅผ ๋„ฃ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
should๋Š” ์˜๋ฌธ๋ฒ•์—์„œ ์–ด๋–ค ํ–‰์œ„๋ฅผ ๊ธฐ๋Œ€ํ•œ๋‹ค๋Š” ์กฐ๋™์‚ฌ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋Š” ๋” ์ด์ƒ ํ…Œ์ŠคํŠธ ๋ฉ”์†Œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ๋ช…๋ช…ํ•ด์•ผ ํ•˜๋Š”์ง€ ํ˜ผ๋ž€์„ ๋Š๋ผ์ง€ ์•Š์•„๋„ ๋˜๊ณ , ์ด๋กœ์จ ํ…Œ์ŠคํŠธ ์œ ๋‹›์— ๊ธฐ๋Œ€๋˜๋Š” ํ–‰์œ„๋“ค์ด ๋ช…ํ™•ํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๊ธฐ๋Œ€ํ•˜๋Š” ํ–‰์œ„์— ๋งž์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ด๋Š” ๋ฆฌํŒฉํ† ๋ง์˜ ์ง•์กฐ๊ฐ€ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ๋ชจ๋“  ๊ตฌํ˜„ ์ฝ”๋“œ์˜ ์˜๋„ ๋˜ํ•œ ๋ช…ํ™•ํ•ด์ง‘๋‹ˆ๋‹ค.
์•ž์„œ ์ง„ํ–‰ํ•œ ๊ณ„์‚ฐ๊ธฐ ๋ฏธ์…˜์„ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์Šคํ† ๋ฆฌ

Given (์ฃผ์–ด์ง„ ํ™˜๊ฒฝ)

โ€ข
์œ ์ €์—๊ฒŒ ๊ณ„์‚ฐ๊ธฐ ํ™”๋ฉด์ด ๋ Œ๋”๋ง ๋œ ํ›„

When (ํ–‰์œ„)

โ€ข
์œ ์ €๊ฐ€ ์ˆซ์ž 4์„ ํด๋ฆญํ•œ๋‹ค.
โ€ข
์œ ์ €๊ฐ€ + ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค
โ€ข
์œ ์ €๊ฐ€ 2๋ฅผ ํด๋ฆญํ•œ๋‹ค.
โ€ข
์œ ์ €๊ฐ€ = ์„ ํด๋ฆญํ•œ๋‹ค.

Then (๊ธฐ๋Œ€๊ฒฐ๊ณผ)

โ€ข
๊ณ„์‚ฐ๊ธฐ ํ™”๋ฉด์—๋Š” 6์ด๋ผ๋Š” ์ˆซ์ž๊ฐ€ ๋ณด์—ฌ์ง„๋‹ค.
์ด๋Ÿฐ ์œ ์ €์˜ ํ–‰์œ„๋ฅผ ๊ทธ๋Œ€๋กœ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์žฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด์ฒ˜๋Ÿผ BDD๋Š” ํ–‰์œ„๋ฅผ ์ค‘์ ์œผ๋กœ ๊ธฐ์ˆ ํ•˜๋ฉด์„œ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๋Š”๊ฑด๋ฐ, ์‚ฌ์‹ค์ƒ TDD์™€ ์‚ฌ์ดํด์€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ˜น์ž๋Š” BDD๋ฅผ ์ž˜๋œ TDD๋ผ๊ณ  ํ‘œํ˜„ํ•˜๋Š”๋ฐ์š”. ๊ฒฐ๊ตญ ์ค‘์š”ํ•œ๊ฑด ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ทธ ํ•ด๋‹ต์„ ์ฐพ์•„๊ฐ€๋Š” ๊ณผ์ • ์ด๋ผ๋Š”๊ฒ๋‹ˆ๋‹ค.

3. ํด๋ฆฐ ์ฝ”๋“œ, ์ข‹์€ ์ฝ”๋“œ๋ž€

1. ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์ข‹์•„์•ผ ํ•จ

2. ๊ฐ„๊ฒฐํ•˜๊ณ  ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•ด์•ผ ํ•จ. ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด ์ฃผ์„ ์—†์ด ์ฝ”๋“œ ๋งŒ์œผ๋กœ๋„ ์˜๋„๊ฐ€ ์ถฉ๋ถ„ํžˆ ๋“œ๋Ÿฌ๋‚˜๋„๋ก ์ž‘์„ฑ

3. ๊ฐ€๋Šฅํ•˜๋ฉด ์˜์กด์„ฑ์ด ์ ์€ ์ฝ”๋“œ

โ€ข
2016๋…„์—๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ ์ฃผ์–ด์ง„ ์ˆซ์ž๋ณด๋‹ค ์ž‘์œผ๋ฉด ๊ณต๋ฐฑ ๋˜๋Š” ์ „๋‹ฌํ•œ ๋ฌธ์ž๋ฅผ ์ฑ„์›Œ๋„ฃ์–ด์„œ ๊ธธ์ด๋ฅผ ๋งž์ถฐ์ฃผ๋Š” ๋ชจ๋“ˆ์ด ์žˆ์—ˆ๋Š”๋ฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค ์ง€์›Œ์„œ ์˜์กด์„ฑ์„ ๊ฐ€์ง„ ์ˆ˜๋งŽ์€ ๋ชจ๋“ˆ๋“ค์ด ์ž‘๋™์„ ๋ฉˆ์ถ˜ ์‚ฌ๊ฑด์ด ์žˆ์Œ

4. ํ•˜๋‚˜์˜ ํ•จ์ˆ˜, ๋ฉ”์†Œ๋“œ, ํด๋ž˜์Šค๋Š” ๊ฐ๊ฐ ๋ช…ํ™•ํ•œ ํ•˜๋‚˜์˜ ์ฑ…์ž„๋งŒ ๊ฐ€์ง€๊ธฐ

โ€ข
์ ‘์†์‚ฌ ์—†์ด ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ณ ๋ฏผํ•ด๋ณด๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
โ€ข
๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ํ•œ ๋ฌธ์žฅ์œผ๋กœ ํ‘œํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฏ€๋กœ ๋ถ„๋ฆฌํ•˜์ž.

4. ๋ฆฌํŒฉํ„ฐ๋ง

์œ ๋ช…ํ•œ ๊ฐœ๋ฐœ์ž ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ๋Š” ๋ฆฌํŒฉํ„ฐ๋ง์„ ์ด๋ ‡๊ฒŒ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
์†Œํ”„ํŠธ์›จ์–ด์˜ ๊ฒ‰๋ณด๊ธฐ ๋™์ž‘์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ ์ฑ„, ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋ฒ• ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ, ๋ฆฌํŒฉํ„ฐ๋ง 2ํŒ, ํ•œ๋น›๋ฏธ๋””์–ด
์ด๋Ÿฐ ๋ฆฌํŒฉํ„ฐ๋ง์€ ์–ธ์ œํ•˜๋ฉด ์ข‹์„์ง€์— ๋Œ€ํ•ด์„œ๋Š” ๊ฐ์ž ๋‹ค๋ฅธ ๊ธฐ์ค€์ด ์žˆ์„ ์ˆ˜์žˆ๋Š”๋ฐ ๋ฆฌํŒฉํ„ฐ๋ง 2ํŒ์—์„œ ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ์˜ ๋™๋ฃŒ์ธ ๋ˆ ๋กœ๋ฒ„์ธ ์˜ ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์˜ ๋‹จ๊ณ„๋กœ ์ง„ํ–‰ํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
์ฒ˜์Œ์—๋Š” ๊ทธ๋ƒฅ ํ•œ๋‹ค.๋น„์Šทํ•œ ์ผ์„ ๋‘ ๋ฒˆ์งธ๋กœ ํ•œ๋‹ค๋ฉด(์ค‘๋ณต์ด ์ƒ๊ฒจ ๋‹นํ™ฉ์Šค๋Ÿฝ๊ฒ ์ง€๋งŒ) ๊ทธ๋ž˜๋„ ์ผ๋‹จ์€ ๊ทธ๋ƒฅ ์ง„ํ–‰ํ•œ๋‹ค.๋น„์Šทํ•œ ์ผ์„ ์„ธ ๋ฒˆ์งธ ํ•˜๋ฉด ๋ฆฌํŒฉํ„ฐ๋งํ•œ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง์„ ์ง„ํ–‰ํ•˜๊ธฐ ์ „์— ์ฒดํฌํ•  ์‚ฌํ•ญ

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค!

๋ฆฌํŒฉํ„ฐ๋ง์„ ํ•˜๋ฉด์„œ ๊ธฐ์กด์— ๋˜๋˜ ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ„ฐ๋ง์€ ๊ธฐ์กด์˜ ๋™์ž‘์€ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ์ฑ„ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง ๋Œ€์ƒ(Code Smell)

๋‚˜์œ ์ฝ”๋“œ์—์„œ๋Š” ์•…์ทจ๊ฐ€ ๋‚œ๋‹ค๊ณ  ํ•˜๊ณ  ์ด๋ฅผ Code Smell์ด๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜๋Š”๋ฐ์š”. ์ผ„ํŠธ ๋ฐฑ๊ณผ ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ๊ฐ€ 90๋…„๋Œ€ ์‚ฌ์šฉํ•ด์„œ ์œ ๋ช…ํ•ด์ง„ ์šฉ์–ด์ž…๋‹ˆ๋‹ค. ํ˜น์‹œ ์ž์‹ ์˜ ์ฝ”๋“œ, ๊ทธ๋ฆฌ๊ณ  ํŽ˜์–ด์™€ ํ•จ๊ป˜ ์ž‘์„ฑํ•˜๋Š” ์ฝ”๋“œ์—์„œ ์ด๋Ÿฌํ•œ Code Smell์ด ๋‚˜์ง€ ์•Š๋Š”์ง€ ์ฒดํฌํ•ด๋ณด์„ธ์š”.
1.
๋„ˆ๋ฌด ํฐ ํ•จ์ˆ˜๋‚˜ ํด๋ž˜์Šค
2.
์ด๋ฆ„์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ํ•จ์ˆ˜๋‚˜ ๋ณ€์ˆ˜ ์ด๋ฆ„.
3.
์ค‘๋ณต ์ฝ”๋“œ: ๊ฐ™์€ ์ผ์„ ํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—ฌ๊ธฐ์ €๊ธฐ ์‚ฐ์žฌํ•ด์žˆ์œผ๋ฉด ์ˆ˜์ •
4.
์ „์—ญ ๋ณ€์ˆ˜: ๊ฐ€๋Šฅํ•˜๋ฉด ํ•จ์ˆ˜ ๋‚ด ํ˜น์€ ๋ชจ๋“ˆ ๋‚ด์— ๋‘์ž
5.
๊ณผ๋„ํ•œ ์ฝœ๋ฐฑ. ์กฐ๊ฑด๋ฌธ ์ค‘์ฒฉ
6.
๊ณผ๋„ํ•˜๊ฒŒ ๊ธด ์‹๋ณ„์ž
๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๊ธฐ ์ „์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ถ€ํ„ฐ ์ž‘์„ฑํ•˜์ž. ํ˜„์‹ค์—์„  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—†๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋‚˜๊ธฐ๊ฐ€ ๋” ์‰ฌ์›€.

๋ฆฌํŒฉํ„ฐ๋ง ๋ฐฉ๋ฒ• ์˜ˆ์‹œ

1. ์žฌ์‚ฌ์šฉ์„ฑ์„ ์œ„ํ•œ ํ•จ์ˆ˜ ๋ถ„๋ฆฌ

function showTodos() { const todos = getTodos(); ... todos.forEach(todo => { console.log(todo); }); ... }
JavaScript
์œ„ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋ถ„๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
function logTodos(todos) { todos.forEach(todo => { console.log(todo); }); } function showTodos() { const todos = getTodos(); ... logTodos(todos); ... }
JavaScript

2. ์ค‘๊ฐ„ ๋ณ€์ˆ˜ ๋„์ž…: ์˜๋ฏธ๊ฐ€ ๋ช…ํ™•ํ•ด์ง„๋‹ค๋ฉด ๋ณ€์ˆ˜๋ช…์€ ๊ธธ์–ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

const todos = getTodos(); todos.map(todo => { if (todo.completed) { ... } })
JavaScript
const todos = getTodos(); const completedTodos = todos.filter(todo => todo.completed) if (completedTodos) { ... }
JavaScript
๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

3. ๋น ๋ฅธ ์‹คํŒจ: fast fail

๋น ๋ฅธ ์‹คํŒจ๋ฅผ ํ•˜๊ฒŒ๋” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด depth๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
if (์„ฑ๊ณต๋กœ์ง) { ... } // ์•„๋ž˜์™€ ๊ฐ™์ด ๋น ๋ฅธ ์‹คํŒจ๋ฅผ ํ•˜๋ฉด ์ฝ”๋“œ์˜ ์˜๋„์™€ ์˜ˆ์™ธ ์กฐ๊ฑด์ด ๋ช…ํ™•ํ•ด์ง€๊ณ  ๋‚˜์ค‘์— ๋ถ„๋ฆฌํ•˜๊ธฐ๋„ ์‰ฝ์Šต๋‹ˆ๋‹ค. if (์‹คํŒจ๋กœ์ง) { return } ... // ์„ฑ๊ณต ๋กœ์ง
JavaScript

4. ๋ฐ˜๋ณต๋ฌธ ๋ณด๋‹ค๋Š” ํŒŒ์ดํ”„

โ€ข
๋ฐ˜๋ณต๋ฌธ ๋ณด๋‹ค๋Š” ํŒŒ์ดํ”„๋ฅผ ์ด์šฉํ•œ ๊ฒฝ์šฐ ๋ณด๋‹ค ์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ๊ฐ€ ๋  ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
const completedTodos = []; for (const todo of todos) { if (todo.completed) { completedTodos.push(todo); } } const completedTodos = todos.filter(todo => todo.completed);
JavaScript

5. switch ๋Œ€์‹  object literal

function translateStatus(status) { switch(status) { case 'all': console.log('๋ชจ๋‘') break case 'active': console.log('ํ•ด์•ผํ•  ์ผ') break case 'completed': console.log('์™„๋ฃŒํ•œ ์ผ') break } } //์•„๋ž˜์™€ ๊ฐ™์ด object๋กœ ๊ด€๋ฆฌํ•˜๋ฉด, ์ˆ˜์ • ๋ฐ ๊ด€๋ฆฌ์— ์žˆ์–ด์„œ ๋”์šฑ ๊ฐ„ํŽธํ•ด์ง‘๋‹ˆ๋‹ค. function translateStatus(status) { const statusList = { all: '๋ชจ๋‘', active: 'ํ•ด์•ผํ•  ์ผ', completed: '์™„๋ฃŒํ•œ ์ผ' }; console.log(statusList[status]) }
JavaScript

6. ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋Š” forEach๋ณด๋‹ค๋Š” map์„ ์ด์šฉํ•ด ๋ถˆ๋ณ€ ๊ฐ์ฒด์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๊ธฐ

๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๋‹ค๋ฃฌ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™”๋ฅผ ์ถ”์ ํ•˜๊ธฐ๋„ ์‰ฝ๊ณ , ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ์„ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. forEach์˜ ๊ฒฝ์šฐ ๊ธฐ์กด ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด์— ๋ณ€๊ฒฝ์„ ๊ฐ€ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์—, forEach๋ฅผ ๋ฐ˜๋“œ์‹œ ์จ์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•˜๋Š” map์„ ํ™œ์šฉํ•ด์ฃผ์„ธ์š”~!
const menus = ['์—์Šคํ”„๋ ˆ์†Œ', '์นดํŽ˜๋ผ๋–ผ', 'ํ”„๋ผํ‘ธ์น˜๋…ธ', '๋ธ”๋ž™ํ‹ฐ']; menus.forEach((value, index) => { menus[index] += '๋””์นดํŽ˜์ธ'; }); console.log(menus); to const menus = ['์—์Šคํ”„๋ ˆ์†Œ', '์นดํŽ˜๋ผ๋–ผ', 'ํ”„๋ผํ‘ธ์น˜๋…ธ', '๋ธ”๋ž™ํ‹ฐ']; const decMenus = menus.map((value, index) => menus[index] += '๋””์นดํŽ˜์ธ'); console.log(decMenus);
JavaScript