๐Ÿ”ฅ Develop/Git

[Git] Fix vs Refactor

์œค๋„๊ธฐ 2024. 10. 19. 16:08
๋ฐ˜์‘ํ˜•

 

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

 

Fix: ๋ฒ„๊ทธ ์ˆ˜์ •

fix๋Š” ๊ธฐ์กด ์ฝ”๋“œ์˜ ๋ฒ„๊ทธ๋‚˜ ์˜ค๋ฅ˜๋ฅผ ์ˆ˜์ •ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์˜๋„ํ•œ ๋™์ž‘์ด ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ
  • API ํ˜ธ์ถœ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒฝ์šฐ ์ˆ˜์ •

๋กœ๊ทธ์ธ ํ•จ์ˆ˜๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

// ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š” ๊ธฐ์กด ์ฝ”๋“œ
function login(username, password) {
  if (username === '' || password === '') {
    return 'Error: Empty fields';
  }

  // ์ž˜๋ชป๋œ ์กฐ๊ฑด์œผ๋กœ ์ธํ•ด ํ•ญ์ƒ ๋กœ๊ทธ์ธ ์‹คํŒจ
  if (username !== 'admin' && password !== '1234') {
    return 'Login failed';
  }

  return 'Login successful';
}

์œ„ ์ฝ”๋“œ๋Š” username๊ณผ password ๋ชจ๋‘ ๋งž์•„์•ผ ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•ด์•ผ ํ•˜์ง€๋งŒ, ์กฐ๊ฑด์ด ์ž˜๋ชป๋˜์–ด ํ•ญ์ƒ ๋กœ๊ทธ์ธ ์‹คํŒจ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

// ์ˆ˜์ •๋œ ์ฝ”๋“œ
function login(username, password) {
  if (username === '' || password === '') {
    return 'Error: Empty fields';
  }

  // ๋…ผ๋ฆฌ ์˜ค๋ฅ˜ ์ˆ˜์ •
  if (username !== 'admin' || password !== '1234') {
    return 'Login failed';
  }

  return 'Login successful';
}

์ด๋Ÿฐ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

fix: ๋กœ๊ทธ์ธ ์กฐ๊ฑด ๋…ผ๋ฆฌ ์˜ค๋ฅ˜ ์ˆ˜์ •

 

Refactor: ์ฝ”๋“œ ๊ตฌ์กฐ ๊ฐœ์„ 

refactor๋Š” ๊ธฐ๋Šฅ์˜ ๋ณ€๊ฒฝ ์—†์ด ์ฝ”๋“œ์˜ ๊ตฌ์กฐ๋‚˜ ๊ฐ€๋…์„ฑ์„ ๊ฐœ์„ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌํŒฉํ† ๋ง์€ ์™ธ๋ถ€ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ฝ”๋“œ์˜ ๋™์ž‘์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ , ์ฝ”๋“œ์˜ ํ’ˆ์งˆ์„ ๋†’์ด๊ธฐ ์œ„ํ•œ ๋ณ€๊ฒฝ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

  • ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๋Š” ๊ฒฝ์šฐ
  • ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ์œ„ํ•ด ๋ณ€์ˆ˜๋ช…์„ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ

์œ„์™€ ๋™์ผํ•˜๊ฒŒ ๋กœ๊ทธ์ธ ํ•จ์ˆ˜๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค:

// ๊ธฐ์กด ์ฝ”๋“œ
function login(username, password) {
  if (username === '' || password === '') {
    return 'Error: Empty fields';
  }

  if (username !== 'admin' || password !== '1234') {
    return 'Login failed';
  }

  return 'Login successful';
}

์ค‘๋ณต๋œ ์กฐ๊ฑด ๊ฒ€์‚ฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

// ๋ฆฌํŒฉํ† ๋ง๋œ ์ฝ”๋“œ
function isEmptyField(value) {
  return value === '';
}

function isValidCredentials(username, password) {
  return username === 'admin' && password === '1234';
}

function login(username, password) {
  if (isEmptyField(username) || isEmptyField(password)) {
    return 'Error: Empty fields';
  }

  if (!isValidCredentials(username, password)) {
    return 'Login failed';
  }

  return 'Login successful';
}

์ด๋Ÿฐ ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

refactor: ์ค‘๋ณต๋œ ํ•„๋“œ ๊ฒ€์‚ฌ์™€ ์ธ์ฆ ๋กœ์ง ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌ

 

Fix vs Refactor: ๊ฒฝ๊ณ„๊ฐ€ ๋ชจํ˜ธํ•œ ๊ฒฝ์šฐ

๊ทธ๋ ‡๋‹ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”? ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐฐ์—ด์—์„œ ํŠน์ • ํ•ญ๋ชฉ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค:

// ๊ธฐ์กด ์ฝ”๋“œ
function hasItem(arr, item) {
  for (let i = 0; i < arr.length; i++) {
    if (arr[i] === item) {
      return true;
    }
  }
  return false;
}

์ด ์ฝ”๋“œ๋Š” ์ž‘์€ ๋ฐฐ์—ด์—์„œ๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ, ๋ฐฐ์—ด ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด Set์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

// ์ˆ˜์ •๋œ ์ฝ”๋“œ
function hasItem(arr, item) {
  const set = new Set(arr);
  return set.has(item);
}

์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ์„ ์ปค๋ฐ‹ํ•  ๋•Œ, fix์™€ refactor ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ์š”? ์ด๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • Fix ๊ด€์ : ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒฝ์šฐ, ์ด๋ฅผ "๋ฒ„๊ทธ"๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋А๋ฆฐ ์„ฑ๋Šฅ๋„ ์ผ์ข…์˜ ๋ฒ„๊ทธ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๊ด€์ ์—์„œ๋Š” 'fix'๊ฐ€ ์ ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Refactor ๊ด€์ : ์ฝ”๋“œ์˜ ์™ธ๋ถ€ ๋™์ž‘(ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ)์€ ๋ณ€ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹จ์ง€ ๋‚ด๋ถ€ ๊ตฌํ˜„๋งŒ ๊ฐœ์„ ๋˜์—ˆ์ฃ . ์ด๋Š” ์ „ํ˜•์ ์ธ ๋ฆฌํŒฉํ† ๋ง์˜ ํŠน์ง•์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 'refactor'๋กœ ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ๊ฒฝ๊ณ„๊ฐ€ ๋ชจํ˜ธํ•œ ์ƒํ™ฉ์—์„œ๋Š” ์ •๋‹ต์ด ์—†์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ ํŒ€์˜ ์ปจ๋ฒค์…˜๊ณผ ํ•ด๋‹น ๋ณ€๊ฒฝ์˜ ์ฃผ์š” ๋ชฉ์ ์„ ๊ณ ๋ คํ•ด ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

๊ฒฐ๊ตญ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์˜ ํ•ต์‹ฌ์€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์žˆ์Šต๋‹ˆ๋‹ค. fix๋‚˜ refactor ๊ฐ™์€ ๋‹จ์–ด ์„ ํƒ๋ณด๋‹ค๋Š” ๋ณ€๊ฒฝ ์ด์œ ์™€ ๊ทธ ์˜ํ–ฅ์„ ์ž˜ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๊ฒŒ ๋” ์ค‘์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•