ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ์์์ผ ํ '์ ๋ ํ ์คํธ' ์์ฑ๋ฒ
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ์์์ผ ํ '์ ๋ ํ ์คํธ' ์์ฑ๋ฒ ๊ด๋ จ
๊ฐ๋ฐ์์๊ฒ ์์ด ํ ์คํธ ์ฝ๋๋ ์ ํ ์์ ์ฑ์ ์ฌ๋ ค์ฃผ๊ณ , ๋ฒ๊ทธ๋ฅผ ์ฌ์ ์ ์ก์์ค ์ ์๋ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ง์ ๊ฐ๋ฐ์ ํ๋ค ๋ณด๋ฉด ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ์ฌ์ ๊ฐ ๋ง์ง ์์ต๋๋ค. ์ค์ํ๋ค๊ณ ํ๋ฉด์๋ ์ ์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ์๊ฐ์ ๋ง์ด ์ฃผ์ด์ง์ง ์์ฃ . ๊ทธ๋์ ๊ฐ๋ ์ฑ์ด ์ข๊ณ , ์ค๋ ์ ์งํ ์ ์๋ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ค์ํด์ก์ต๋๋ค.
์ ํ๋ ์ฃผ๋์ด ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ฑ์ฉ ๊ณต๊ณ (ํ ์ค๋ฑ ํฌ, ๋ฒํทํ๋ ์ด์ค, ๋ฌด์ ์ฌ, ์ปฌ๋ฆฌ, ๋ผํํ , ์ผ๋์ ๋ฑ) 30๊ฐ๋ฅผ ๋ถ์ํด ๋ณธ ๊ฒฐ๊ณผ์ธ๋ฐ์. ์๊ฒฉ ์๊ฑด์ ์ดํด๋ณด๋ฉด ๋ฆฌ์กํธ๊ฐ ๋ทฐ์ ๋นํด ์ฝ 3๋ฐฐ ์ ๋ ๋ง์๊ณ , ๊ทธ ์ธ์๋ ํ์ ์คํฌ๋ฆฝํธ์ ๋น์ค์ด ์๋ฐ์คํฌ๋ฆฝํธ์ ๋น์ค์ ๋ค์ซ์๊ฐ๊ณ ์์ต๋๋ค. ๋ํ ๊น(Git)์ ์ฌ์ฉ ๋ฅ๋ ฅ๋ ์ ์ฐจ ์ค์ํด์ง๊ณ ์์ต๋๋ค.
์ด ์ค ์ ๊ฐ ์ฃผ๋ชฉํ ๊ธฐ์ ์ ๋ฐ๋ก ํ ์คํ ์ ๋๋ค. ํ ์คํ ๊ด๋ จ ๊ธฐ์ ์ ์ฃผ๋์ด ๊ฐ๋ฐ์๋ฅผ ๋์์ผ๋ก๋ ์๊ฒฉ ์๊ฑด ๋น์ค์ด ํฌ์ง ์์ง๋ง, ์ด์ ๊ดํ ์ดํด๋๊ฐ ์๊ฑฐ๋ ์ฌ์ฉํ ์ค ์๋ค๋ฉด ์ถฉ๋ถํ ๊ฐ์ฐ์ ์ ๋ฐ์ ์ ์์ต๋๋ค. ํ ์คํธ ์ฝ๋๋ฅผ ์ด๋ ์ ๋ ์์ฑํ ์ค ์๋ค๋ฉด, ๋ถ์กฑํ ์๊ฐ ๋๋น ๋น ๋ฅด๊ฒ ๊ฒฐ๊ณผ๋ฌผ์ ๋ง๋ค์ด๋ผ ์ ์๊ธฐ ๋๋ฌธ์ด์ฃ .
์ด๋ฒ ๊ธ์์๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ์๊ณ ์์ด์ผ ํ ํ ์คํธ ๊ธฐ๋ฒ ์ค '์ ๋ ํ ์คํธ(Unit Testing)'์ ๊ดํด ์์๋ณด๊ฒ ์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ ํ ์คํธ ํ๋ ์์ํฌ ์คํ๋์ธ 'Jest'๋ฌธ๋ฒ์ ์์๋ก ์๊ฐํฉ๋๋ค. (Jest๋ฅผ ๋ชฐ๋ผ๋ ๋ด์ฉ์ ์ดํดํ๋ ๋ฐ ํฐ ๋ฌธ์ ๋ ์์ง๋ง, ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ์ ์๊ณ ์๋ค๋ฉด ๋์ฑ ์ฌ๋ฐ๊ฒ ์ฝ์ผ์ค ์ ์์ต๋๋ค.)
์ ๋ ํ ์คํธ๋?
๊ฐ๋ฐ์๊ฐ ํ ์ ์๋ ํ ์คํธ์๋ ์ฌ๋ฌ ์ข ๋ฅ๊ฐ ์์ต๋๋ค. ๋ฒํผ์ ๋๋ ์ ๋ ๋ชจ๋ฌ์ด ํ๋ฉด์ ๋ณด์ด๋์ง ์ธก์ ํ๋ ์ปดํฌ๋ํธ ํ ์คํธ, ์ฝ๋๋ฅผ ์์ ํ ํ ํ๋ฉด์ UI๊ฐ ๊ทธ๋๋ก ๋ณด๋ ์๊ฐ(Visual) ํ ์คํธ, ์ฌ์ฉ์๊ฐ ์ง์ ์ฌ์ดํธ๋ฅผ ํ๋ฐฉํ๋ ๊ฒ์ฒ๋ผ ์ ํด์ง ์ถ๋ฐ์ ๋ถํฐ ์ข ๋ฃ ์ง์ ๊น์ง ์ฝ์๋ ํ๋์ ํ๋์ง ๊ฒ์ฌํ๋ ์ข ๋จ ๊ฐ(End-to-End) ํ ์คํธ ๋ฑ์ด ์์ฃ .
์ด ๋ชจ๋ ํ ์คํธ์ ๋ณธ์ง์ '๊ฒ์ฆํ๊ณ ์ถ์ ๋ฌด์ธ๊ฐ๋ฅผ ๊ฒ์ฆํ๋ ๊ฒ'์ด๊ณ , ๊ฒ์ฆํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ๋ถ๋ฆฌ๋ ์ด๋ฆ์ด ๋ค๋ฆ ๋๋ค. ๊ทธ์ค ์ ๋ ํ ์คํธ(Unit Testing)๋ ํน์ ๋ชจ๋์ด ๋ชฉํํ ๊ธฐ๋ฅ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ํํ๊ณ ์๋์ง ๊ฒ์ฆํ๋ ์ ์ฐจ์ ๋๋ค. ์ฆ, ๋ชจ๋ ํจ์์ ๋ฉ์๋์ ๋ํ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ ์ ์ฐจ๋ฅผ ๋งํ์ฃ .
๊ทธ๋ ๋ค๋ฉด ์ ๋ ํ ์คํธ๋ ์ ํ์ํ ๊น์? ์๋ฅผ ๋ค์ด, ์ํ ์ฑ์ ๋ง๋ค๊ณ ์๋ค๊ณ ๊ฐ์ ํด ๋ณผ๊ฒ์. ์ฌ๋ฌ๋ถ์ ๋๊ตฐ๊ฐ์๊ฒ ๋์ ์ก๊ธํ๋ ค๊ณ ํฉ๋๋ค. ๋์ ๋ณด๋ด๊ธฐ ์ ๊ณ์ข ์์ก์ ์กฐํํ๋ ๋ก์ง์ด ๋จผ์ ์คํ๋์ด์ผ ํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ด ์ ๋๋ก ๋์ํ์ง ์๋๋ค๋ฉด, ๊ณ์ข์ ์์ก์ด ๋จ์์์ง ์์๋ ์ก๊ธํ ์ ์๊ฒ ๋๋ ๋ฑ ์ํ์ ์ ๋ขฐ์ฑ์ ๋งค์ฐ ์น๋ช ์ ์ธ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๊ฒ ๋ ๊ฒ๋๋ค. ๊ทธ๋์ ํน์ ๊ณ์ข์ ์์ก์ ์กฐํํ๋ ํจ์๋ฅผ ๋ง๋ค์๊ณ , ์ด ํจ์๊ฐ ์ ๋๋ก ๋์ํ๋์ง ๊ฒ์ฆํ๋ ค๊ณ ํฉ๋๋ค. ๋งค๋ฒ ์ฑ์์ ๋ฒํผ์ ๋๋ฅด๋ฉฐ ํ ์คํธํ๊ธฐ์ ์๊ฐ์ ์ธ ์ฌ์ ๊ฐ ๋ถ์กฑํ๊ณ , ์ ๋ ํ ์คํธ๊ฐ ์ ํฉํ์ฃ . ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ํ ์คํธ๋ฅผ ํด ๋ณผ ์ ์์ต๋๋ค.
// ๊ณ์ข ๋ฒํธ๋ฅผ ๋ฐ์ ์์ก์ ์กฐํํ๋ ํจ์์
๋๋ค.
// ์ฐ๋ฆฌ๋ ์ด ํจ์๊ฐ ํญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์์ก์ ์กฐํํ๋์ง ํ์ธํ๊ณ ์ถ์ต๋๋ค.
function getBalanceOfAccount(accountNumber) {
const balance = server.getBalanceByAccount(accountNumber);
return balance;
}
function isBalanceEnough(moneyToSend, balance) {
return moneyToSend <= balance;
}
// ์ํ๋ ๊ธ์ก๋งํผ ์ก๊ธํ๊ณ ์ ํฉ๋๋ค.
function transferMoney(amount, myAccount, accountToSend) {
if (isBalanceEnough(amount, getBalanceOfAccount(myAccount))) {
// ์ถฉ๋ถํ ์์ก์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ก๊ธํฉ๋๋ค.
} else {
// โฆ
}
}
์ ๋ ํ ์คํธ ์์ฑ ์ ์์์ผ ํ ๊ฒ
1) ์ฝ๋๋ฅผ ๋ถ๋ฆฌํด ๊ด๋ฆฌํ๋ ์ด์
์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ชจ๋ ๋ด์ฉ์ ํ๋์ ํ์ผ, ํ๋์ ํจ์์ ์ ๋ถ ์์ฑํ์ง ์๋ ์ด์ ๊ฐ ๋ฌด์์ผ๊น์? ๋ง์ ๊ฒ๋ค์ด ํ๋์ ์ ๋ถ ๋ค์ด๊ฐ ์์ผ๋ฉด ์ฝ๊ธฐ๋ ํ๋ค๋ฟ๋๋ฌ, ์ฌ๋ฌ ๊ธฐ๋ฅ์ด ๋ชจ์ฌ์์ด ๊ด๋ฆฌ๊ฐ ํ๋ค์ด์ง๊ณ ๋ฉ๋ฌ์ ๋๋ฒ๊น ๋ ํ๋ค์ด์ง๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ผ์ ๋ ๋ฆฝ์ ์ธ ๊ธฐ๋ฅ ์์ฃผ๋ก ๋ถ๋ฆฌํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค๊ณ ์๋ ค์ ธ ์๊ณ , ์ด๋ฌํ ๋ด์ฉ์ ํ ์คํธ์๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
์์์ ์์๋ก ๋ฑ์ฅํ ๊ณ์ข ์์ก์ ์กฐํํ๋ getBalanceOfAccount
๋ฅผ ๋ค์ ์ดํด๋ณผ๊น์? ์ด ํจ์๋ ์ ๋ฌ๋ฐ์ ๊ณ์ข(account
)์ ์์ก๋ง์ ์กฐํํ๋ ๊ธฐ๋ฅ์ ์ํํ๊ณ ์์ต๋๋ค. ์ด ํจ์ ๋ด๋ถ์์ ์กฐํํ ์์ก์ด ํน์ ๊ธ์ก ์ด์์ธ์ง๋ฅผ ๊ฒ์ฌํ๋ isBalanceEnough
์ ๋์๊น์ง๋ ๊ฐ์ด ์ํํ๋ค๋ฉด, getBalanceOfAccount
๋ ๋ ์ด์ ๊ณ์ข์ ์์ก๋ง์ ํ์ธํ๋ ํจ์๊ฐ ์๋๊ฒ ๋ฉ๋๋ค. ์ด๋ ์ฐ๋ฆฌ๊ฐ ์์ธก ๊ฐ๋ฅํ ๋ฒ์ ๋ด์์์ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํด ์ฃผ์ง ์์์ง๋ ๋ชจ๋ฆ
๋๋ค. ๊ทธ๋์ ๊ฐ๋ฐ์๋ค์ ์ฃผ์ด์ง ์๊ตฌ์ฌํญ๋ง์ ๋ง์กฑํ๋ ๊ธฐ๋ฅ ๋จ์์ ํจ์๋ก ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ ์งํฅํ๊ฒ ๋์ฃ . ์ด๋ ๊ฒ ์ ๋ถ๋ฆฌ๋ ํจ์๋ '์์ํ๋ค'๋ผ๋ ํํ์ ๋ถ์
๋๋ค.
2) ์์ํ ์ฝ๋๋ ๋ฌด์์ผ๊น?
์ฝ๋๊ฐ ์์ํ๋ค๋ ๊ฒ์ ์ ์ ์ ๋๊ณ ๋ค๋ฌ์ด์ง ํํ์ ์ฝ๋๋ฅผ ๋งํฉ๋๋ค. ํน์ ๊ธฐ๋ฅ(์ค๋ก์ง ๊ณ์ข์ ์์ก์ ํ์ธํ๋)์ ๋ง์กฑํ๋ ์ฝ๋์ ์งํฉ์ฒด์ธ ํจ์ ์ญ์ ๊ตฌ์ฑํ์ธ ์ฝ๋๊ฐ ์์ํ๋ค๋ฉด, ํจ์ ๊ทธ ์์ฒด๋ ์์ํด์ง ์ ์๋๋ฐ์. ์ด๋ ํจ์๊ฐ ์์ํด์ง๊ธฐ ์ํด์๋ ํ์์กฐ๊ฑด์ด ์์ต๋๋ค.
์ฒซ ๋ฒ์งธ๋ก โ๋์ผํ ์ ๋ ฅ๊ฐ์๋ ๋์ผํ ๊ฒฐ๊ด๊ฐ์ด ๋ณด์ฅ๋์ด์ผ ํ๋ค.โ ๋ ๊ฒ์ ๋๋ค. ๋๋ฆฌ ์๋ ค์ง ๋ด์ฉ์ผ๋ก ํ ๋ฒ์ฏค์ ๋ค์ด๋ดค์ ๊ฒ ๊ฐ์๋ฐ์. ์ํ์ผ๋ก ๋น๋์ด ๋ณด๋ฉด ์ด๋ ์ต๋๋ค. ํ๋ฉด์์ ์ขํ , ์ ๋ํ์ฌ ๋ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ ๋ฐฉ์ ์ f๋ฅผ ๋ก ํํํ ์ ์๋ค๋ฉด, ์ด๋ x์ ๋ํ ํจ์ ์ ๊ฐ์ ํญ์ ์์ ๋ณด์ฅํ๋ค๊ณ ํ ์ ์์ต๋๋ค. ๋งค์ฐ ์ ๋ช ํ ๊ตฌ์ ์ธ ๋งํผ ์์ ํจ์์ ๋ํด ๋ฐ๋์ ์์๋์ด์ผ ํ๋ ๊ฐ์ฅ ํต์ฌ์ ์ธ ๋ด์ฉ์ ๋๋ค.
// moneyToSend์ balance๋ ๋ชจ๋ ์ซ์ํ ์๋ฃ์
๋๋ค.
// ๋ ์์ ํฌ๊ธฐ๋ฅผ ๋น๊ตํ๋ ํจ์์ ์์์ ์ซ์ ๋ ๊ฐ๋ฅผ ์ ๋ฌํ๋ฉด ๊ฒฐ๊ณผ๋ ํญ์ ๋์ผํ๊ฒ ๋์ต๋๋ค.
function isBalanceEnough(moneyToSend, balance) {
return moneyToSend <= balance;
}
๋ ๋ฒ์งธ๋ โํจ์ ์ธ๋ถ ์ค์ฝํ์ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์์์ผ ํ๋ค.โ ์ธ๋ฐ์. ํจ์๊ฐ ์คํ๋๋ ์ปจํ ์คํธ(Function Context) ์์์ ๋ณ์๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๋, ํจ์ ์ธ๋ถ์ ๋ฌด์ธ๊ฐ๋ฅผ ๋ณ๊ฒฝํ๋ ์์ ์ ์ฌ์ด๋ ์ดํํธ๋ฅผ ๋ถ๋ฌ์ผ์ผํฌ ์ ์์ต๋๋ค. ํจ์ ์ธ๋ถ์ ์กด์ฌํ๋ ๊ฐ์ ๋ณ๊ฒฝํ๊ฒ ๋ ๊ฒฝ์ฐ, ๊ทธ ๊ฐ์ ์ฌ์ฉํ๋ ๋ ๋ค๋ฅธ ๊ณณ์์ ์์ํ์ง ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ๋ง๋ค์ด๋ผ ์ ์์ผ๋ฏ๋ก, ํจ์ ์์ญ ์์์ ์ฃผ์ด์ง ๊ฐ๋ง ํ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.
// ์ก๊ธ์ ๋ง์น ๋ค์ ์คํํ๋ completeMoneyTransfer ํจ์๋ ์ก๊ธ์ก๊ณผ ๊ณ์ข์ ์ง์ ์์ก์ ์ธ์๋ก ๋ฐ์ต๋๋ค.
// ์ก๊ธ ํ์ ๊ณ์ข์ ์์ก์ ๋ณ๊ฒฝํ๋ ๋ก์ง์ ์ํํ๊ณ ์์ต๋๋ค.
// completeMoneyTransfer ํจ์ ์
์ฅ์์๋ account์ ์ ๋ณด๋ฅผ ํจ์ ์ธ๋ถ์์ ๊ฐ์ ธ์ค๊ณ ์๋ ๋ชจ์ต์ธ๋ฐ
// ์ด ๊ฒฝ์ฐ๋ account๋ฅผ ์ฌ์ฉํ๋ ๋ค๋ฅธ ๊ณณ์์ ์๋ํ์ง ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ ์ ์๊ธฐ์
// completeMoneyTransfer ํจ์๋ ์์ํ์ง ์๋ค๊ณ ํํํฉ๋๋ค.
function completeMoneyTransfer(moneyToSend, previousBalance) {
account.setBalanace(previousBalance - moneyToSend);
}
์ธ ๋ฒ์งธ๋ โํจ์ ์ธ๋ถ ์ค์ฝํ์ ๊ฐ์ ์ฐธ์กฐํ์ง ์์์ผ ํ๋ค.โ ์ ๋๋ค. ์ธ๋ถ ์ค์ฝํ์ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ํจ์๋ฅผ ์์ํ์ง ์๊ฒ ๋ง๋๋ ์์ธ์ด์๋ค๋ฉด, ์ด ์กฐ๊ฑด์ ๊ทธ๋ณด๋ค ์กฐ๊ธ ๋ ๊ทผ๋ณธ์ ์ธ ๋ด์ฉ์ ํด๋นํฉ๋๋ค. ํ๋ก๊ทธ๋๋ฐ์์ ์ด๋ค ๋ณ์์ ๊ฐ์ ๋ณ๊ฒฝํ๋ค๋ ๊ฒ์ ๊ทธ ๊ฐ์ ๋จผ์ ์ ๊ทผํ๋ค๋ ํ๋์ ํฌํจํฉ๋๋ค. ์๋ก์ด ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ๊ธฐ ์ํด์ ์ ํด์ง ์ฃผ์์ ์ ๊ทผํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ ํจ์๊ฐ ์์ํด์ง ์ ์๋ ์กฐ๊ฑด์ ๊ด์ ์์ ๋ฐ๋ผ๋ณด๋ ๊ฒฝ์ฐ, ํจ์์ ์์ญ ๋ฐ์์ ๋ฌด์ธ๊ฐ๋ฅผ ์ฐธ์กฐํ๋ ํ์๋ ์ฌ์ด๋ ์ดํํธ์ ๊ฐ๋ฅ์ฑ์ ๋ดํฌํ๊ฒ ๋ฉ๋๋ค.
let externalBalance = 1000;
function isBalanceEnough(moneyToSend, balance) {
return moneyToSend <= balance;
}
function transferMoney(amount, myAccount, accountToSend) {
// ์ฌ๊ธฐ์ ์ธ๋ถ ์ค์ฝํ์ externalBalance ๊ฐ์ ์ฐธ์กฐํ๊ณ ์์ต๋๋ค.
// externalBalance์ ๊ฐ์ ์ธ๋ถ์ ์ ์ธ์ด ๋์ด ์์ด ๋๊ตฌ๋ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ ์ํ์
๋๋ค.
// ์ธ๋ถ์์ ์ ์ธ๋๊ณ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฏ๋ก
// transferMoney๋ externalBalance์ ์์กดํ๊ฒ ๋๋ ์ฝ๋๊ฐ ์๊ฒผ์ต๋๋ค.
// ์ด ๊ฒฝ์ฐ ์ฌ์ด๋ ์ดํํธ์ ๊ฐ๋ฅ์ฑ์ด ๋์์ก๊ธฐ์ transferMoney๋ ์์ํ์ง ์๋ค๊ณ ํํํฉ๋๋ค.
if (isBalanceEnough(amount, externalBalance)) {
// ์ถฉ๋ถํ ์์ก์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ก๊ธํฉ๋๋ค.
// ...
} else {
// ...
}
}
๋ง์ง๋ง์ผ๋ก โํจ์ ๋ด๋ถ์์ ํจ์์ ๊ฒฐ๊ด๊ฐ์ ์ํฅ์ ์ฃผ๋ ์์ธก ๋ถ๊ฐ๋ฅํ ์์์ ๊ฐ์ ์ฌ์ฉํ์ง ์๋๋ค.โ ์ ๋๋ค. ํจ์๊ฐ ์์ํ๊ธฐ ์ํด์ ๊ฐ๋ฅํ ๋ชจ๋ ์ฌ์ด๋ ์ดํํธ์ ๊ฐ๋ฅ์ฑ์ ์ฐจ๋จํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ์ค ๋ง์ง๋ง ์กฐ๊ฑด์ ํจ์ ๋ด๋ถ์์ ์์ํ๊ธฐ ์ด๋ ค์ด ํน์ ์์ํ ์ ์๋ ๊ฐ์ ๋ง๋ค์ด, ํจ์์ ๋ฐํ ๊ฐ์ ์ํฅ์ ์ฃผ๋๋ก ํ์ง ์๋ ๊ฒ์ ๋๋ค. ํจ์ ๋ด๋ถ์์ ์์์ ๊ฐ์ ์ฌ์ฉํ๊ธฐ ์์ํ๋ฉด, ๊ฐ์ ์ ๋ ฅ๊ฐ์ ๋ฐ์์๋ ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ ์ ์๊ธฐ์ ๋์น๊ธฐ ์ฝ์ง๋ง ๋งค์ฐ ์ค์ํ ํญ๋ชฉ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
// ์ก๊ธ ์์๋ฃ ํ ์ธ ํํ์ ์ํด ์ฌ์ฉํ๋ ํจ์์
๋๋ค.
// ํ ์ธ์จ์ ๋ง๋๋ ๊ณผ์ ์์ ์์์ ๋์๋ฅผ ์์ฑํ๊ณ ์๊ณ ์ด๋ ๊ฒฐ๊ด๊ฐ์ ์ํฅ์ ์ฃผ๊ฒ ๋ฉ๋๋ค.
// ์ด๋ฌํ ๊ฒฝ์ฐ๋ calculateTransferFeeReduction ํจ์์ ๋์ผํ ์ธ์๋ฅผ ์ ๋ฌํ๋๋ผ๋
// ๊ฒฐ๊ด๊ฐ์ด ๋ฌ๋ผ์ง ์ ์์์ ๋ปํฉ๋๋ค.
function calculateTransferFeeReduction(transferAmount) {
// 1%์์ 10% ์ฌ์ด์ ๋์ ์์ฑ
const reductionRate = (<span class="token known-class-name class-name">Math.floor(<span class="token known-class-name class-name">Math.random() * 10) + 1) / 100;
return transferAmount * reductionRate;
}
์ ๋ ํ ์คํธ ์ค์ ์ฐ์ต
์์ ํจ์๊ฐ ์ธ์ ์์ํด์ง ์ ์๋์ง ํ์์กฐ๊ฑด์ ์ดํด๋ดค๋๋ฐ์. ์ด์ ์์์ ๋ฑ์ฅํ๋ ํจ์๋ฅผ ์ฌ์ฉํด, ์ ๋ ํ ์คํธ๋ฅผ ์ด๋ป๊ฒ ์์ฑํ ์ ์๋์ง ์ฐ์ตํด ๋ณด๊ฒ ์ต๋๋ค.
function getBoyscouts(students) {
return students.filter(student => student.isBoyscout);
}
๊ฐ๋จํ ํจ์๋ก ์ ๋ ํ ์คํธ ์์ฑ์ ์์ํด ๋ณด๊ฒ ์ต๋๋ค.
// ์ฑ
์ ๋ชฉ์ฐจ ์ค ์ฃผ์ ์ ํด๋นํฉ๋๋ค.
// ํ
์คํธ ์ฝ๋๊ฐ ์ด๋ค ๊ฒ์ ํ
์คํธํ๋์ง ์๋ ค์ฃผ๋ ๋ถ๋ถ์ผ๋ก ๊ฐ๋ตํ๊ฒ ์์ฑํ์
๋ ๋ฉ๋๋ค.
describe("๋ณด์ด์ค์นด์ ํ์์ ๊ตฌํ๋ ํจ์ ํ
์คํธ", () => {
// ํ
์คํธ ๋ธ๋ก์ ์ค์ฒฉ์ผ๋ก ์์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
// ์ค์ฒฉ๋ ํ
์คํธ ๋ธ๋ก์์ ๋ณด๋ค ์์ธํ ๋ด์ฉ์ ์ ์ด์ฃผ๋ ๊ฒ์ด ์ข์ต๋๋ค.
// getBoyscouts ํจ์๋ฅผ ํ
์คํธํ๋๋ฐ ๊ทธ์ค ์ด๋ค ์นดํ
๊ณ ๋ฆฌ/์ฃผ์ ์ ๋ํ ํ
์คํธ๊ฐ ๋ชจ์ฌ์๋์ง ์ ์ ์๊ฒ ๋ง์ด์์.
describe("์ฌํ์์ ๊ฒฝ์ฐ", () => {
// test, it ์ค ํ๋๋ก ์์ฑํ์ค ์ ์๊ณ ๊ฐ ํญ๋ชฉ๋น ํ๋์ ํ
์คํธ ์ผ์ด์ค๋ก ๋ฑ๋ก์ด ๋๋ ๋ถ๋ถ์
๋๋ค.
// ์ด ๋ถ๋ถ์ "A๋ฅผ ๋ง์กฑํ๋ฉด B๋ฅผ ๋ฐํํ๋ค"์ ๊ฐ์ด ํ๋์ ๊ธฐ๋ฅ๋ง์ ๋ช
ํํ๊ฒ ์์ฑํด ์ฃผ์๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
it("๋ณด์ด์ค์นด์์ ๊ฐ์
ํ ํ์์ ๋ชฉ๋ก์ ๋ฐํํ๋ค.", () => {
// ํ
์คํธ๋ Given-When-Then์ ์์๋ฅผ ๋ฐ๋ผ ์์ฑํ์๋ ๊ฒ์ ์ถ์ฒ๋๋ฆฝ๋๋ค.
// ๋จ๊ณ๋ณ๋ก ๋ชฉ์ ์ด ์์ด ์ฝ๋ ๊ฐ๋
์ฑ์ ์ฌ๋ฆด ์ ์๊ณ ์ ์ง ๋ณด์์ฑ์ ์ฆ๊ฐ์ํต๋๋ค.
// Given - ํ
์คํธ์ ์ฌ์ฉํ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ ๋จ๊ณ์
๋๋ค.
const students = [...];
// When - ์ ์ธํ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํด ํ
์คํธ ๋์ ํจ์๋ฅผ ์คํํฉ๋๋ค.
const boyscouts = getBoyscouts(students);
// Then - ํ
์คํธ ๋์์ด ๋๋ ํจ์๋ฅผ ์คํํ ๊ฒฐ๊ณผ๊ฐ ๊ธฐ๋ํ ๊ฒฐ๊ณผ์ ์ผ์นํ๋์ง ํ์ธํ๋ ๊ตฌ๊ฐ์
๋๋ค.
boyscouts.forEach(boyscout => {
// boyscouts์ ํฌํจ๋ ํ์์ ๋ชจ๋ isBoyscout์ด true๋ฅผ ๋ณด์ฅํด์ผ ํฉ๋๋ค.
expect(boyscout.isBoyscout).toBe(true);
});
})
})
})
๊ฐ๋จํ ์์์ง๋ง ํ ์คํธ๋ฅผ ์์ฑํด ๋ณด๋ ์ ๋ฒ ๋ง์ ๊ท์น๊ณผ ๊ฐ์ด๋๊ฐ ์์์ด ๋๊ปด์ง๋๋ค. ๊ทธ๋ ์ง๋ง ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ต์ํด์ง์๋ก ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ๋์ฑ ๋๊ฒ ๋๊ปด์ง ๊ฒ๋๋ค. ํ ์คํธ ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ์ข์์ง๋ ค๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก ํจ์๊ฐ ์์ํด์ผ ํ๋๋ฐ์. ํจ์๊ฐ ์์ํ ์๋ก ์ ๋ฌํ๋ ์ธ์์ ๋ฐํํ๋ ๊ฒฐ๊ณผ๋ฅผ ์์ ๊ฐ๋ฅํ ๋ฒ์์ ๋ ์ ์์ต๋๋ค.
๋ํ ํ ์คํธ ๊ฐ๋ ์ฑ์ ๋์ด์ฌ๋ฆฌ๋๋ฐ ์ข์ ๋ ๋ค๋ฅธ ํ์ Given-When-Then ๊ธฐ๋ฒ์ ์ฌ์ฉํด, ํ๋์ ํ ์คํธ ์ผ์ด์ค ๋ด์์ ๋ชฉ์ ์ ๋ง๋ ์์ญ ๊ตฌ๋ถ์ ๋ช ์์ ์ผ๋ก ํด์ฃผ๋ ๊ฒ์ ๋๋ค.
์ ๋ ํ ์คํธ ์์ฑ ์ ์ฃผ์ํ ์
์ง๊ธ๊น์ง ํจ์๊ฐ ์์ ํจ์๊ฐ ๋๊ธฐ ์ํ ์กฐ๊ฑด๊ณผ ์ด์ ๊ธฐ๋ฐํ ์ ๋ ํ ์คํธ๋ฅผ ์์ฑํด ๋ณด์์ต๋๋ค. ์ด๋ฒ์๋ ๋ฐ๋๋ก ํจ์๊ฐ ์์ํ์ง ์์ ๋, ํ ์คํธ ์ฝ๋์์ ์ด๋ค ๋ฌธ์ ๊ฐ ์๊ธธ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1) '๋์ผํ ์ ๋ ฅ๊ฐ์๋ ๋์ผํ ๊ฒฐ๊ด๊ฐ์ ๋ณด์ฅํจ'์ ์๋ฐํ๋ ๊ฒฝ์ฐ
๊ณ์ข ์์ก์ ์กฐํํ๋ getBalanceOfAccount
๋ฅผ ์์๋ก ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
function getBalanceOfAccount(accountNumber) {
const balance = server.getBalanceByAccount(accountNumber);
return balance;
}
getBalanceOfAccount
๋ ๊ณ์ข ์ ๋ณด๋ฅผ ์ธ์๋ก ๋ฐ์ง๋ง ์ธ๋ถ ์์คํ
(์๋ฒ)์ ์์กดํ๊ณ ์์ต๋๋ค. ์ธ๋ถ ์์คํ
์ ํด๋นํ๋ ์๋ฒ๊ฐ ์ฃผ์ด์ง ์
๋ ฅ(๊ณ์ข)์ ๋จ์ ์์ก์ ์กฐํํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํด ์ฃผ๊ณ ์์ง๋ง, ์ด ๊ฒฝ์ฐ ์ด๋ ์์ ์ ์์ก์ ์กฐํํ๋์ง์ ๋ฐ๋ผ ์์ก์ด ๋ค๋ฅด๊ฒ ์กฐํ๋ ์ ์์ต๋๋ค. ์ฆ, ๋์ผํ ์
๋ ฅ์ ๋ํด ํญ์ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ ์ ์๊ธฐ์, getBalanceOfAccount
๋ ์์ ํจ์๊ฐ ์๋๋ผ๊ณ ํ ์ ์์ต๋๋ค.
describe('์์ก ์กฐํ ํ
์คํธ', () => {
it('๊ณ์ข์ ํ์ฌ ์์ก์ ๋ฐํํ๋ค.', () => {
// Given const accountNumber = "110-xxx-2345";
// When
const balance = getBalanceOfAccount(accountNumber);
// Then
// ๊ฒ์ฆ: ํน์ ์์ ์ ์์ก์ ์์ํ ์ ์์ผ๋ฏ๋ก ์ผ๊ด๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ด๋ ต์ต๋๋ค.
// ์์ ๊ฒฐ๊ณผ๋ ์ธ๋ถ ์์คํ
์ ์ํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค.
expect(balance).toBe(/* ์ด๋ค ํน์ ๊ฐ */);
})
})
ํ
์คํธ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค. ํ
์คํธ ๋์์ด ๋๋ ํจ์๊ฐ ์์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฒ์ฆ(Then) ๋จ๊ณ์์ ๊ฒฐ๊ณผ๋ฅผ ํญ์ ์ฐธ์ด๋ผ๊ณ ๋ณด์ฅํ ์๊ฐ ์๊ฒ ๋ฉ๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด getBalanceOfAccount
์ ์ธ๋ถ ์์กด์ฑ์ ๋์ด๋ด์ผ ํฉ๋๋ค.
// accountNumber๋ฅผ ๋ฐ์ ์๋ฒ์ ์ ๋ฌํ๋ ๊ณผ์ ์ ๊ฑฐ์น์ง ์๊ณ
// ์ด๋ฏธ ์์ก ๊ณ์ข์ ์๋ฃ๋ ๊ณ์ข ์ ๋ณด๋ฅผ ๋ฐ์ ๊ทธ ์์ ์์ก๋ง์ ๋ฐํํ๋๋ก ์์ ํ์ต๋๋ค.
function getBalanceOfAccount(accountInfo) {
return accountInfo.balance;
}
์ด๋ ๊ฒ ๋ณ๊ฒฝํ๋ฉด ์ด๋ ์์ ์ ๊ณ์ข ์ ๋ณด๋ฅผ ๋ฐ์๋, ํญ์ ๋์ผํ ๊ณ์ข ์ ๋ณด์ ๋์ผํ ์์ก๋ง์ด ๋จ์์์ ํ ๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ ์ ์๊ฒ ๋ฉ๋๋ค.
2) 'ํจ์ ์ธ๋ถ ์ค์ฝํ์ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์์์ผ ํจ'์ ์๋ฐํ๋ ๊ฒฝ์ฐ
์์ ํจ์์ ๋ ๋ค๋ฅธ ์กฐ๊ฑด ์ค ํ๋์ธ ์ธ๋ถ์ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์์์ผ ํจ์ ์๋ฐํ๋ ๊ฒฝ์ฐ๋ ํ ์คํธ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
// ํ์ฌ ์ํ ๋๋น ๋ฌ๋ฌ์ ํ์จ ์ ๋ณด
let currentExchangeRate = 1200;
// ํ์จ์ ์
๋ฐ์ดํธํ๋ ํจ์์
๋๋ค.
function updateExchangeRate(newRate) {
// ์ธ๋ถ ์ค์ฝํ์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์์ต๋๋ค.
// ๊ทธ๋์ ํ์ฌ updateExchangeRate๋ ์์ ํจ์๊ฐ ์๋๋๋ค.
currentExchangeRate = newRate;
}
// ํ์ ์ ๊ณ์ฐํ๋ ํจ์์
๋๋ค.
function convertUSDToKRW(usd) {
return usd * currentExchangeRate;
}
ํ์ฌ ํ์จ์ ๋ฐ๋ฅธ ํ์ ์ ์ํํ๋ convertUSDToKRW
ํจ์๋ ์ด๋ค ๋ฌธ์ ๋ฅผ ๊ฐ๊ณ ์์๊น์? ํ์ ํ๋ ค๋ ๋ฌ๋ฌ๋ ํจ์์ ์ธ์๋ก ๋ฐ์์ค๊ณ ์์ง๋ง, ํ์จ์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์์ ํจ์ ์ธ๋ถ์ ๋ณ์์ ์ ๊ทผํ๊ณ ์์ต๋๋ค.
describe('ํ์ ํจ์ ํ
์คํธ', () => {
let currentExchangeRate = 1200;
describe("ํ์จ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ ", () => {
it("100๋ฌ๋ฌ๋ฅผ ํ์ ํ๋ฉด 120,000์์ ๋ฐ๋๋ค.", () => {
// Given
const usd = 100;
// When
const krw = convertUSDToKRW(usd);
// Then
expect(krw).toBe(120000);
})
})
describe("ํ์จ์ด ๋ณ๊ฒฝ๋ ํ", () => {
// beforeAll ์ test ๋๋ it์ผ๋ก ์์ฑ๋ ๋ชจ๋ ํ
์คํธ ์ผ์ด์ค๊ฐ ์คํ๋๊ธฐ ์ ์ ํ ๋ฒ๋ง ์คํ๋๋ ์์ญ์
๋๋ค.
beforeAll(() => {
// ํ์จ์ด 1:1200์ด์๋ ๊ฒ์ 1:1000์ผ๋ก ๋ณ๊ฒฝํ์์ต๋๋ค.
// ํ์ง๋ง convertUSDToKRW ํจ์๋ ์ด ์ฌ์ค์ ์์ง ๋ชปํ๊ณ ๋ฌธ์ ๋ ์ฌ๊ธฐ์์ ๋ฐ์ํฉ๋๋ค.
updateExchangeRate(1000);
})
// ํ
์คํธ ๋ธ๋ก์ ํด๋นํ๋ describe์์ ์ด๋ฏธ ํ์จ์ด ๋ณ๊ฒฝ๋์์์ ์๋ฆฌ๊ณ ์์ง๋ง
// convertUSDToKRW๋ ์์ง ์ด ์ฌ์ค์ ์์ง ๋ชปํฉ๋๋ค.
it("100๋ฌ๋ฌ๋ฅผ ํ์ ํ๋ฉด 100,000์์ ๋ฐ๋๋ค.", () => {
// Given
const usd = 100;
// When
const krw = convertUSDToKRW(usd);
// Then
expect(krw).toBe(100000);
})
})
})
ํ
์คํธ๋ ํต๊ณผํ์ง๋ง ์์ง ๋ฌธ์ ๊ฐ ์๋๋ฐ์. convertUSDToKRW
ํจ์๊ฐ ์ธ๋ถ ์ค์ฝํ์ ์กด์ฌํ๋ currentExchangeRate
๋ฅผ ์ฐธ์กฐํ๊ณ ์์ผ๋ฏ๋ก, ์ด ๊ฐ์ด ๋ณํ๋ฉด ์์ ์ด ๋ฐํํ๋ ๊ฒฐ๊ณผ๋ ๋ณํ ์ ์์ต๋๋ค. ๋ ๋ค๋ฅธ ํ
์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๊ณ , ์๋ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด์์ต๋๋ค.
describe('ํ์ ํจ์ ํ
์คํธ', () => {
let currentExchangeRate = 1200;
describe("ํ์จ์ด ๋ณ๊ฒฝ๋ ํ", () => {
beforeAll(() => {
currentExchangeRate = 900;
})
it("100๋ฌ๋ฌ๋ฅผ ํ์ ํ๋ฉด 90,000์์ ๋ฐ๋๋ค.", () => {
// Given
const usd = 100;
// When
const krw = convertUSDToKRW(usd);
// Then
expect(krw).toBe(90000);
})
})
describe("ํ์จ์ด ๋ณ๊ฒฝ๋๊ธฐ ์ ", () => {
// ์ด์ ์ด ํ
์คํธ๋ ์คํจํฉ๋๋ค.
it("100๋ฌ๋ฌ๋ฅผ ํ์ ํ๋ฉด 120,000์์ ๋ฐ๋๋ค.", () => {
// Given
const usd = 100;
// When
const krw = convertUSDToKRW(usd);
// Then
expect(krw).toBe(120000);
})
})
describe("ํ์จ์ด ๋ณ๊ฒฝ๋ ํ", () => {
/* ์์ ์์์ ์ฝ๋ ๋์ผ ... */
})
})
์ด์ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ก์ต๋๋ค. ์ฒซ ๋ฒ์งธ ํ ์คํธ ์ผ์ด์ค์ธ โ100๋ฌ๋ฌ๋ฅผ ํ์ ํ๋ฉด 120,000์์ ๋ฐ๋๋คโ๊ฐ ํ ์คํธ๋ฅผ ํต๊ณผํ ์ ์์๋ ์ด์ ๋ ๊ทธ ์์ ์์์ ํ์จ์ด 1,200์์ด์๊ธฐ ๋๋ฌธ์ธ๋ฐ์. ํ์ง๋ง ์๋ก์ด ํ ์คํธ ๋ธ๋ก์ด ๊ฐ์ฅ ์์์ ์์นํ๊ฒ ๋์๊ณ , ํ ์คํธ๋ ๊ฐ์ฅ ์์์ ์ ์ธ๋ ๊ฒ๋ถํฐ ์๋๋ก ์์ฐจ์ ์ผ๋ก ํ๋์ฉ ์คํํ๊ฒ ๋ฉ๋๋ค. ๋ค์ ๋งํด ์ฒซ ํ ์คํธ ๋ธ๋ก์์ ํ์จ์ 900์์ผ๋ก ๋ณ๊ฒฝ๋ ์ํ๋ก ์ฒซ ๋ฒ์งธ ํ ์คํธ ์ผ์ด์ค์ธ โ100๋ฌ๋ฌ๋ฅผ ํ์ ํ๋ฉด 90,000์์ ๋ฐ๋๋ค.โ๊ฐ ์คํ์ด ๋ฉ๋๋ค.
์ฒซ ๋ฒ์งธ ํ ์คํธ ์ผ์ด์ค๋ ํ์จ์ด 900์์ผ๋ก ๋ณ๊ฒฝ๋ ์ฌ์ค์ ์๊ณ ์์๊ธฐ์ ํต๊ณผํ ์ ์์์ง๋ง, ๋ ๋ฒ์งธ ํ ์คํธ ์ผ์ด์ค์ธ "100๋ฌ๋ฌ๋ฅผ ํ์ ํ๋ฉด 120,000์์ ๋ฐ๋๋ค."๋ผ๋ ์ฌ์ค์ ์์ง ๋ชปํ ์ฑ ํ ์คํธ๋ฅผ ์ํํ๊ฒ ๋ฉ๋๋ค. ์ด ์์ ์์์ ํ์จ ์ ๋ณด๋ 1,200์์ด ์๋ 900์์ด๋ผ์ ํ ์คํธ์ ์คํจํ๊ฒ ๋ฉ๋๋ค.
์ด์ ์ฐจ์ด์ ์ด ๋ณด์ด์๋์? ํจ์์ ๊ทผ๋ณธ์ด ๋๋ ๋ก์ง์ด ๋ณ๊ฒฝํ์ง ์์์์๋, ๋ฐํ ๊ฐ์ด ์ธ์ ๋ ์ง ๋ณ๊ฒฝ๋ ์ ์๋ค๋ ์ ์ ์์ธ์ ํจ์ ์ธ๋ถ์ ๊ฐ์ ๋ฐํ ๊ฐ์ ์ํฅ์ด ์ฃผ๋๋ก ๊ด๊ณ๋ฅผ ๋งบ์ด๋ฒ๋ ธ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ๋งค์ฐ ์น๋ช ์ ์ธ ๊ฒฐํจ์ผ๋ก, ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๋ค๋ฉด ๋น ๋ฅด๊ฒ ์์ ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋จผ์ , convertUSDToKRW
ํจ์๋ฅผ ์์ ํด์ผ ํฉ๋๋ค. ๋ ์ด์ ์ธ๋ถ์ ๊ฐ์ ์ฐธ์กฐํ์ง ์๊ณ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํ์จ์ ์ฐธ์กฐํ๋๋ก ๋ณ๊ฒฝํด ์ฃผ๋ ์์
์ด ํ์ํฉ๋๋ค.
function convertUSDToKRW(usd, exchangeRate) {
return usd * exchangeRate;
}
๊ทธ๋ค์์ผ๋ก ํ ์คํธ๋ฅผ ์์ ํ ํ์๊ฐ ์์ต๋๋ค. ๋จผ์ ์์ฑํ ํ ์คํธ ์ฝ๋๋ ์ธ๋ถ์ ๊ฐ์ ์ฐธ์กฐํ๊ณ ์๋ ํจ์์ ๋์ ๋๋ฌธ์, ํ ์คํธ ํ๊ฒฝ ์ญ์ ๊ทธ์ ๋ง๊ฒ ๋ง๋ค์ด์ค ์๋ฐ์ ์์์ต๋๋ค. ์ด์ ๋ ํจ์ ์ธ์๋ก ์ ๋ฌํด ํ ์คํธ๋ฅผ ์งํํ ์ ์๋๋ก ๋ณ๊ฒฝํ์ผ๋, ๊ทธ์ ๋ง๊ฒ ํ ์คํธ ์ฝ๋๋ ์์ ์ด ํ์ํด์ก์ต๋๋ค.
describe('ํ์ ํจ์ ํ
์คํธ', () => {
it("100๋ฌ๋ฌ๋ฅผ 1:1200 ํ์จ๋ก ํ์ ํ๋ฉด 120,000์์ ๋ฐ๋๋ค.", () => {
// Given
const usd = 100;
const exchangeRate = 1200;
// When
const krw = convertUSDToKRW(usd, exchangeRate);
// Then
expect(krw).toBe(120000);
});
it("100๋ฌ๋ฌ๋ฅผ 1:1000 ํ์จ๋ก ํ์ ํ๋ฉด 100,000์์ ๋ฐ๋๋ค.", () => {
// Given
const usd = 100;
const exchangeRate = 1000;
// When
const krw = convertUSDToKRW(usd, exchangeRate);
// Then
expect(krw).toBe(100000);
});
it("100๋ฌ๋ฌ๋ฅผ 1:900 ํ์จ๋ก ํ์ ํ๋ฉด 90,000์์ ๋ฐ๋๋ค.", () => {
// Given
const usd = 100;
const exchangeRate = 900;
// When
const krw = convertUSDToKRW(usd, exchangeRate);
// Then
expect(krw).toBe(90000);
});
});
์ด์ ์ด๋ค ์
๋ ฅ๊ฐ์ ์ ๋ฌํด๋ ํญ์ ๊ฐ์ ๊ฐ์ ์ ์งํ๋ ํจ์๋ก ์ฌํ์ํ์ต๋๋ค. ์ถ๊ฐ๋ก convertUSDToKRW
๋ ๋์ผํ ๋ฌ๋ฌ์ ๋์ผํ ํ์จ์ ์ ๋ฌํ๋ฉด, ์ธ์ ๋ ์ง ๋ช ๋ฒ์ ํธ์ถํ๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ฒ ๋์์ต๋๋ค. ์ด๋ฌํ ํน์ฑ์ ์ํํธ์จ์ด์์๋ ๋ฉฑ๋ฑ์ฑ์ด๋ผ๊ณ ๋ถ๋ฆ
๋๋ค. (์๋์์ ๋ค์ ํ๋ฒ ์ค๋ช
ํ๊ฒ ์ต๋๋ค.)
3) 'ํจ์ ์ธ๋ถ ์ค์ฝํ์ ๊ฐ์ ์ฐธ์กฐํ์ง ์์์ผ ํจ'์ ์๋ฐํ๋ ๊ฒฝ์ฐ
ํจ์ ์ธ๋ถ ์ค์ฝํ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ๋งํผ ์ฃผ์ํด์ผ ํ ์ ์ ๋ฐ๋ก ์ธ๋ถ ์ค์ฝํ๋ฅผ ์ฐธ์กฐํ์ง ์๋ ๊ฒ์ ๋๋ค. ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ ์ญ์ ๊ทธ ๊ณผ์ ์์ ์ฐธ์กฐ๋ฅผ ํฌํจํ๊ณ ์์ง๋ง, ๊ฐ์ ๋ณ๊ฒฝํด์ผ ์ฌ์ด๋ ์ดํํธ๊ฐ ๋ฐ์ํ์ง ์์๊น ํ๊ณ ํท๊ฐ๋ฆฌ๊ธฐ ์ฝ์ต๋๋ค. ํ์ง๋ง ์ฐธ์กฐํ๋ ๊ฒ๋ง์ผ๋ก๋ ํจ์์ ์์์ฑ์ด ๊นจ์ง๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๋๋ฐ, ์ด์ ๊ด๋ จ๋ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
// ํ๊ตญ์ ์ํ์ด ํ์ฌ ์ด์ฉ ๊ฐ๋ฅํ ์๊ฐ์ธ์ง ํ์ธํ๋ ํจ์์
๋๋ค.
function isBankingHour() {
const now = new Date();
const hour = now.getHours();
// ์ค์ 9์๋ถํฐ ์คํ 5์๊น์ง ์ํ ์
๋ฌด ๊ฐ๋ฅ
return hour >= 9 && hour < 17;
}
์ด ํจ์๋ ์ธ๋ถ์ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์์ง ์์ง๋ง, ์ ์ญ ๊ฐ์ฒด(Window)์ ํฌํจ๋ Date
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด ์ญ์๋ isBankingHour
ํจ์ ์
์ฅ์์๋ ์ธ๋ถ์ ์กด์ฌํ๋ ๋ฐ์ดํฐ์ธ ์
์ด๋ ์ธ๋ถ ์ค์ฝํ์ ์ ๊ทผํ๋ค ๋ณผ ์ ์์ต๋๋ค.
describe('์ํ ์
๋ฌด ์๊ฐ ํ๋จ ํจ์ ํ
์คํธ', () => {
beforeAll(() => {
// useFakerTimer๋ setTimer, Date ๋ฑ ์๊ฐ๊ณผ ๊ด๋ จ๋ ๊ฐ์ ์์๋ก ์กฐ์ํ ์ ์๋ ๋งค์ฐ ์ ์ฉํ ํจ์์
๋๋ค.
jest.useFakeTimers();
})
describe("ํ๊ตญ์์ ์คํํ ๊ฒฝ์ฐ", () => {
beforeAll(() => {
// ํ๊ตญ ์๊ฐ๋ - ์ค์ 10์
// setSystemTime ์ ์์๋ก ์๊ฐ์ ์ค์ ํ ์ ์๋ Jest ํจ์์
๋๋ค.
// useFakeTimer ํจ์๋ฅผ ์ฌ์ฉํ๊ณ ์ด ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ ์๊ฐ๋๋ก ์กฐ์ํ ์ ์์ต๋๋ค.
jest.setSystemTime(new Date('2023-01-01T10:00:00+09:00'));
})
it("ํ๊ตญ์์๋ ํ์ฌ ์ํ์ ์ด์ฉํ ์ ์๋ค.", () => {
// Given - ์์ผ๋ฉด ์๋ต ๊ฐ๋ฅํฉ๋๋ค.
// When
const isAvailable = isBankingHour();
// Then
expect(isAvailable).toBe(true);
})
})
describe("์ ๋ฝ์์ ์คํํ ๊ฒฝ์ฐ", () => {
beforeAll(() => {
// ์ ๋ฝ ์๊ฐ๋ - ์ค์ 10์
// ํ๊ตญ์ ์คํ 6์
jest.setSystemTime(new Date('2023-01-01T10:00:00+01:00'));
})
it("์ ๋ฝ์์๋ ํ์ฌ ์ํ์ ์ด์ฉํ ์ ์๋ค.", () => {
// Given - ์์ผ๋ฉด ์๋ต ๊ฐ๋ฅํฉ๋๋ค.
// When
const isAvailable = isBankingHour();
// Then
expect(isAvailable).toBe(true);
})
})
});
์ด ํ
์คํธ๋ฅผ ๊ฐ์ด ์ดํด๋ณผ๊น์? ํ๊ตญ๊ณผ ์ ๋ฝ, ๊ฐ๊ฐ์ ์ง์ญ์ ์ค์ ํด ์ค์ 10์๋ก ๋ง์ถฐ๋๊ณ ํ
์คํธ๋ฅผ ์งํํ์ต๋๋ค. ์ด ํ
์คํธ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์งํ๋์๊น์? ๊ทธ๋ ์ง ์์ต๋๋ค. ์ฝ๋๋ ์ ์ ๋์ํ์ง๋ง isBankingHour
๋ ์ ๋ฝ์ด ์๋ ํ๊ตญ์ ์ํ ์ด์ฉ ๊ฐ๋ฅ ์๊ฐ์ ํ์ธํ๋ ํจ์์
๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ๋ฝ์์ ์ค์ 10์์ธ ๊ฒฝ์ฐ, ์ด๋ ํ๊ตญ์ ์คํ 6์๋ก ์ํ ์
๋ฌด ์๊ฐ์ด ์๋์ฃ . ๊ทธ๋์ ํ
์คํธ๋ ์คํจํ์ด์ผ ํฉ๋๋ค.
๊ทธ๋ผ์๋ ํ
์คํธ๊ฐ ํต๊ณผํ ์ ์์๋ ์ด์ ๋ isBankingHour
๋ Date ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ ์๊ณ , ์ด ๊ฐ์ฒด์ ํน์ง์ ์ฝ๋๊ฐ ์คํ๋๋ ์์คํ
์ ์๊ฐ์ ๋ฐ๋ฅด๊ฒ ๋ฉ๋๋ค. ๊ทธ๋์ ์ด๋ ์ง์ญ์์ ์คํํ๋์ ๋ฐ๋ผ ๋ค๋ฅธ ์๊ฐ๋๋ฅผ ์ป๊ฒ ๋๋ ๊ฒ์
๋๋ค. UTC ์๊ฐ๋๋ ๊ฐ์๋ ๋ง์ด์ฃ . ์ด ๋ฌธ์ ๋ฅผ ๋ฐ๋ก์ก์ผ๋ ค๋ฉด isBankingHour
ํจ์๊ฐ Date ๊ฐ์ฒด๋ฅผ ์ธ๋ถ์์ ์กฐํํ๋ ๊ฒ์ด ์๋๋ผ, ํจ์์ ์ธ์๋ก ๋ฐ๊ฒ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ํ์ํฉ๋๋ค.
function isBankingHour(currentTime) {
const hour = currentTime.getHours();
return hour >= 9 && hour < 17;
}
์ด์ ์๊ฐ์ ๋ฐ์ ๊ณ์ฐํ๋ ๋์ฑ ๋จ์ํ ํจ์๋ก ๋ฐ๋์์ผ๋, ํ ์คํธ ์ฝ๋๋ ๋ณ๊ฒฝํด ์ฃผ๋ ์ผ์ด ๋จ์์ต๋๋ค.
describe('์ํ ์
๋ฌด ์๊ฐ ํ๋จ ํจ์ ํ
์คํธ', () => {
describe("ํ๊ตญ์์ ์คํํ ๊ฒฝ์ฐ", () => {
it("ํ๊ตญ์์๋ ์ค์ 10์์ ์ํ์ ์ด์ฉํ ์ ์๋ค.", () => {
const currentTime = new Date('2023-01-01T10:00:00+09:00');
const isAvailable = isBankingHour(currentTime);
expect(isAvailable).toBe(true);
});
});
describe("์ ๋ฝ์์ ์คํํ ๊ฒฝ์ฐ", () => {
it("์ ๋ฝ์์๋ ์ค์ 10์์ ์ํ์ ์ด์ฉํ ์ ์๋ค.", () => {
// ์๊ฐ๋๋ ์ฌ์ ํ ์ ๋ฝ ์๊ฐ๋์ง๋ง
// isBankingHour๋ ์ฌ๊ธฐ์ ์๊ฐ๋ง์ ์ถ์ถํ๊ธฐ์ ์คํ 6์๋ฅผ ์ป์ด๋ผ ์ ์์ต๋๋ค.
const currentTime = new Date('2023-01-01T10:00:00+01:00');
const isAvailable = isBankingHour(currentTime);
// ํ๊ตญ ์๊ฐ์ผ๋ก ์คํ 6์์ด๋ฏ๋ก ์ํ ์
๋ฌด ์๊ฐ์ด ์๋๊ณ ๊ฒฐ๊ณผ๋ false๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค.
expect(isAvailable).toBe(false);
});
});
});
4) 'ํจ์ ๊ฒฐ๊ด๊ฐ์ ์ํฅ์ ์ฃผ๋ ์์์ ๊ฐ์ ์ฌ์ฉํ์ง ์์์ผ ํจ'์ ์๋ฐํ๋ ๊ฒฝ์ฐ
์์ ํจ์์ ํ์์กฐ๊ฑด ์ค ๋๋จธ์ง ์ธ ๊ฐ์ง ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ํจ์๋ ์ ๋ฒ ์์ํ๊ฒ ๋ณด์ด๊ฒ ๋ฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก ํจ์ ๋ด์์ ํ ๋ฒ ๋ ๊ฒ์ฆํด์ผ ํ๋ ๋ถ๋ถ์ด ์๋๋ฐ, ๋ฐ๋ก ํจ์ ๋ด๋ถ์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ ์์์ ๊ฐ์ ๋ง๋ค์ง ์๋ ๊ฒ์ ๋๋ค. ์๋ ์์๋ฅผ ์ดํด๋ณผ๊น์?
function withdraw(amount, account) {
// ๊ณ์ข์์ ์ผ์ ๊ธ์ก์ ์ถ๊ธํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์์ต๋๋ค.
const updatedAccount = account.withdraw(amount);
// ์ถ๊ธ์ ์๋ฃํ๋ฉด ํ์ฌ ์๊ฐ์ผ๋ก ์ถ๊ธ ๊ธฐ๋ก์ ์์คํ
์ ๋จ๊น๋๋ค.
logAccountActivity(updatedAccount, new Date());
return updatedAccount;
}
// ์์คํ
์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ ํจ์์
๋๋ค.
function logAccountActivity(account, date) {
// ํ์ฌ ์๊ฐ์ ํ์์คํฌํ
const timestamp = date.getTime();
console.log(`๊ณ์ข ํ๋: ${account.id}, ํ์์คํฌํ: ${timestamp}`);
}
์ถ๊ธ์ ํ๊ณ ๋๋ฉด ์ถ๊ธ ๊ธฐ๋ก์ ๋จ๊ธฐ๊ธฐ ์ํด logAccountActivity
ํจ์๋ฅผ ์คํํฉ๋๋ค. ์ด ํจ์๋ ์ธ์๋ฅผ ๋ฐ์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ ์์
์ด ์ ์ผํ ๊ธฐ๋ฅ์
๋๋ค. ์ด ํจ์๋ Date ๊ฐ์ฒด๋ฅผ ์ ๋ฌ๋ฐ์ ๋ฐ๋ฆฌ์ธ์ปจ๋๋ก ํ์ฌ ์๊ฐ์ ๋ณํํ๊ณ ์์ต๋๋ค. ์์ ํจ์๋ ๊ณ์ข ์ ๋ณด์ ์๊ฐ ๊ฐ์ฒด๋ฅผ ๋ฐ์ ํญ์ undefined
๋ฅผ ๋ฐํํฉ๋๋ค. ์ธ๋ถ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋, ์ฐธ์กฐํ๊ณ ์์ง๋ ์๊ธฐ์ ์์ ํจ์์ฒ๋ผ ๋ณด์ด๊ธฐ๋ ํฉ๋๋ค.
logAccountActivity
ํจ์๋ ๋ก๊ทธ๋ฅผ ๋จ๊ธด๋ค๋(timestamp
๋ฐํ) ๊ธฐ๋ฅ์ ์ธก๋ฉด์์ ๋ฉฑ๋ฑ์ฑ์ ๋ ๊ณ ์์ต๋๋ค. ๋ฉฑ๋ฑ์ฑ์ด๋ ํน์ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ์ฐจ๋ก ๋ฐ๋ณต์ ์ผ๋ก ์ํํด๋, ํญ์ ๋งค๋ฒ ๊ฐ์ ๊ฒฐ๊ณผ๋ก ์ด์ด์ ธ์ผ ํ๋ค๋ ๊ฒ์ ๋งํฉ๋๋ค. ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๋ ์ ํจ์๋ ์ด๋ ์๊ฐ๋์ ํธ์ถ์ด ๋์ด๋, ํญ์ ์ฑ์คํ๊ฒ ๋ณธ์ธ์ ํ ์ผ๋ง ๋ฌต๋ฌตํ ์ํํ ๋ฟ์
๋๋ค. ํ๋ฅญํ ๋ฉฑ๋ฑ์ฑ์ ์ง๋ ํจ์๋ผ๊ณ ํํํ ์ ์์ฃ .
๊ทธ๋ฌ๋ ์์ ํจ์์ ๊ด์ ์์ ๋ณด๋ฉด, logAccountActivity
๋ ์์ํ์ง ์์ต๋๋ค. Date ๊ฐ์ฒด๋ฅผ ๋ฐ์์ค์ง๋ง ํ์ฌ ์๊ฐ ๊ฐ์ ๋ฐํํ๋ getTime
ํจ์๋ฅผ ํธ์ถํ๋ฉด ํธ์ถํ๋ ์์ ๋ง๋ค ๋ค๋ฅธ ์๊ฐ๋๊ฐ ๋์ค๊ธฐ ๋๋ฌธ์, ์์คํ
์ ์ ์ฌ๋๋ ๋ก๊ทธ ๊ฐ์ ํญ์ ๋ฌ๋ผ์ง๋๋ค. ์ด์ฒ๋ผ ์์ ํจ์๋ ๋ฉฑ๋ฑ์ฑ์ ๋ ์ง๋ง, ๋ฉฑ๋ฑ์ฑ์ ๋ค๋ค๊ณ ํญ์ ์์ ํจ์์ธ ๊ฑด ์๋๋๋ค. ์ด ๋์ ์ฐจ์ด๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
describe('๋ก๊น
ํจ์ ํ
์คํธ', () => {
beforeEach(() => {
// jest.fn ํจ์๋ undefined๋ฅผ ๋ฐํํ๋ ๋น ํจ์๋ก Jest์์ ์ ๊ณตํ๋ ๋ชจํน ํจ์์
๋๋ค.
// ์ด ํจ์๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ํจ์๊ฐ ๋ช ๋ฒ ํธ์ถ๋์๋์ง, ์ด๋ค ์ธ์ ๊ฐ์ ์ ๋ฌ๋ฐ์๋์ง ๋ฑ์ ํ์ธํ ์ ์์ต๋๋ค.
// console.log ํธ์ถ์ ๊ฐ๋ก์ฑ๊ธฐ ์ํด ํจ์๋ฅผ ๋ชจํนํฉ๋๋ค.
console.log = jest.fn();
});
// ๋ก๊น
๊ฐ๊ฒฉ์ 5๋ถ์ด๋ผ๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
// 5๋ถ์ด ์ง๋๊ธฐ ์ ์ ๋ก๊น
ํจ์๊ฐ ์คํ๋๋ฉด ์ด์ ์ ๋ก๊ทธ ๊ธฐ๋ก์ผ๋ก ์ถ๋ ฅํ๋ ํจ์๋ผ๊ณ ํด๋ณด๊ฒ ์ต๋๋ค.
// ์๊ฐ์ ๋ํ ์ฒ๋ฆฌ๋ ๋ฐ๋ก ํ์ง ์์๊ธฐ ๋๋ฌธ์
// ์ถ๊ธ ํจ์ withdraw์์ ๊ณ์ข ์์ก์ด ์ฒ๋ฆฌ๋๋ ๋ถ๋ถ์ ์ด ํ
์คํธ์์ ์ ์ธํ๊ณ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
it('์ถ๊ธ์ ์๋ํ๋ฉด ์์คํ
์ ๋ก๊ทธ๋ฅผ ๋จ๊ธด๋ค.', () => {
// Given
const amount = 500;
const account = { number: '123456', withdraw: jest.fn() };
const date = new Date();
// When
withdraw(amount, account)
// Then
expect(console.log).toHaveBeenNthCalledWith(1, `๊ณ์ข ํ๋: 123456, ํ์์คํฌํ: ${date.getTime()}`);
});
});
์ด ํ
์คํธ๋ ํต๊ณผํ์ง ๋ชปํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. withdraw
ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ํ์ฌ ์๊ฐ์ date
๋ณ์์ ๋ง๋ค์ด๋์๊ณ , withdraw
ํจ์ ๋ด๋ถ์์๋ ์ถ๊ธ ์ฒ๋ฆฌ๋ฅผ ํ๊ณ ๋์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ธฐ ์ํด ๋ ๋ค๋ฅธ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ logAccountActivity
ํจ์๋ withdraw
ํจ์์์ ๋ง๋ค์ด์ง ์๋ก์ด ์๊ฐ์ ๋ฐ์์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ฒ ๋ฉ๋๋ค. ํ
์คํธ ๊ฒฐ๊ณผ๋ ์ด๋ป๊ฒ ๋ ๊น์?
withdraw
ํจ์๊ฐ ์์ฑํ๋ Date
๊ฐ์ฒด๋ ํ
์คํธ ์คํ ์ด์ ์ ์์ฑํ Date
๊ฐ์ฒด์ ์ฝ๊ฐ์ ์๊ฐ ์ฐจ์ด๋ฅผ ๋๊ณ ์์ฑ๋์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ปดํจํ
์๋๊ฐ ์์ฃผ ๋น ๋ฅด์ง๋ง ์ฝ๊ฐ์ ์๊ฐ์ด ํ๋ ๊ธฐ์, ๋ค๋ฅธ ์๊ฐ์ ๊ฐ๋ฆฌํค๊ณ ์์ ํ๋ฅ ์ด ๋์ต๋๋ค. ์ด์ฒ๋ผ ์ธ๋ถ์ ๊ฐ์ ์ฌ์ฉํ์ง ์๋๋ผ๋ ํธ์ถํ ๋๋ง๋ค ๋ฌ๋ผ์ง๋ ๊ฐ์ ์ฌ์ฉํด ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ฉด, ๊ทธ ํจ์๋ ์์ํ์ง ์์ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ ์ด ์ญ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
๋ง์น๋ฉฐ
์ง๊ธ๊น์ง ์ ๋ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ, ์ ๋ ํ ์คํธ๋ฅผ ์์ฑํ ๋ ์ฃผ์ํ ์ ๋ฑ์ ์์๋ณด์์ต๋๋ค. ์ ๋ ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ ์ํด ํ์ํ ์์ ์ ํ ์คํธ ๋์์ด ๋๋๋ก ์์ํ ํํ์ ํจ์๋ก ์กด์ฌํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ํจ์๊ฐ ์์ํ์ง ์์ผ๋ฉด ์์ํ์ง ๋ชปํ ๊ณณ์์ ์ฌ์ด๋ ์ดํํธ๋ฅผ ์ผ์ผํฌ ์ ์์ด, ์ฝ๋ ํ๋ฆ์ ์ข์ง ์์ ์ํฅ์ ์ค๋๋ค.
์ด์ฒ๋ผ ์ ๋ ํ ์คํธ๋ ๊ฐ๋จํ ๋ฏ ๋ณด์ฌ๋ ๊น์ด ์ดํดํด์ผ ํ๋ ๋ด์ฉ๋ ์์ผ๋, ์๊ฐ์ ๋ค์ฌ ์ฒ์ฒํ ํ์ตํด ๋ณด์๊ธธ ๋ฐ๋๋๋ค. ๋ค์์ ๋ ๋ค๋ฅธ ํ ์คํธ์ ๊ดํ ๋ด์ฉ์ผ๋ก ์ฐพ์์ค๊ฒ ์ต๋๋ค.