[Git] Fix vs Refactor
์ปค๋ฐ ๋ฉ์์ง๋ฅผ ์์ฑํ ๋ ํญ์ ๊ณ ๋ฏผ๋๋ ๋ถ๋ถ์ด ์์ต๋๋ค. ๋ฐ๋ก ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ ๋ 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
๊ฐ์ ๋จ์ด ์ ํ๋ณด๋ค๋ ๋ณ๊ฒฝ ์ด์ ์ ๊ทธ ์ํฅ์ ์ ์ค๋ช
ํ๋ ๋ฐ ์ด์ ์ ๋ง์ถ๋ ๊ฒ ๋ ์ค์ํ ๊ฒ ๊ฐ์ต๋๋ค.