ํ ์คํธ๋ฅผ ์์์ผ ํ๋ ์ด์
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๋
์๋ ๋ฌธ์์ด์ ๊ธธ์ด๊ฐ ์ฃผ์ด์ง ์ซ์๋ณด๋ค ์์ผ๋ฉด ๊ณต๋ฐฑ ๋๋ ์ ๋ฌํ ๋ฌธ์๋ฅผ ์ฑ์๋ฃ์ด์ ๊ธธ์ด๋ฅผ ๋ง์ถฐ์ฃผ๋ ๋ชจ๋์ด ์์๋๋ฐ ๊ฐ๋ฐ์๊ฐ ํ๋ก์ ํธ๋ฅผ ๋ค ์ง์์ ์์กด์ฑ์ ๊ฐ์ง ์๋ง์ ๋ชจ๋๋ค์ด ์๋์ ๋ฉ์ถ ์ฌ๊ฑด์ด ์์
โข
"11์ค์ ์ฝ๋, ์ธํฐ๋ท์ ํจ๋์ ๋น ๋จ๋ฆฌ๋ค" ๋ด์ฉ ์ฐธ์กฐ
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
๋ณต์ฌ