โ๏ธ ๋์กํ if-else ๋ฌธ ๋ฆฌํฉํ ๋ง ๊ธฐ๋ฒ (๊ฐ๋ ์ฑ & ์ฑ๋ฅ↑)
์๋ฐ์คํฌ๋ฆฝํธ ์กฐ๊ฑด๋ฌธ ๋ฆฌํฉํ ๋ง
์๋ฌด๋ฆฌ ๊ณ ๊ธ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ๋ฌธ๋ฒ, ๊ธฐ๋ฒ๋ค์ ์ตํ๊ณ ๊ทธ๊ฑธ ํ์ฉํ๋๋ผ๋, ์์ ์ ์ฝ๋์์ ๊ฐ์ฅ ๋ง์ด ๋น์ค์ ์ฐจ์งํ๋ ๋ฌธ๋ฒ์ ์๋ง ์กฐ๊ฑด๋ฌธ ์ผ ๊ฒ์ด๋ค. ํ๋ก๊ทธ๋จ์ ๋ฐ๋ณต๋ฌธ๊ณผ ์กฐ๊ฑด๋ฌธ๋ง ์์ผ๋ฉด ๋์๊ฐ๋ค๋ผ๋ ๋ง์ด ์๋ฏ์ด ์กฐ๊ฑด ๋ถ๊ธฐ๋ฌธ์ ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ์ด๊ธฐ๋ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด if-else ๋ถ๊ธฐ๋ฌธ์ ์๊ฐ์์ด ์ง๋์น๊ฒ ์ค์ฒฉํ๊ณ ์๊ฐ์์ด ์ฝ๋๋ฅผ ๋์ดํ๋ค๋ฉด ๊ฐ๋ ์ฑ์ด ํฌ๊ฒ ๋จ์ด์ง๋ค๋ ๋ฌธ์ ์ ์ด ์๊ธฐ๊ฒ ๋๋ค. ์๋ฅผ๋ค์ด if๋ฌธ ์์ if๊ฐ ์๊ณ ๊ทธ else๋ฌธ ์์ if~else ์์ if ๋ฑ๋ฑ.. ์ด๋ ๊ฒ ์ฝ๋๋ฅผ ์ง๋ฏ์ด ๋ง์ด๋ค. ๋๋ด ์ผ์ ์๋์ ๊ฐ์ด ์ฝ๋๊ฐ ๋ง์น ์๋ด๊ฒ์ ๋ง์๊ฒ๊ณผ ๊ฐ์ ๋ชจ์ต์ด ๋์ด ๋ฒ๋ฆด์ง๋ ๋ชจ๋ฅธ๋ค.
๋ฌผ๋ก ์ปดํจํฐ ์ ์ฅ์์ ์ฝ๋ ๋ก์ง์ ๋ฌธ์ ๋ ์์ํ ์ง๋ง ์ด๋ฅผ ๋์ค์ ์ฌ๋์ด ์ ์ง๋ณด์ ํ๊ธฐ ์ํด ์ฝ๋๋ฅผ ๋ณต๊ธฐํ๋ ๊ณผ์ ์์ ๊ต์ฅํ ๋ ธ๋ ฅ๊ณผ ์๊ฐ ๊ทธ๋ฆฌ๊ณ ์คํธ๋ ์ค๊ฐ ์๋ชจ๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ์ด๋ฌํ if๋ฌธ์ ์ต์ ํํ๋ ์คํ์ผ ๊ธฐ๋ฒ์ด ์กด์ฌํ๋ค.
์ด๋ฒ ํฌ์คํ ์์ 4๊ฐ์ง์ ๋ฐฉ๋ฒ๋ก ์ ์๊ฐํ ์์ ์ธ๋ฐ, ์ฒซ๋ฒ์งธ์ ๋๋ฒ์งธ๋ if๋ฌธ์ ์์น๋ฅผ ์กฐ์ ํจ์ผ๋ก์จ ์ข๋ ๋ณด๊ธฐ ํธํ๊ฒ ์ ์ง๋ณด์ ์ข๊ฒ ๋ง๋ค์ด์ฃผ๋ ์ฝ๋ ์์์ ๊ฐ๊น๋ค๋ฉด, ์ธ๋ฒ์งธ ๋ค๋ฒ์งธ๋ '๋์์ธ ํจํด'์ ๊ฐ๊น๋ค.
์ฃผ๋์ด ํ๋ก๊ทธ๋๋จธ์ ์๋์ด ํ๋ก๊ทธ๋๋จธ๋ฅผ ๊ฐ๋ฅด๋ ๊ธฐ์ค์ ํ์ฌ๋ง๋ค '์ฌ๋ฐ์ฌ' ์ด๊ธฐ ๋๋ฌธ์ ํญ์ ๋ ผ๋์ด ๋์ง๋ง, if๋ฌธ์ ์ด๋ค์์ผ๋ก ์ง๋๋์ ๋ฐ๋ผ ์ด ๋์ ๊ฐ๋ฅผ์ ์๋ค๋ ์ ์ ๋๊ตฌ๋ ๋์ํ๋ค. ๊ทธ๋งํผ ์กฐ๊ฑด๋ฌธ ๋ฆฌํฉํ ๋ง์ ์ฌ์ํ ๊ฒ ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ ์ง๋ณด์๊ฐ ์ค์ํ ํ์ ์์ ๊ต์ฅํ ์ค์ํ๊ฒ ์ฌ๊ฒจ์ง๋ค. ์ง๊ธ๋ถํฐ ์ฃผ๋์ด ๋ฑ์ง์ 1mg ์ด๋ผ๋ ๋ผ๋ณด๋ฌ ๊ฐ๋ณด์.
๊ธธ๋ค๋ ์กฐ๊ฑด์์ ํจ์๋ก ๋ถ๋ฆฌ
์๋ ์์ ๋ ๋ ์ง๋ฅผ ๊ตฌํด์ ๋น๊ต๋ฅผ ํตํด ์ฌ๋ฆ ๋ฐฉํ์ธ์ง, ๊ฒจ์ธ ๋ฐฉํ์ธ์ง ๊ตฌํ๋ ์กฐ๊ฑด์์ด๋ค. ํ๋์ ๋ด๋ ์กฐ๊ฑด์์ ์ฝ๋๊ฐ ๊ต์ฅํ ๋์กํ ๊ฒ์ ๋ณผ ์ ์๋ค.
const now = new Date();
const year = date.getFullYear();
if (now > new Date(year, 6, 25) && now < new Date(year, 7, 31)) {
// ๋งค๋
6์ 25์ผ ~ 7์ 31์ผ ์ผ ๊ฒฝ์ฐ
console.log('์ฌ๋ฆ ๋ฐฉํ ์
๋๋ค');
} else if (now > new Date(year, 11, 19) && now < new Date(year + 1, 1, 28)) {
// ๋งค๋
11์ 19์ผ ~ ๋ด๋
1์ 28์ผ ์ผ ๊ฒฝ์ฐ
console.log('๊ฒจ์ธ ๋ฐฉํ ์
๋๋ค');
}
์ฃผ์์ ํตํด ์ด๋์ ๋ ๋ปํ๋ ๋ฐ๋ฅผ ํ๋์ ์ ์๋ ์์ง๋ง ๋ถ๊ธฐ๋ฌธ ์ฝ๋ ์์ฒด๊ฐ ์ฌ์ ํ ๋์กํ๊ณ ๋ถ์ฑ ์ฌ๋ฉ๋ค.
์ด๋ด ๊ฒฝ์ฐ ์กฐ๊ฑด์ ์์ฒด๋ฅผ ์์ ํจ์๋ก ๋ง๋ค์ด์ ์ฌํํ๊ฒ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ข๋ค. ์ด๋ ํจ์๋ช ์ ์ด๋ฆ๋ง ๋ณด๊ณ ๋ ๋ฌด์์ ํ๋จํ๋ ๋ก์ง์ธ์ง ์ฝ๊ฒ ์ ์ ์๊ฒ ํ๊ธฐ ์ํด ์ ์ ํ ํจ์๋ช ์ ์ง์ด์ค๋ค. ์กฐ๊ฑด๋ฌธ์ ๋ฆฌํฉํ ๋งํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
function isSummerVacation(now) {
const year = date.getFullYear();
return now > new Date(year, 6, 25) && now < new Date(year, 7, 31)
}
function isWinterVacation(now) {
const year = date.getFullYear();
return now > new Date(year, 11, 19) && now < new Date(year + 1, 1, 28)
}
const now = new Date();
if (isSummerVacation(now)) {
// ๋งค๋
6์ 25์ผ ~ 7์ 31์ผ ์ผ ๊ฒฝ์ฐ
console.log('์ฌ๋ฆ ๋ฐฉํ ์
๋๋ค');
} else if (isWinterVacation(now)) {
// ๋งค๋
11์ 19์ผ ~ ๋ด๋
1์ 28์ผ ์ผ ๊ฒฝ์ฐ
console.log('๊ฒจ์ธ ๋ฐฉํ ์
๋๋ค');
}
isSummerVacation() ํจ์์ isWinterVacation() ํจ์๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ ๊ธธ๋ค๋ ์กฐ๊ฑด๋ฌธ์ ํจ์์ return ๋ฌธ์ผ๋ก ๋ฃ์๋ค. ๊ทธ๋ฆฌ๊ณ if ๋ฌธ์ ๋ธ๋ก์๋ ํจ์ ํธ์ถ๋ฌธ์ผ๋ก ๋ณ๊ฒฝํด์ค๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ์ฝ๋๊ฐ ๋์ฑ ๊ฐ๋
์ฑ์ด ์ข์์ง์ ๋ณผ์์๋ค. ์ ์ฒด์ ์ธ ๋ก์ง ์์ฒด๋ ๋ณํ๊ฒ ์๋ค. ์ฝ๋๋ฅผ ๋ชจ๋ํํ์ฌ ๊ทธ์ if ๋ฌธ์ ์กฐ๊ฑด์ ์ฝ๋ ๊ธธ์ด๋ฅผ ํจ์ ํธ์ถ๋ฌธ์ ํตํด ํ๊ธฐ์ ์ผ๋ก ์ค์ธ ๊ฒ์ด๋ค.
Early Return ๊ธฐ๋ฒ
Early Return์ด๋ ์กฐ๊ฑด๋ฌธ์์ ๋จผ์ Returnํ ์ ์๋ ๋ถ๋ถ์ ๋ถ๋ฆฌํ์ฌ ์ฐ์ ์ด๋ฐ ๋ผ์ธ์ if๋ฌธ ๋ด์์ Returnํ์ฌ ํจ์๋ฅผ ๋ฏธ๋ฆฌ ์ข ๋ฃํ๋ ๊ธฐ๋ฒ์ ๋งํ๋ค. if-else๋ฌธ์ด ๋๋ฌด ๋ง์ผ๋ฉด ์ฝ๊ธฐ๊ฐ ์ด๋ ต๊ณ ์กฐ๊ฑด์ ๋ํด ๋ช ์์ ์ด์ง ์์ ์ ์๋๋ฐ, Early Return์ ์ ์ฉํ๋ฉด ๋ค์ ์ฝ๋๋ก ์ง์ ํ์ง ์์ else๋ฌธ์ ์ฌ์ฉํ์ง ์์, ๋ก์ง์ ๋ณํจ์ด ์์ผ๋ฉด์ ๊ฐ๋ ์ฑ์ด ์ข๊ณ ๋ ๋ช ์์ ์ธ ์ฝ๋๋ก ๋ฆฌํฉํ ๋ง ํ ์ ์๋ค.
๋ค์๊ณผ ๊ฐ์ด loginService() ๋ผ๋ ํจ์์ ๋ก๊ทธ์ธ ์ฌ๋ถ, ํ ํฐ ์ฌ๋ถ, ๊ฐ์
์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์ค์ฒฉ ๋ถ๊ธฐ๋ฌธ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
function loginService(isLogin, user) {
let result = '';
// 1. ๋ก๊ทธ์ธ ์ฌ๋ถ ํ์ธ
if (isLogin == false) {
// 2. ํ ํฐ ์กด์ฌ ํ์ธ
if (checkToken() == true) {
// 3. ๊ฐ์
์ฌ๋ถ ์ฌํ์ธ
if (user.nickName == undefined) {
registerUser(user); // ํ์ ๊ฐ์
ํ๊ธฐ
result = 'ํ์๊ฐ์
์ฑ๊ณต';
} else {
refreshToken(); // ํ ํฐ ๋ฐ๊ธ
result = '๋ก๊ทธ์ธ ์ฑ๊ณต';
}
} else {
throw new Error('์๋ฌ - ํ ํฐ์ด ์์ต๋๋ค !');
}
} else {
result = '์ด๋ฏธ ๋ก๊ทธ์ธ ์ค';
}
result += ` (+ ์๋ ํ์ ${count++}๋ฒ)`;
return result;
}
์ด ์ฝ๋ ๋ชจ์ต์ ๋์ถฉ ๊ทธ๋ฆผ์ผ๋ก ํ๋ฆ๋๋ฅผ ํํํ์๋ฉด ์๋์ ๊ฐ์ด ๋ ๊ฒ์ด๋ค.
์๋ํ๊ณ ์ ํ๋ ๋ฐ๋ ์๊ฒ ์ง๋ง ๊ณ์ ์กฐ๊ฑด์ ์ค์ฒฉํด์ ๋ค์ด๊ฐ ์๊ฐํด์ผ ๋๊ธฐ ๋๋ฌธ์ ์ฝ๋ ๊ฐ๋ ์ฑ์ด ๊ทธ๋ ๊ฒ ์ข์ง ์์ ๋ณด์ธ๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ์ต์ ํ ํด๋ณด์.
Early Return ๋ฆฌํฉํ ๋ง ์์
1. if๋ฌธ ๋ค์์ ๋์ค๋ ๊ณตํต๋ ์ ์ฐจ๋ฅผ ์ฒซ๋ฒ์งธ ๋ถ๊ธฐ์ ๋ด๋ถ์ ๊ฐ๊ฐ ๋ฃ๋๋ค
์ฝ๋ ์ค๋ณต์ ํผํ๋ ค๊ณ ๊บผ๋ด๋จ๋๋ ๊ฑฐ๊พธ๋ก๋ก ๋ค์ ์ค๋ณต ์์ผ๋๋ ๊ฒ์ผ๋ก ๋ณด์ผ ์ ์๋ค. ๋ค๋ง ์ด๋ ๋ฆฌํฉํ ๋ง์ ์์ด ํ์ํ ๊ณผ์ ์ด๋ ๊ทธ๋๋ก ์ดํํ์.
์ด๋ ์ฌ๊ธฐ์ ์ฒซ๋ฒ์งธ ๋ถ๊ธฐ์ ์ด๋, ์ฝ๋ ๋ ๋ฒจ์ ์ฒซ if๋ฌธ์ ๋งํ๋ค. ์ฆ, if๋ฌธ ์์ if๋ฌธ ๊ฐ์ ๊ฒฝ์ฐ ์ ์ธ ๋๋ค.
function loginService(isLogin, user) {
let result = '';
if (isLogin == false) {
if (checkToken() == true) {
if (user.nickName == undefined) {
registerUser(user);
result = 'ํ์๊ฐ์
์ฑ๊ณต';
} else {
refreshToken();
result = '๋ก๊ทธ์ธ ์ฑ๊ณต';
}
} else {
throw new Error('์๋ฌ - ํ ํฐ์ด ์์ต๋๋ค !');
}
result += ` (+ ์๋ ํ์ ${count++}๋ฒ)`; // ๊ณตํต๋ ์ ์ฐจ
return result; // ๊ณตํต๋ ์ ์ฐจ
} else {
result = '์ด๋ฏธ ๋ก๊ทธ์ธ ์ค';
result += ` (+ ์๋ ํ์ ${count++}๋ฒ)`; // ๊ณตํต๋ ์ ์ฐจ
return result; // ๊ณตํต๋ ์ ์ฐจ
}
}
2. ๋ถ๊ธฐ์ ์์ ์งง์ ์ ์ฐจ๋ถํฐ ์คํํ๊ฒ if๋ฌธ์ ๋ฐ์ ์ํจ๋ค
if๋ฌธ ๊ณผ else๋ฌธ์ ๋ธ๋ญ์ ๋ณด๋ฉด ์ฝ๋ ์ ์ฐจ๊ฐ ๊ธด๊ฒ์ if๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ ์ฐจ๊ฐ ์งง์ else ๋ธ๋ญ ์ฝ๋ ๋ถ๋ถ์ if ๋ฌธ์ ๋ฃ์ด์ฃผ๊ธฐ ์ํด if-else๋ฅผ ๋ฐ์ ์ํจ๋ค. ๊ฐ๋จํ๊ฒ ๊ธฐ์กด์ if (isLogin == false) ๋ฅผ ๊ฑฐ๊พธ๋ก if (isLogin == true) ๋ก ๊ตฌ์ฑํด์ฃผ๋ฉด ์ฝ๋๋ฅผ ๋ค๋ฐ๊ฟ ์ ์๊ฒ ๋์ด ์งง์ ๋ถ๋ถ์ด ์์ชฝ์ผ๋ก ์ค๊ฒ ๋๊ณ ๊ธธ๋ค๋ ๋ถ๋ถ์ด ์๋์ชฝ์ผ๋ก ์ค๊ฒ ๋๋ค.
function loginService(isLogin, user) {
let result = '';
if (isLogin == true) { // else์ ๋ค๋ฐ๊พธ๊ธฐ ์ํ์ฌ boolean ์ ๋ฐ์ ์ํจ๋ค
result = '์ด๋ฏธ ๋ก๊ทธ์ธ ์ค';
result += ` (+ ์๋ ํ์ ${count++}๋ฒ)`;
return result;
} else {
if (checkToken() == true) {
if (user.nickName == undefined) {
registerUser(user);
result = 'ํ์๊ฐ์
์ฑ๊ณต';
} else {
refreshToken();
result = '๋ก๊ทธ์ธ ์ฑ๊ณต';
}
} else {
throw new Error('์๋ฌ - ํ ํฐ์ด ์์ต๋๋ค !');
}
result += ` (+ ์๋ ํ์ ${count++}๋ฒ)`;
return result;
}
}
๋ง์ผ ์๋์ ๊ฐ์ด ์ฒซ if๋ฌธ์ด else๋ฌธ์ด ์๋ ์์ if๋ฌธ์ด๋ผ์ ์งํ์ ๋ฌด๋ฆฌ๊ฐ ์๋ค๋ฉด, ์๋์ ๊ฐ์ด ๊ฐ๋จํ๊ฒ ๋น else๋ฌธ์ ๋ง๋ค์ด ๋ฒ๋ฆฌ๊ณ ์งํํ๋ฉด ๋๋ค. (๊ทธ๊ฒ ๊ทธ๊ฑฐ๊ธฐ ๋๋ฌธ)
3. ์งง์ ์ ์ฐจ๊ฐ ๋๋๋ฉด return(ํจ์ ๋ด๋ถ์ ๊ฒฝ์ฐ)์ด๋ break(for๋ฌธ ๋ด๋ถ์ ๊ฒฝ์ฐ) ๋ก ์ผ์ฐ ์ค๋จ์ ์ ์ถ๊ฐํ๋ค
๋ณธ๋ฌธ์ ์์ ๋ ํจ์๋ฌธ ์ด๊ณ , ์ด๋ฏธ ๋ฆฌํด๋ฌธ์ ์๋ก ์ฌ๋ ธ์ผ๋ ๊ทธ๋๋ก ์งํํ๋ฉด ๋๋ค.
โ
4. else๋ฅผ ์ ๊ฑฐํ๋ค. (์ด ๋ ์ค์ฒฉํ๋๊ฐ ์ ๊ฑฐ๋๋ค)
function loginService(isLogin, user) {
let result = '';
if (isLogin == true) {
result = '์ด๋ฏธ ๋ก๊ทธ์ธ ์ค';
result += ` (+ ์๋ ํ์ ${count++}๋ฒ)`;
return result;
} // else { ๋ฅผ ์ ๊ฑฐํ๋ค
if (checkToken() == true) {
if (user.nickName == undefined) {
registerUser(user);
result = 'ํ์๊ฐ์
์ฑ๊ณต';
} else {
refreshToken();
result = '๋ก๊ทธ์ธ ์ฑ๊ณต';
}
} else {
throw new Error('์๋ฌ - ํ ํฐ์ด ์์ต๋๋ค !');
}
result += ` (+ ์๋ ํ์ ${count++}๋ฒ)`;
return result;
}
โ
5. ๋ค์ 1๋ฒ ๋ถํฐ ๋์๊ฐ ์์ ์ ๋ฐ๋ณตํ๋ค
6. ๋ฆฌํฉํ ๋ง ๊ฒฐ๊ณผ
์ด๋ ๊ฒ ์ค์ฒฉ ์กฐ๊ฑด๋ฌธ๋ค์ ํ๋ํ๋ ๊บผ๋ด๋ฉด์ ๋ฆฌํฉํ ๋งํ ๊ฒฐ๊ณผ ์ฝ๋์ ๋ชจ์ต์ ๋ง์น ์๋์ ๊ฐ์ด ์ค์ฒฉ๋์ง ์๊ณ ํ๋์ ๋ ๋ฒจ์์ ๊ฐ ์กฐ๊ฑด์์ ํ๋ณํ๋ ํํ๊ฐ ๋๊ฒ ๋๋ค. ์ด๋ฌํฅ ๊ตฌ์ฑํ๋ฉด ๋ก์ง์ด ์๋ฏธํ๊ณ ์ ํ๋ ๋ฐ๋ฅผ ํ๋์ ์ ์ ์๊ณ ์กฐ๊ฑด์์ ์ค์ฒฉํ์ฌ ์๊ฐํ์ง์๊ณ ๋ถ๋ฆฌํ์ฌ ์๊ฐํจ์ผ๋ก์จ ์ฝ๋๋ฅผ ๋น ๋ฅด๊ฒ ๋ณต๊ธฐํ ์ ์๊ฒ ๋๋ค.
function loginService(isLogin, user) {
let result = '';
// 1. ๋ก๊ทธ์ธ ์ฌ๋ถ ํ์ธ
if (isLogin == true) {
result = '์ด๋ฏธ ๋ก๊ทธ์ธ ์ค';
result += ` (+ ์๋ ํ์ ${count++}๋ฒ)`;
return result;
}
// 2. ํ ํฐ ์กด์ฌ ํ์ธ
if (checkToken() == false) {
throw new Error('์๋ฌ - ํ ํฐ์ด ์์ต๋๋ค !');
}
// 3. ๊ฐ์
์ฌ๋ถ ์ฌํ์ธ
if (user.nickName == undefined) {
registerUser(user); // ํ์ ๊ฐ์
ํ๊ธฐ
result = 'ํ์๊ฐ์
์ฑ๊ณต';
} else {
refreshToken(); // ํ ํฐ ๋ฐ๊ธ
result = '๋ก๊ทธ์ธ ์ฑ๊ณต';
}
result += ` (+ ์๋ ํ์ ${count++}๋ฒ)`;
return result;
}
3๋ฒ์งธ ๋ถ๊ธฐ์ธ ๊ฐ์ ์ฌ๋ถ ์ฌํ์ธ ๋ถ๋ถ์ ๋ค์ํ๋ฒ ๋ฆฌํฉํ ๋ง์ ํ์ฌ else๋ฅผ ์์ ๋ ๋๊ณ ์์์ ๋ ๋๋ค.
Early Return ๊ธฐ๋ฒ์ ๋น๋จ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์๋ ๋น์ฐํ ๋๊ฐ์ด ์ ์ฉ๋๋ ๋ถ๋ถ์ด๋ ์ฐ์ตํด๋๋ฉด ์ข๋ค.
Lookup Table ๊ธฐ๋ฒ
์ด๋ฒ์๋ ์ข๋ ์๋ฐ์คํฌ๋ฆฝํธ ์ค๋ฌ์ด ์กฐ๊ฑด๋ฌธ ํด๋ฆฐ ์ฝ๋๋ฅผ ์๊ฐํด๋ณผ ๊ฒ์ด๋ค. ์ด ๋ฆฌํฉํ ๋ง ๊ธฐ๋ฒ์ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ง์ ์ผ๊ธ ๊ฐ์ฒด์ ํน์ฑ์ ์ด์ฉํ ๋ฐฉ๋ฒ์ผ๋ก, ๊ธฐ์กด์ else if ๋ก์ง์ key-value ์์ ํํ๋ก ๊ฐ๊ฐ์ ๋ ผ๋ฆฌ๋ฅผ ์บก์ํํ ๊ฒ์ด๋ค. ๋ง์น ๊ฐ์ฒด ํ ์ด๋ธ์ ์กฐํํ์ฌ ๋ถ๊ธฐ๋ฅผ ์คํํ๋๊ฒ๊ณผ ๊ฐ๋คํ์ฌ Lookup Table ๊ธฐ๋ฒ์ด๋ผ ๋ถ๋ฆฌ์ด๋ค.
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ด ๊ฐ ์์
์๋น์ค๋ค์ ์ ์ฉ ๋ก๊ทธ์ธ ํจ์๋ค์ด ์๋ค๊ณ ๊ฐ์ ํ๊ณ , socialLogin() ํจ์์์ ํ๋์ ๋งค๊ฐ๋ณ์ where์ ๋ํด ์กฐ๊ฑด๋ณ๋ก ๋ก๊ทธ์ธ ๋ถ๊ธฐ๊ฐ ์ผ์ ํํ๋ก ๋๋์ด์ ธ ์๋ค๊ณ ํ์.
// ... ๋ณต์กํ ๋ก๊ทธ์ธ ๊ณผ์ ์๋ตํ ๋ชจ๋
const naverLogin = (id) => { return '๋ค์ด๋ฒ'; };
const kakaoLogin = (id) => { return '์นด์นด์ค'; };
const facebookLogin = (id) => { return 'ํ์ด์ค๋ถ'; };
const googleLogin = (id) => { return '๊ตฌ๊ธ'; };
const socialLogin = (where, id) => {
let domain;
if (where === 'naver') {
domain = naverLogin(id);
} else if (where === 'kakao') {
domain = kakaoLogin(id);
} else if (where === 'facebook') {
domain = facebookLogin(id);
} else if (where === 'google') {
domain = googleLogin(id);
}
return `${domain} ${id}`;
};
console.log(socialLogin('naver', 'inpa'));
console.log(socialLogin('google', 'inpa'));
else if์ ์ฐ์์ผ๋ก, ์ด ์ฝ๋ ๋ชจ์ต์ ๋์ถฉ ๊ทธ๋ฆผ์ผ๋ก ํ๋ฆ๋๋ฅผ ํํํ์๋ฉด ์๋์ ๊ฐ์ด ๋ ๊ฒ์ด๋ค.
๋ณด๊ธฐ์ ๊ฐ๋ ์ฑ ๋ฉด์์ ๊ทธ๋ ๊ฒ ํฐ ๋ฌธ์ ๊ฐ ๋์ง ์์ ๋ณด์ด์ง๋ง, ์ด๋ฌํ ๊ตฌ์ฑ์ ์ฝ๋๋ฅผ ์ข๋ ํจ์จ์ ์ผ๋ก ์งค ์ ๊ฐ ์๋ค.
Lookup Table ๋ฆฌํฉํ ๋ง ์์
1. ์กฐ๊ฑด๋ฌธ๋ง์ ๋ฐ๋ก ๋ถ๋ฆฌํ๋ค
๊ฐ์ฅ ๋จผ์ socialLogin() ํจ์๋ด ๋ถ๊ธฐ๋ฌธ ์ฝ๋๋ง ๋ฐ๋ก ๋ฝ์๋ด์ด ๋ณ๋์ executeLogin() ํจ์๋ก ๋ถ๋ฆฌํด ๊ตฌ์ฑํด์ค๋ค. ๊ทธ๋ฌ๋ฉด ๊ธฐ์กด socialLogin() ํจ์๋ executeLogin() ํจ์๋ฅผ ํธ์ถํด ๊ฒฐ๊ณผ๊ฐ์ ๋ฐ๋ ํ์์ด ๋๋ค.
const executeLogin = (where, id) => {
if (where === 'naver') {
domain = naverLogin(id);
} else if (where === 'kakao') {
domain = kakaoLogin(id);
} else if (where === 'facebook') {
domain = facebookLogin(id);
} else if (where === 'google') {
domain = googleLogin(id);
}
};
const socialLogin = (where, id) => {
let domain = executeLogin(where, id);
return `${domain} ${id}`;
};
2. if-else ๋ฌธ์ switch-case ๋ฌธ์ผ๋ก ๋ณํํ๋ค
์ค์ฒฉ if๋ฌธ์ด ์๋ ํํ๋ switch ๋ฌธ์ผ๋ก ๋ณํ์ด ๊ฐ๋ฅํ๋ค. ๋ณํํ๋ฉด ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋ ๊ฒ์ด๋ค.
const executeLogin = (where, id) => {
switch (where) {
case 'naver':
return naverLogin(id);
case 'kakao':
return kakaoLogin(id);
case 'facebook':
return facebookLogin(id);
case 'google':
return googleLogin(id);
}
};
const socialLogin = (where, id) => {
let domain = executeLogin(where, id);
return `${domain} ${id}`;
};
์ฐธ๊ณ ๋ก ์๋ฐ์คํฌ๋ฆฝํธ์์ switch-case๋ฌธ์ผ ๊ฒฝ์ฐ, ๋ค๋ฅธ ์ธ์ด์์๋ ํด๋น ์ผ์ด์ค๋ก jump๋ฅผ ํด์ ๋ฐ๋ก ์ํ๋ ๊ณณ์ผ๋ก ์ด๋ํ์ง๋ง, js๋ case๋ฅผ ๋์ด๋ ์์๋๋ก ํ๊ฐํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ์ง์ํ๋ผ๋ ์ค๋ ์๋ค.
3. switch-case ๋ฌธ์ ๊ฐ์ฒด๋ก ๋ณํํ๋ค
switch๋ฌธ์ ์๋ณด๋ฉด ๊ฐ ๋ฌธ์์ด case๋ง๋ค ์ด์ ๋ง๋ ํจ์๋ฅผ ํธ์ถํ๊ณ ์๋ค๋ ๊ท์น์ฑ์ ์ฐพ์ ์ ์๋ค. ๋ฐ๋ผ์ case ๋ถ๋ถ์ ๊ฐ์ฒด์ key ๊ฐ์ผ๋ก, ๋ฆฌํด๋ฌธ์ ๊ฐ์ฒด์ value ๊ฐ์ผ๋ก ๊ตฌ์ฑํด์ค๋ค๋ฉด ์๋์ ๊ฐ์ด ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ก ๋๊ฐ์ด ๊ตฌ์ฑ์ด ๊ฐ๋ฅํ๊ฒ ๋๋ค.
const executeLoginMap = {
naver: naverLogin,
kakao: kakaoLogin,
facebook: facebookLogin,
google: googleLogin,
};
const socialLogin = (where, id) => {
let domain = executeLoginMap[where](id); // naver์ผ ๊ฒฝ์ฐ naverLogin(id) ๋ก ํจ์ ์คํ
return `${domain} ${id}`;
};
๊ทธ๋ฆฌ๊ณ ๊ธฐ์กด socialLogin() ํจ์์์ executeLoginMap ๊ฐ์ฒด๋ฅผ ํธ์ถ ํ ๋ ๋ฐฐ์ด ์ธ์๋ฅผ ํตํด ํธ์ถํ key๊ฐ์ ์ป๊ฒํ๊ณ , executeLoginMap[where] ํตํด ์ป์ ๊ฐ์ฒด์ value๊ฐ์ธ ํจ์ ํํ์์ ๊ฐ์ ธ์ ๊ทธ๋๋ก (id) ๋งค๊ฐ๋ณ์๋ฅผ ํ ๋นํ์ฌ ํจ์๋ฅผ ์คํํจ์ผ๋ก์จ ๊ฒฐ๊ณผ๊ฐ์ ์ป๋, ๋ง์น ์๋ฆ๋ค์ด(?) ์ฝ๋ ๋์์ธ ํจํด์ ์ผ์ข
์ด๋ผ๊ณ ๋ณผ ์ ์๋ค.
์ฒ์ ๊ทธ๋ฆผ๊ณผ ๋น๊ตํ์๋ฉด, ๊ธฐ์กด์๋ ์ฌ๋ฐ๋ฅธ ๋ถ๊ธฐ๋ฅผ ๊ฒ์ฌํ๊ธฐ ์ํด ์ผ์ผํ ๊ฐ A, B, C ๋ถ๊ธฐ๋ฅผ ์ผ์ผํ ๋ชจ๋ ์ํํ์ฌ์ผ ํ์ง๋ง, Lookup Table ๊ธฐ๋ฒ์ ์ ์ฉํ๋ฉด ๋ชจ๋ ์กฐ๊ฑด์ ์ํํ ํ์์์ด ๋งค๊ฐ๋ณ์์ ๊ฐ์ ๋ฐ๋ผ ์ด์ ํด๋นํ๋ ๊ฐ์ฒด์ key-value ๊ตฌ์ฑ์ ๋ฐ๋ผ ๊ฐ๊ฐ์ ๋ ผ๋ฆฌ๋ ๋ณ๋์ ํจ์๋ก ๋ค์ ์์ฑ๋๋ฏ๋ก ํจ์๋ฅผ ํธ์ถํ๋ ์์ผ๋ก ๊ตฌ์ฑํ์๊ธฐ ๋๋ฌธ์, ํ๋ก์ธ์ค๊ฐ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋ณ๋ ฌ์ ์ผ๋ก ๋ถ๊ธฐ์ ์ ๊ทผํ๊ฒ ๋๋ ํํ๊ฐ ๋๊ณ ์ด๋ ๊ณง ์ฑ๋ฅ ํฅ์์ผ๋ก ์ง๊ฒฐ๋๊ฒ ๋๋ค.
Responsibility chain pattern
๋ค๋ง Lookup Table ๊ธฐ๋ฒ์ ๋งค์น๋ ๋ถ๊ธฐ๊ฐ ์์ผ๋ฉด ๊ทธ ๋ถ๊ธฐ๋ง ์คํํ๊ณ ํจ์๋ฅผ ์ข ๋ฃํ๋ค. ๊ทธ๋ฆฌ๊ณ key ๋งค์นญ ๋ฐฉ์์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ํ๋์ ์ธ์๊ฐ(where)์ ๋ํด์๋ง ๋น๊ต๋ฅผ ํ๋ ๋ง์ผ ์ฌ๋ฌ๊ฐ์ ์ธ์๋ฅผ ๋น๊ตํ๋ค๊ณ ํ๋ฉด ์ ํฉํ์ง๊ฐ ์๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ด์ ๋ํ ๋์ ๊ธฐ๋ฒ์ผ๋ก ์ฑ ์ ์ฐ์ ํจํด(Chain Responsility Pattern)์ด ์กด์ฌํ๋ค.
์ฑ ์ ์ฐ์ ํจํด์ GOF ๋์์ธ ํจํด์ ํ ์ข ๋ฅ๋ก์, ๋ถ๊ธฐ๋ฌธ์ ๋ธ๋ญ๋ค์ ๊ฐ์ฒดํ ํ์ฌ, ๋ค์์ ์ฒ๋ฆฌ ๊ฐ์ฒด(ํธ๋ค๋ฌ)๋ค์ ์ฒด์ธ ํํ๋ก ๋ฌถ๋ ํจํด์ด๋ค. ๊ทธ๋์ ์ด๋ ํ ์์ฒญ์ด ๋ฐ์ํ์์ ๋ ๊ทธ ์๊ตฌ๋ฅผ ์ฒ๋ฆฌํ ๊ฐ์ฒด ํธ๋ค๋ฌ๋ฅผ ์ํํ๋ ์์ผ๋ก ํ์ฌ ๋ถ๊ธฐ๋ฌธ์ ๊ฐ์ฒด ์งํฅ์ ์ผ๋ก ํํํ ๊ธฐ๋ฒ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
์์ Early Return ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๊ฐ์ ธ์ ๋ณด์๋ค.
const refreshToken = () => {};
const registerUser = () => {};
function loginService(isLogin, checkToken, user) {
let result = '';
let count = 0;
// 1. ๋ก๊ทธ์ธ ์ฌ๋ถ ํ์ธ
if (isLogin == true) {
result += '์ด๋ฏธ ๋ก๊ทธ์ธ ์ค';
result += ` (+ ์๋ ํ์ ${++count}๋ฒ)`;
return result;
}
// 2. ํ ํฐ ์กด์ฌ ํ์ธ
if (checkToken == false) {
throw new Error('์๋ฌ - ํ ํฐ์ด ์์ต๋๋ค !');
}
// 3. ๊ฐ์
์ฌ๋ถ ์ฌํ์ธ
if (user.nickName == undefined) {
registerUser(user); // ํ์ ๊ฐ์
ํ๊ธฐ
result += 'ํ์๊ฐ์
์ฑ๊ณต';
result += ` (+ ์๋ ํ์ ${++count}๋ฒ)`;
return result;
}
refreshToken(); // ํ ํฐ ๋ฐ๊ธ
result += '๋ก๊ทธ์ธ ์ฑ๊ณต';
result += ` (+ ์๋ ํ์ ${++count}๋ฒ)`;
return result;
}
console.log(loginService(false, true, { nickName: 'inpa' })); // ๋ก๊ทธ์ธ ์ฑ๊ณต (+ ์๋ ํ์ 1๋ฒ)
console.log(loginService(true, false, { nickName: 'inpa' })); // ์ด๋ฏธ ๋ก๊ทธ์ธ ์ค (+ ์๋ ํ์ 1๋ฒ)
console.log(loginService(false, true, {})); // ํ์๊ฐ์
์ฑ๊ณต (+ ์๋ ํ์ 1๋ฒ)
console.log(loginService(false, false, { nickName: 'inpa' })); // Error: ์๋ฌ - ํ ํฐ์ด ์์ต๋๋ค !
์ด ์์ฒด๋ก๋ ๋ฌธ์ ๋ ์์ง๋ง ๋ง์ผ ์๋ก์ด ๋ถ๊ธฐ๋ฌธ์ด ์ถ๊ฐ๋ ๊ฒฝ์ฐ ํจ์ ์ฝ๋ ์์ฒด๋ฅผ ํต์ง๋ก ๋ฏ์ด ๊ณ ์ณ์ผ ํ ์๋ ์๋ค. ์ด๋ ํ๋์ ํจ์ ์์ ์ฌ๋ฌ๊ฐ์ง์ ์ธ์์ ๋ํ ์กฐ๊ฑด ํ๋จ์ ํ๋ ์ฑ ์์ ์ค์ ์ง๊ถ ์ ์ผ๋ก ๋ชจ์์ ธ ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํด๋์ค๋ฅผ ์ด์ฉํ ์ฑ ์ ์ฐ์ ํจํด ์ค๊ณ
๋ฐ๋ผ์ ์์ Early Return ์์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ฑ ์ ์ฐ์ ํจํด์ผ๋ก ์ฌ๊ตฌ์ฑ ํด๋ณด์. ์ฝ๋๋ฅผ ์๋ฐ(Java) ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ค๋ฝ๊ฒ ํด๋์ค๋ฅผ ์ด์ฉํด ์ค๊ณํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
class Handler {
nextHandler; // ์ฐ๊ฒฐ๋ ๋ค์ ํธ๋ค๋ฌ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ํ๋
result = '';
count = 0;
setNext(handler) {
this.nextHandler = handler; // ๋ฉ์๋๋ฅผ ํตํด ์ฐ๊ฒฐํ ํธ๋ค๋ฌ๋ฅผ ๋ฑ๋กํ๋ค
return handler; // ๋ฉ์๋ ์ฒด์ด๋์ ์ํด ์ธ์์ ํธ๋ค๋ฌ๋ฅผ ๋ฆฌํดํ๋ค
}
}
class LoginHandler extends Handler {
check(isLogin, checkToken, user) {
// 1. ๋ก๊ทธ์ธ ์ฌ๋ถ ํ์ธ
if (isLogin == true) {
this.result = '์ด๋ฏธ ๋ก๊ทธ์ธ ์ค';
this.result += ` (+ ์๋ ํ์ ${++this.count}๋ฒ)`;
return this.result;
} else {
return this.nextHandler.check(isLogin, checkToken, user);
}
}
}
class TokenHandler extends Handler {
check(isLogin, checkToken, user) {
// 2. ํ ํฐ ์กด์ฌ ํ์ธ
if (checkToken == false) {
throw new Error('์๋ฌ - ํ ํฐ์ด ์์ต๋๋ค !');
} else {
return this.nextHandler.check(isLogin, checkToken, user);
}
}
}
class JoinHandler extends Handler {
check(isLogin, checkToken, user) {
// 3. ๊ฐ์
์ฌ๋ถ ์ฌํ์ธ
if (user.nickName == undefined) {
registerUser(user); // ํ์ ๊ฐ์
ํ๊ธฐ
this.result = 'ํ์๊ฐ์
์ฑ๊ณต';
this.result += ` (+ ์๋ ํ์ ${++this.count}๋ฒ)`;
return this.result;
} else {
return this.nextHandler.check(isLogin, checkToken, user);
}
}
}
class SuccessHandler extends Handler {
check(isLogin, checkToken, user) {
refreshToken(); // ํ ํฐ ๋ฐ๊ธ
this.result = '๋ก๊ทธ์ธ ์ฑ๊ณต';
this.result += ` (+ ์๋ ํ์ ${++this.count}๋ฒ)`;
return this.result;
}
}
const loginService = (isLogin, checkToken, user) => {
let result = '';
// 1. ํธ๋ค๋ฌ(์ฒ๋ฆฌ ๊ฐ์ฒด) ์์ฑ
const handler1 = new LoginHandler();
const handler2 = new TokenHandler();
const handler3 = new JoinHandler();
const handler4 = new SuccessHandler();
// 2. ํธ๋ค๋ฌ ์ฒด์ด๋ ๋ฑ๋ก
handler1.setNext(handler2).setNext(handler3).setNext(handler4);
// 3. ํธ๋ค๋ฌ ์คํ
result = handler1.check(isLogin, checkToken, user); // handler1 → handler2 → handler3 → handler4
return result;
};
console.log(loginService(false, true, { nickName: 'inpa' })); // ๋ก๊ทธ์ธ ์ฑ๊ณต (+ ์๋ ํ์ 1๋ฒ)
console.log(loginService(true, false, { nickName: 'inpa' })); // ์ด๋ฏธ ๋ก๊ทธ์ธ ์ค (+ ์๋ ํ์ 1๋ฒ)
console.log(loginService(false, true, {})); // ํ์๊ฐ์
์ฑ๊ณต (+ ์๋ ํ์ 1๋ฒ)
console.log(loginService(false, false, { nickName: 'inpa' })); // Error: ์๋ฌ - ํ ํฐ์ด ์์ต๋๋ค !
๊ฐ ํธ๋ค๋ฌ๋ค์ด ์๊ธฐ ๊ณ ์ ์ ์์ฒญ์ ๋ํ ์ฒ๋ฆฌ ์ฑ ์์ ์ง๋๊ณ ์์ผ๋ฉฐ, ์คํ๋ถ์์ setNext() ๋ฉ์๋๋ฅผ ํตํด ํธ๋ค๋ฌ๋ฅผ ์ฒด์ธ ์์ผ์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์คํ ํจ์๋ฅผ ํธ์ถํ๋ฉด ๋ง์น if-else ์ฒ๋ผ ๋ถ๊ธฐ๋ฅผ ๊ฐ์ฒด๋ง๋ค ์ํํ๋ฉด์ ์ฒ๋ฆฌ๋ฅผ ํ๊ฒ ๋๋ ๊ฒ์ด๋ค. ์ด๋ฐ ์์ผ๋ก ๋ณตํฉ๋ฌธ else if ๋ ผ๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐ ์ฑ๊ณตํ๋ค.
์ข๋ ์ฌํํ ์ฑ ์ ์ฐ์ ํจํด ์ค๊ณ
๋ค๋ง ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ผ๊ธ ๊ฐ์ฒด์ ํน์ง์ ๊ฐ๋ ์ธ์ด๋ก์ ๊ตณ์ด ํด๋์ค ์งํฅ์ผ๋ก ์ค๊ณํ ํ์๊ฐ ์๋ค. ์ด ๋ถ๋ถ์ ๋ชจ๋ GOF ๋์์ธ ํจํด์ ๋จ์ ์ด๊ธฐ๋ ํ๋ฐ, ๋น์ฅ ์์ ์ฝ๋๋ง ๋ด๋ ์์ฒญ๋๊ฒ ๊ธธ์ด์ง๊ฑธ ํ์ธ ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๋ค์๊ณผ ๊ฐ์ด ์ข ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ก๊ทธ๋๋ฐ ๋ต๊ฒ ์ฌํํ๊ฒ ๋ฆฌํฉํ ๋ง ํ ์๊ฐ ์๋ค.
๋จผ์ ๊ฐ์ฒด๋ฅผ ๋ด์ ๋ฐฐ์ด์ ์์ฑํ๊ณ , ์์ ๊ฐ์ฒด๋ง๋ค match์ action์ด๋ผ๋ ํจ์๋ฅผ ๊ฐ๊ฐ ๋ง๋ค์ด ์ค๋ค. match ๋ถ๋ถ์ if๋ฌธ์ ์กฐ๊ฑด์์ ๋ฃ๋ ๋ถ๋ถ์ด๊ณ , action์ if๋ฌธ ๋ธ๋ก ์์ ์คํ ์ฝ๋๋ฅผ ๋ฃ๋ ๋ถ๋ถ์ด๋ค. match๋ false์ผ ๊ฒฝ์ฐ ๋ค์ match๋ก ๋์ด๊ฐ๊ฒ ๋๋ค. action์ match๊ฐ true ์ผ๊ฒฝ์ฐ ์คํ๋๊ณ ํ๊ฐ๋ฅผ ์ข ๋ฃํ๊ฒ ๋๋ค.
const rules = [
{
match: function (a, b, c) { /* ... */ },
action: function (a, b, c) { /* ... */ }
},
{
match: function (a, b, c) { /* ... */ },
action: function (a, b, c) { /* ... */ }
},
{
match: function (a, b, c) { /* ... */ },
action: function (a, b, c) { /* ... */ }
}
]
์ด๋ฌํ ๊ธฐ๋ฒ์ ์ด์ฉํด์ ์ต์ข ์ผ๋ก ๊ตฌ์ฑํ ์๋ฐ์คํฌ๋ฆฝํธ ์ฑ ์ ์ฐ์ ํจํด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
const Handler = {
result: '',
count: 0,
rules: [
{
// match๋ false์ผ ๊ฒฝ์ฐ ๋ค์ match๋ก ๋์ด๊ฐ๊ฒ ๋๋ค.
match(isLogin, checkToken, user) {
return isLogin ? true : false; // 1. ๋ก๊ทธ์ธ ์ฌ๋ถ ํ์ธ
},
// action์ match๊ฐ true ์ธ ์คํ ๋ถ๋ถ์ ๊ธฐ์ฌํ๋ค
action(isLogin, checkToken, user) {
Handler.result = '์ด๋ฏธ ๋ก๊ทธ์ธ ์ค';
Handler.result += ` (+ ์๋ ํ์ ${Handler.count++}๋ฒ)`;
return Handler.result;
},
},
{
match(isLogin, checkToken, user) {
return !checkToken ? true : false; // 2. ํ ํฐ ์กด์ฌ ํ์ธ
},
action(isLogin, checkToken, user) {
throw new Error('์๋ฌ - ํ ํฐ์ด ์์ต๋๋ค !');
},
},
{
match(isLogin, checkToken, user) {
return user.nickName == undefined ? true : false; // 3. ๊ฐ์
์ฌ๋ถ ์ฌํ์ธ
},
action(isLogin, checkToken, user) {
registerUser(user); // ํ์ ๊ฐ์
ํ๊ธฐ
Handler.result = 'ํ์๊ฐ์
์ฑ๊ณต';
Handler.result += ` (+ ์๋ ํ์ ${++Handler.count}๋ฒ)`;
return Handler.result;
},
},
{
match(isLogin, checkToken, user) {
return true; // ๋ง์ง๋ง ํธ๋ค๋ฌ ๋ถ๋ถ์ด๋๊น ๋ฐ๋ก action() ์ด ์คํ๋๋๋ก
},
action(isLogin, checkToken, user) {
refreshToken(); // ํ ํฐ ๋ฐ๊ธ
Handler.result = '๋ก๊ทธ์ธ ์ฑ๊ณต';
Handler.result += ` (+ ์๋ ํ์ ${++Handler.count}๋ฒ)`;
return Handler.result;
},
},
],
};
const socialLogin = (isLogin, checkToken, user) => {
let result = '';
// {march, action} ํธ๋ค๋ฌ ๊ฐ์ฒด๊ฐ ๋ค์ด์๋ ์์ฌ ๊ฒฐ์ ๊ท์น ๋ฐฐ์ด rules๋ฅผ ์ํํ๋ฉด์
for (const rule of Handler.rules) {
// ๋ง์ผ ํด๋น ๋ถ๊ธฐ์ ํด๋น๋๋ฉด
if (rule.match(isLogin, checkToken, user)) {
result += rule.action(isLogin, checkToken, user); // ๊ทธ ๋ถ๊ธฐ์ ์คํ๋ถ๋ฅผ ํธ์ถํ๋ค
return result;
}
}
};
console.log(loginService(false, true, { nickName: 'inpa' })); // ๋ก๊ทธ์ธ ์ฑ๊ณต (+ ์๋ ํ์ 1๋ฒ)
console.log(loginService(true, false, { nickName: 'inpa' })); // ์ด๋ฏธ ๋ก๊ทธ์ธ ์ค (+ ์๋ ํ์ 1๋ฒ)
console.log(loginService(false, true, {})); // ํ์๊ฐ์
์ฑ๊ณต (+ ์๋ ํ์ 1๋ฒ)
console.log(loginService(false, false, { nickName: 'inpa' })); // Error: ์๋ฌ - ํ ํฐ์ด ์์ต๋๋ค !
# ์ฐธ๊ณ ์๋ฃ
FE์ฌ๋จ ์ ํ๋ธ - if else แ แ ตแแ ขแจแแ ฉแ แ ตแผ
https://javascript.plainenglish.io/how-to-refactor-your-complex-nested-if-else-code-28aa162047d5