Language/JavaScript

โš™๏ธ ๋‚œ์žกํ•œ if-else ๋ฌธ ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋ฒ• (๊ฐ€๋…์„ฑ & ์„ฑ๋Šฅ↑)

์ธํŒŒ_ 2023. 4. 13. 08:19

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ-if์ตœ์ ํ™”

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์กฐ๊ฑด๋ฌธ ๋ฆฌํŒฉํ† ๋ง

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

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ-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;
}

์ด ์ฝ”๋“œ ๋ชจ์Šต์„ ๋Œ€์ถฉ ๊ทธ๋ฆผ์œผ๋กœ ํ๋ฆ„๋„๋ฅผ ํ‘œํ˜„ํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋  ๊ฒƒ์ด๋‹ค.

js-Early-Return

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

 

Early Return ๋ฆฌํŒฉํ† ๋ง ์ˆœ์„œ

 

1. if๋ฌธ ๋‹ค์Œ์— ๋‚˜์˜ค๋Š” ๊ณตํ†ต๋œ ์ ˆ์ฐจ๋ฅผ ์ฒซ๋ฒˆ์งธ ๋ถ„๊ธฐ์  ๋‚ด๋ถ€์— ๊ฐ๊ฐ ๋„ฃ๋Š”๋‹ค

์ฝ”๋“œ ์ค‘๋ณต์„ ํ”ผํ•˜๋ ค๊ณ  ๊บผ๋‚ด๋†จ๋”๋‹ˆ ๊ฑฐ๊พธ๋กœ๋กœ ๋‹ค์‹œ ์ค‘๋ณต ์‹œ์ผœ๋†“๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ผ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ์ด๋Š” ๋ฆฌํŒฉํ† ๋ง์— ์žˆ์–ด ํ•„์š”ํ•œ ๊ณผ์ •์ด๋‹ˆ ๊ทธ๋Œ€๋กœ ์ดํ–‰ํ•˜์ž.

์ด๋•Œ ์—ฌ๊ธฐ์„œ ์ฒซ๋ฒˆ์งธ ๋ถ„๊ธฐ์ ์ด๋ž€, ์ฝ”๋“œ ๋ ˆ๋ฒจ์˜ ์ฒซ if๋ฌธ์„ ๋งํ•œ๋‹ค. ์ฆ‰, if๋ฌธ ์•ˆ์˜ if๋ฌธ ๊ฐ™์€ ๊ฒฝ์šฐ ์ œ์™ธ ๋œ๋‹ค.

js-Early-Return

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๋ฌธ์„ ๋งŒ๋“ค์–ด ๋ฒ„๋ฆฌ๊ณ  ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค. (๊ทธ๊ฒŒ ๊ทธ๊ฑฐ๊ธฐ ๋•Œ๋ฌธ)

js-Early-Return

 

3. ์งง์€ ์ ˆ์ฐจ๊ฐ€ ๋๋‚˜๋ฉด return(ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ๊ฒฝ์šฐ)์ด๋‚˜ break(for๋ฌธ ๋‚ด๋ถ€์˜ ๊ฒฝ์šฐ) ๋กœ ์ผ์ฐ ์ค‘๋‹จ์ ์„ ์ถ”๊ฐ€ํ•œ๋‹ค

๋ณธ๋ฌธ์˜ ์˜ˆ์ œ๋Š” ํ•จ์ˆ˜๋ฌธ ์ด๊ณ , ์ด๋ฏธ ๋ฆฌํ„ด๋ฌธ์„ ์œ„๋กœ ์˜ฌ๋ ธ์œผ๋‹ˆ ๊ทธ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋œ๋‹ค.

js-Early-Return

โ€‹

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๋ฒˆ ๋ถ€ํ„ฐ ๋Œ์•„๊ฐ€ ์ž‘์—…์„ ๋ฐ˜๋ณตํ•œ๋‹ค

js-Early-Return
๊ณตํ†ต๋œ ์ ˆ์ฐจ๋ฅผ ์ฒซ๋ฒˆ์งธ ๋ถ„๊ธฐ์  ๋‚ด๋ถ€์— ๋„ฃ๋Š”๋‹ค
js-Early-Return
๋ถ„๊ธฐ์ ์—์„œ ์งง์€ ์ ˆ์ฐจ๋ถ€ํ„ฐ ์‹คํ–‰ํ•˜๊ฒŒ if๋ฌธ์„ ๋ฐ˜์ „ํ•œ๋‹ค
js-Early-Return
else๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค (์ค‘์ฒฉ์ด ํ•˜๋‚˜ ์ œ๊ฑฐ๋œ๋‹ค)

 

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;
}

js-Early-Return
js-Early-Return

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'));

js-Lookup-Table

 else if์˜ ์—ฐ์†์œผ๋กœ, ์ด ์ฝ”๋“œ ๋ชจ์Šต์„ ๋Œ€์ถฉ ๊ทธ๋ฆผ์œผ๋กœ ํ๋ฆ„๋„๋ฅผ ํ‘œํ˜„ํ•˜์ž๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋  ๊ฒƒ์ด๋‹ค.

js-Lookup-Table

๋ณด๊ธฐ์—” ๊ฐ€๋…์„ฑ ๋ฉด์—์„œ ๊ทธ๋ ‡๊ฒŒ ํฐ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์•„ ๋ณด์ด์ง€๋งŒ, ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ์˜ ์ฝ”๋“œ๋ฅผ ์ข€๋” ํšจ์œจ์ ์œผ๋กœ ์งค ์ˆ˜ ๊ฐ€ ์žˆ๋‹ค.

 

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) ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ• ๋‹นํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ ๊ฒฐ๊ณผ๊ฐ’์„ ์–ป๋Š”, ๋งˆ์น˜ ์•„๋ฆ„๋‹ค์šด(?) ์ฝ”๋“œ ๋””์ž์ธ ํŒจํ„ด์˜ ์ผ์ข…์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

lookuptable

์ฒ˜์Œ ๊ทธ๋ฆผ๊ณผ ๋น„๊ตํ•˜์ž๋ฉด, ๊ธฐ์กด์—๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ถ„๊ธฐ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ์ผ์ผํžˆ ๊ฐ A, B, C ๋ถ„๊ธฐ๋ฅผ ์ผ์ผํžˆ ๋ชจ๋‘ ์ˆœํšŒํ•˜์—ฌ์•ผ ํ•˜์ง€๋งŒ, Lookup Table ๊ธฐ๋ฒ•์„ ์ ์šฉํ•˜๋ฉด ๋ชจ๋“  ์กฐ๊ฑด์„ ์ˆœํšŒํ•  ํ•„์š”์—†์ด ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์— ๋”ฐ๋ผ ์ด์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด์˜ key-value ๊ตฌ์„ฑ์— ๋”ฐ๋ผ ๊ฐ๊ฐ์˜ ๋…ผ๋ฆฌ๋Š” ๋ณ„๋„์˜ ํ•จ์ˆ˜๋กœ ๋‹ค์‹œ ์ž‘์„ฑ๋˜๋ฏ€๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์‹์œผ๋กœ ๊ตฌ์„ฑํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋ถ„๊ธฐ์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋Š” ํ˜•ํƒœ๊ฐ€ ๋˜๊ณ  ์ด๋Š” ๊ณง ์„ฑ๋Šฅ ํ–ฅ์ƒ์œผ๋กœ ์ง๊ฒฐ๋˜๊ฒŒ ๋œ๋‹ค.


Responsibility chain pattern

๋‹ค๋งŒ Lookup Table ๊ธฐ๋ฒ•์€ ๋งค์น˜๋œ ๋ถ„๊ธฐ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ ๋ถ„๊ธฐ๋งŒ ์‹คํ–‰ํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  key ๋งค์นญ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์˜ ์ธ์ž๊ฐ’(where)์— ๋Œ€ํ•ด์„œ๋งŒ ๋น„๊ต๋ฅผ ํ•˜๋‹ˆ ๋งŒ์ผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์ž๋ฅผ ๋น„๊ตํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์ ํ•ฉํ•˜์ง€๊ฐ€ ์•Š๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ด์— ๋Œ€ํ•œ ๋Œ€์‘ ๊ธฐ๋ฒ•์œผ๋กœ ์ฑ…์ž„ ์—ฐ์‡„ ํŒจํ„ด(Chain Responsility Pattern)์ด ์กด์žฌํ•œ๋‹ค.

์ฑ…์ž„ ์—ฐ์‡„ ํŒจํ„ด์€ GOF ๋””์ž์ธ ํŒจํ„ด์˜ ํ•œ ์ข…๋ฅ˜๋กœ์„œ, ๋ถ„๊ธฐ๋ฌธ์˜ ๋ธ”๋Ÿญ๋“ค์„ ๊ฐ์ฒดํ™” ํ•˜์—ฌ, ๋‹ค์ˆ˜์˜ ์ฒ˜๋ฆฌ ๊ฐ์ฒด(ํ•ธ๋“ค๋Ÿฌ)๋“ค์„ ์ฒด์ธ ํ˜•ํƒœ๋กœ ๋ฌถ๋Š” ํŒจํ„ด์ด๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋– ํ•œ ์š”์ฒญ์ด ๋ฐœ์ƒํ•˜์˜€์„ ๋•Œ ๊ทธ ์š”๊ตฌ๋ฅผ ์ฒ˜๋ฆฌํ•  ๊ฐ์ฒด ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ˆœํšŒํ•˜๋Š” ์‹์œผ๋กœ ํ•˜์—ฌ ๋ถ„๊ธฐ๋ฌธ์„ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ธฐ๋ฒ•์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

Responsibility chain pattern
๊ฐ ๋„ค๋ชจ ๋ฐ•์Šค์˜ ํ•ธ๋“ค๋Ÿฌ๋“ค์ด ์—ฐ์‡„์ ์œผ๋กœ ์ž‘์šฉ๋œ๋‹ค

 

์œ„์˜ 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: ์—๋Ÿฌ - ํ† ํฐ์ด ์—†์Šต๋‹ˆ๋‹ค !

Responsibility chain pattern

์ด ์ž์ฒด๋กœ๋„ ๋ฌธ์ œ๋Š” ์—†์ง€๋งŒ ๋งŒ์ผ ์ƒˆ๋กœ์šด ๋ถ„๊ธฐ๋ฌธ์ด ์ถ”๊ฐ€๋  ๊ฒฝ์šฐ ํ•จ์ˆ˜ ์ฝ”๋“œ ์ž์ฒด๋ฅผ ํ†ต์งœ๋กœ ๋œฏ์–ด ๊ณ ์ณ์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Š” ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ์•ˆ์— ์—ฌ๋Ÿฌ๊ฐ€์ง€์˜ ์ธ์ž์— ๋Œ€ํ•œ ์กฐ๊ฑด ํŒ๋‹จ์„ ํ•˜๋Š” ์ฑ…์ž„์„ ์ค‘์•™ ์ง‘๊ถŒ ์ ์œผ๋กœ ๋ชจ์•„์ ธ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•œ ์ฑ…์ž„ ์—ฐ์‡„ ํŒจํ„ด ์„ค๊ณ„

๋”ฐ๋ผ์„œ ์œ„์˜ Early Return ์˜ˆ์ œ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ฑ…์ž„ ์—ฐ์‡„ ํŒจํ„ด์œผ๋กœ ์žฌ๊ตฌ์„ฑ ํ•ด๋ณด์ž. ์ฝ”๋“œ๋ฅผ ์ž๋ฐ”(Java) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์Šค๋Ÿฝ๊ฒŒ ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด ์„ค๊ณ„ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

[GOF] ๐Ÿ’  Chain Of Responsibility ํŒจํ„ด - ์™„๋ฒฝ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ

Chain Of Responsibility Pattern ์ฑ…์ž„ ์—ฐ์‡„ ํŒจํ„ด(Chain Of Responsibility Pattern, COR)์€ ํด๋ผ์ด์–ดํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ ์„ธ์„ธํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๊ฐ€ ๋ชฝ๋•… ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ฒ˜๋ฆฌ ๊ฐ์ฒด๋“ค๋กœ ๋‚˜๋ˆ„๊ณ , ์ด๋“ค์„ ์‚ฌ

inpa.tistory.com

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) { /* ... */ }
    }
]

Responsibility chain pattern
Responsibility chain pattern

 

์ด๋Ÿฌํ•œ ๊ธฐ๋ฒ•์„ ์ด์šฉํ•ด์„œ ์ตœ์ข…์œผ๋กœ ๊ตฌ์„ฑํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฑ…์ž„ ์—ฐ์‡„ ํŒจํ„ด ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

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