โŒ if-else-return โ†’ ๐ŸŸข if-return-return

์–ด๋Š ์ˆœ๊ฐ„๋ถ€ํ„ฐ ์กฐ๊ฑด๋ฌธ์„ ์“ธ ๋•Œ ์ฃผ์ ˆ(main clause)์— ํ•ด๋‹นํ•˜๋Š” ์ผ€์ด์Šค์ธ์ง€๋ฅผ ๋จผ์ € ์ฒดํฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ

async function onSubmitForm () {
  if (isValidForm) {
    const formattedForm = formatForm()
    await submitForm(formatForm())
  } else {
    showErrorMsg()
  }
}

์˜ˆ์™ธ์ ˆ์— ํ•ด๋‹นํ•˜๋Š”์ง€๋ฅผ ย ๋จผ์ € ์ฒดํฌํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

async function onSubmitForm () {
    if (!isValidForm) return showErrorMsg()
    const formattedForm = formatForm()
    await submitForm(formatForm())
}

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ if ์™€ ๊ผญ ํ•œ ์„ธํŠธ์ฒ˜๋Ÿผ ์ผ๋˜ else ๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋Œ€์‹  ์˜ˆ์™ธ์ ˆ์—๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋ฉด์„œ if ๋ธ”๋ก ์•ˆ์—์„œ ๋ฐ”๋กœ return์„ ์‹œ์ผฐ๋‹ค. ๊ฐ•์˜๋ฅผ ๋“ค์œผ๋ฉฐ ๋”ฐ๋ผ ์นœ ์ฝ”๋“œ๋‚˜ ์‹œ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๋“ค์˜ ์ฝ”๋“œ๋กœ๋ถ€ํ„ฐ ๋ฐฐ์šด ๊ฒƒ์ธ๋ฐ nesting์„ ์ค„์ผ ์ˆ˜ ์žˆ์–ด ๊ฐ€๋…์„ฑ์ด ๋” ์ข‹์•„์กŒ๊ณ  ย ๋˜ ์˜ˆ์™ธ ์ผ€์ด์Šค๋ฅผ ํ•จ์ˆ˜ ์ฒซ๋จธ๋ฆฌ์—์„œ ๋ชจ๋‘ ์ฒดํฌํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ฃผ์š” ๋กœ์ง์„ ์ž‘์„ฑํ•˜๊ธฐ๋•Œ๋ฌธ์— ์•ˆ์‹ฌ์ด ๋˜์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ย ๊ทธ ๋’ค๋กœ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•  ๋•Œ๋„ ํŒ€์›์ด if-else-return ๊ตฌ์กฐ๋กœ ์ง  ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ž์—ฐํžˆ if-return-return ๊ตฌ์กฐ๋กœ ๋ฐ”๊พธ๊ณ ํ”ˆ ์ถฉ๋™์ด ๋“ค์—ˆ๋‹ค. ํ•˜์ง€๋งŒ '๊ฐ€๋…์„ฑ์ด ์ข‹๋‹ค'๊ฑฐ๋‚˜ '์•ˆ์‹ฌ์ด ๋œ๋‹ค'์™€ ๊ฐ™์€ ๊ฒƒ์ด ๋‹ค์†Œ ์ฃผ๊ด€์ ์ธ ์ธ์ƒ ๋งŒ ๊ฐ€์ง€๊ณ  ์ž˜ ๋Œ์•„๊ฐ€๋Š” ์ฝ”๋“œ๋ฅผ ๊ณ ์ณ์“ฐ์ž๊ณ  ํ•˜๊ธฐ์—๋Š” ์„ค๋“๋ ฅ์ด ์—†์—ˆ๋‹ค. ๋‚˜ ํ˜ผ์ž ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜๋Š”๊ฑด ์•„๋‹ˆ์—ˆ๋Š”์ง€ Stack Overflow์—๋„ if-else-return ๊ฐ€ ๋‚˜์€์ง€ if-return-return์ด ๋‚˜์€์ง€์— ๋Œ€ํ•œ ์—ด๋ค ํ† ๋ก ์ด ์ง„ํ–‰์ค‘์ด์—ˆ๋‹ค(๐Ÿ”— "It is more efficient to use if-return-return or if-else-return?"). ํ•ด๋‹น ์“ฐ๋ ˆ๋“œ์—์„œ๋Š” ๋‘ ์Šคํƒ€์ผ๊ฐ„์˜ ์„ฑ๋Šฅ ์ฐจ์ด๋Š” ์—†๋‹ค๊ณ  ํ•˜๋Š”๋ฐ ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  if-return-return์„ ๋ณด๋‹ค ๋‚˜์€ ๊ตฌ์กฐ๋ผ๊ณ  ๋ณด๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค.

์ข€ ๋” ์กฐ์‚ฌ๋ฅผ ํ•ด๋ณด๋‹ˆ ํด๋ฆฐ ์ฝ”๋“œ์™€ ๋ฆฌํŒฉํ† ๋ง์˜ ๋ฐ”์ด๋ธ”๊ณผ๋„ ๊ฐ™์€ ์ฑ…์ธ Martin Fowler์˜ ใ€ŽRefactoringใ€์—์„œ๋„ ์ด ๋ถ€๋ถ„์„ ๋”ฐ๋กœ ์–ธ๊ธ‰ํ•˜๊ณ ์žˆ์—ˆ๋‹ค. ์ฑ…์—์„œ๋„ nesting๋œ ์กฐ๊ฑด๋ฌธ์€ ๋ฆฌํŒฉํ† ๋ง ๋Œ€์ƒ์ด๋ผ๊ณ  ๋งํ•œ๋‹ค. ์ด์œ ๊ฐ€ ๋ญ˜๊นŒ? ย ์ด๋ฒˆ ๊ธฐํšŒ์— if-else-return๊ณผ if-return-return์˜ ์ฐจ์ด๋ฅผ ๋ณด๋‹ค ์ฒด๊ณ„์ ์œผ๋กœ ์ •๋ฆฌํ•ด ๋ณด์•˜๋‹ค.

if-return-return ๊ตฌ์กฐ์˜ if์€ ย ๋”ฐ๋กœ ์ด๋ฆ„๊นŒ์ง€ ๊ฐ–๊ณ  ์žˆ๋‹ค๋Š”๊ฑธ ์•Œ๊ฒŒ ๋๋‹ค. ๋ฐ”๋กœ "guard clause"๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ž…๋ ฅ๊ฐ’์ด ๋‹ค ์ž…๋ ฅ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์œ ํšจํ•œ ์–‘์‹์ด ์•„๋‹ˆ๊ฑฐ๋‚˜ ํ•˜๋Š” ์˜ˆ์™ธ ์ผ€์ด์Šค๊ฐ€ ์‹ค์ œ๋กœ ์ž‘์„ฑํ•œ ํผ์„ ์ œ์ถœํ•˜๋Š” ์ฃผ์ ˆ์˜ ๋กœ์ง์„ ํƒ€์ง€ ๋ชปํ•˜๋„๋ก ๋ง‰๋Š” ๋ฌธ์ง€๊ธฐ(guard)์˜ ์—ญํ• ์„ ํ•˜๋Š” ์ ˆ(clause)์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์ด guard clause๋ฅผ ์“ฐ๋ฉด ์–ด๋–ค ์ ์—์„œ ์œ ๋ฆฌํ•œ๊ฑธ๊นŒ?

if-return-return

function doSomething () {
  if (!isInvalid) {
    return ERROR_MSG
  } 
  return VALUE
}

๐ŸŸข ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๋‹ค: ์•ž์„œ ๋งํ–ˆ๋˜ ๊ฒƒ์ฒ˜๋Ÿผ nesting์„ ์ค„์—ฌ์„œ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง„๋‹ค

๐ŸŸข ํ•จ์ˆ˜๊ฐ€ ํ•˜๋Š” ์ผ์ด ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฝ๋‹ค: ย guard clause๋ฅผ ์“ฐ๋ฉด ์˜ˆ์™ธ์ ˆ๋งŒ nestingํ•˜๊ณ  ์ฃผ์ ˆ์€ ํ•จ์ˆ˜ ๋ณธ์ฒด์— ๋ฐ”๋กœ ์ž‘์„ฑํ•˜๊ธฐ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์˜ ์—ญํ• ์„ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด๋‹ค ์ž˜ ๋“œ๋Ÿฌ๋‚ธ๋‹ค.

๐ŸŸข ์ฝ”๋“œ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„(coupling)๋ฅผ ์ค„์ธ๋‹ค: if-return-return ๊ตฌ์กฐ์—์„œ๋Š” ๋” ์ด์ƒ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์กŒ์„ ๊ฒฝ์šฐ์— if์ ˆ๋งŒ ํ†ต์งธ๋กœ ๋“ค์–ด๋‚ด๋ฉด ๋œ๋‹ค. ๋ฐ˜๋ฉด ๊ฐ™์€ ๋กœ์ง์„ if-else-return ๊ตฌ์กฐ๋กœ ์ž‘์„ฑํ–ˆ์„ ๊ฒฝ์šฐ ์•ž์˜ if๋ฅผ ์ง€์šฐ๋ฉด ๋’ค์˜ else๋„ ๊ฐ™์ด ์ง€์šฐ๊ณ  else ์ ˆ ์•ˆ์— ๋“ค์–ด์žˆ๋˜ ์ฝ”๋“œ๋“ค ์ „์ฒด๋ฅผ ๊ด„ํ˜ธ ๋ฐ”๊นฅ์œผ๋กœ ๊บผ๋‚ด๋Š” ๋“ฑ ๋ณด๋‹ค ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๊ณ ์ณ์•ผํ•œ๋‹ค. ์ฝ”๋“œ๋“ค๊ฐ„์— ์˜์กด์„ฑ, ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๊ฒฐํ•ฉ๋„(coupling)๊ฐ€ ์ƒ๊ธด ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฌํ•œ ์˜์กด์„ฑ์„ if-return-return ๊ตฌ์กฐ์—์„œ๋Š” ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

if-else-return

function doSomething () {
  if (isValid) {
    return VALUE
  } else {
    return ERROR_MSG
  }
}

โŒ ์ฃผ์ ˆ๊ณผ ์˜ˆ์™ธ์ ˆ์„ ๋ชจ๋‘ nestingํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ค ์ผ์„ ์ฒ˜๋ฆฌํ•˜๊ณ ์ž ํ•˜๋Š”์ง€๊ฐ€ ๋ˆˆ์— ์ž˜ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๋˜‘๊ฐ™์ด ๋“ค์—ฌ์“ฐ๊ธฐ๋œ ๋‘ ์ ˆ์ด ๋…ผ๋ฆฌ์ ์œผ๋กœ๋„ ๋™์ผํ•œ ์œ„์ƒ์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ doSomething ํ•จ์ˆ˜๊ฐ€ ํ•˜๊ณ ์‹ถ์€ ์ผ์€ VALUE๋ผ๋Š” ์œ ์˜๋ฏธํ•œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒƒ์ด์ง€ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ๋˜์ง€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์˜ˆ์™ธ์ ˆ๊ณผ ์ฃผ์ ˆ์— ๋“ค์–ด์˜ค๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก, ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์™ธ์ ˆ ๋‚ด์—์„œ ๋˜ ์˜ˆ์™ธ์ ˆ์ด ์ค‘์ฒฉ๋  ๊ฒฝ์šฐ ํ•จ์ˆ˜์˜ ์—ญํ• ์„ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ์ ์  ๋” ์–ด๋ ค์›Œ์ง„๋‹ค.

โŒ ์˜ˆ์™ธ์ ˆ๊ณผ ์ฃผ์ ˆ ์‚ฌ์ด์˜ ์—ฐ๊ด€์„ฑ์„ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋‹ค: if์ ˆ๊ณผ else ์ ˆ์€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์—ฐ๊ด€๋˜์–ด์žˆ๋Š”๋ฐ if์ ˆ๊ณผ else์ ˆ ๊ฐ๊ฐ์— ๋งŽ์€ ์–‘์˜ ์ฝ”๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€์žˆ์œผ๋ฉด ๋‘˜ ๊ฐ„์˜ ๋…ผ๋ฆฌ์  ์—ฐ๊ด€์„ ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๊ณ  ์ฝ”๋“œ ์œ„์•„๋ž˜๋ฅผ ์™”๋‹ค๊ฐ”๋‹ค ํ•ด์•ผํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ ์ˆ˜๊ณ ๊ฐ€ ๋“ ๋‹ค.

๐ŸŸข ๋‹ค๋งŒ Martin Fowler๋Š” ใ€ŽRefactoringใ€์—์„œ if-return-return๊ตฌ์กฐ์™€ if-else-return ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์กฐ๊ฑด๋ฌธ์€ ๊ฐ๊ฐ ๋‹ค๋ฅธ ์˜๋„๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ๋งํ•˜๊ณ ์žˆ๋‹ค. ์‹ค์ œ๋กœ if์ ˆ๊ณผ else์ด ๋™์ผํ•œ ์ค‘์š”๋„๋ฅผ ๊ฐ€์ง„๋‹ค๋ฉด ย if-else-return๊ตฌ์กฐ๋ฅผ ์ฒดํƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ์— if-else-return ๊ตฌ์กฐ๋Š” ๋ฆฌํŒฉํ† ๋ง ๋Œ€์ƒ์— ํ•ด๋‹นํ•œ๋‹ค.

Closing

์ž ์ด์ œ ์ž˜ ๊ธฐ์–ตํ•ด ๋†จ๋‹ค๊ฐ€ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋•Œ ์จ๋จน๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

References

Subscribe to go-kahlo-lee

Donโ€™t miss out on the latest issues. Sign up now to get access to the library of members-only issues.
jamie@example.com
Subscribe