DAY 21
๐ย ์ค๋ ์ฝ์ ๋ฒ์ : Final mission
๐คย ์ฑ
์์ ๊ธฐ์ตํ๊ณ ์ถ์ ๋ด์ฉ
Final mission์ ์ํ ์ด์ ๋ฆฌ
- ์ฐ๋ฆฌ๋ ์ฝ๋์ ์ ์๋ค. ๋
์์ ์ ์ํตํ ์ ์๋ ๊นจ๋ํ ์ฝ๋๋ฅผ ์ธ ์ฑ
์์ด ์๋ค
- ์ฝ๋๋ฅผ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ค๋ฉด ์ง๊ธฐ๋ ์ฝ๋ค
- ์ค๋ณต ์ค์ด๊ธฐ, ํํ๋ ฅ ๋์ด๊ธฐ, ์ด๋ฐ๋ถํฐ ๊ฐ๋จํ ์ถ์ํ ๊ณ ๋ คํ๊ธฐ โ ์ง์ง ๋ฌธ์ ์ ์ ๊ฒฝ ์ธ ์ฌ์ ์๊น
- ์ข์ ์ด๋ฆ์ ์ง์ผ๋ ค๋ฉด ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง๋ง ์ข์ ์ด๋ฆ์ผ๋ก ์ ์ฝํ๋ ์๊ฐ์ด ํจ์ฌ ๋ ๋ง๋ค.
- ๋ณ์๊ฐ ๊ธธ๋ฉด ์คํ๋ ค ๊ฒ์ํ๊ธฐ ์ฝ๋ค.
- ๋ฐ์ํ๊ธฐ ์ฌ์ด ์ด๋ฆ์ ์ฌ์ฉํ๋ผ โ ์ ์ผ๋ฌด๋คํ์ฆ ๊ธ์ง
- ์์์ด๋ฆ์ ์ฌ๋์๊ฒ ํด๋์ค๋ ์ปดํ์ผ๋ฌ์๊ฒ
- ์ถ์์ ์ธ ๊ฐ๋
ํ๋์๋ ์ผ๊ด๋ ๋จ์ด๋ฅผ ์ ํํด ๊ณ ์ํ๋ผ
- IDE์ ์๋์์ฑ์ ์๊ฐํด์๋ผ๋ ๋ถํ์ํ ์ ๋์ฌ ๋ค ๋ถ์ด์ง๋ง์
- ํจ์์์ ๋ค์ฌ์ฐ๊ธฐ ์์ค์ 1๋จ์ด๋ 2๋จ์ ๋์ด์๋ฉด ์๋๋ค.
- ํ๊ฐ์ง(์ง์ ๋ ํจ์ ์ด๋ฆ ์๋์์ ์ถ์ํ ์์ค์ด ํ๋์ธ ๋จ๊ณ๋ง ์ํ) ๋ง ํด๋ผ
- ํจ์ ์ธ์๋ ์ ์ ์๋ก ์ข๋ค.
- ๋ถ์ ํจ๊ณผ๋ฅผ ์ผ์ผํค์ง ๋ง๋ผ!
- ๋ช
๋ น๊ณผ ์กฐํ๋ฅผ ๋ถ๋ฆฌํ๋ผ!
- ์ค๋ฅ ์ฝ๋๋ณด๋ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ!
- 500์ค์ ๋์ง์๋ ํ๊ท 200์ค์ ํ์ผ๋ก๋ ์ปค๋ค๋ ์์คํ
์ ๊ตฌ์ถํ ์ ์๋ค
- ์ ๋ฌธ ๊ธฐ์ฌ์ฒ๋ผ ์์ฑํ๋ผ: ์ถ์ํ โ ์ธ๋ถ์ , ์ ์ฌ๊ฐ๋
์ ๊ฐ๊น์ด
- ๊ฐ์ฒด๋ ์ ํ์
์ ์ถ๊ฐํ๊ธฐ๋ ์ฝ์ง๋ง ์ ๋์์ ์ถ๊ฐํ๊ธฐ๋ ์ด๋ ต๋ค
- ์๋ฃ ๊ตฌ์กฐ๋ ์ ํ์
์ ์ถ๊ฐํ๋๊ฑด ์ด๋ ต์ง๋ง ์ ๋์์ ์ถ๊ฐํ๊ธฐ๋ ์ฝ๋ค
- ์ฐ์ํ ๊ฐ๋ฐ์๋ ๋ฌด์กฐ๊ฑด ๊ฐ์ฒด์งํฅ์ด ์๋๋ผ ๊ฒฝ์ฐ์ ๋ฐ๋ผ์๋ ์ ์ฐจ์งํฅ์ ์๋ฃ๊ตฌ์กฐ๋ ์ ์ด๋ค
- ์ค๋ฅ๋ณด๋ค (๋ฏธํ์ธ)์์ธ๋ฅผ ํ์ฉํ๋ผ
- ์์ธ๋ฅผ ์ผ์ผํค๋ try-catch ๋จผ์ ์์ฑ ์ํค๊ณ ๋ก์ง์ ์ถ๊ฐํ์
- Error wrapper class ๋ฅผ ํ์ฉํด์ ์์กด์ฑ์ ์ค์ด์
- ํน์์ํฉ์ ๊ธฐ๋ณธ ๊ฐ์ผ๋ก ๋ฆฌํดํจ์ผ๋ก์ ๋ถํ์ํ ์๋ฌ ์ฒ๋ฆฌ(์ค๋จ)๋ฅผ ์ ๊ฑฐ
- NULL์ ๋ฐํํ์ง ๋ง๊ณ ์์ธ๋ ํน์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
- ๋ฉ์๋๋ก NULL์ ์ ๋ฌํ์ง ๋ง๊ณ ์๋ก์ด ์์ธ๋ฅผ ๋์ง๊ฑฐ๋ assert๋ฌธ ํ์ฉ
- ์๋ํ๋ ๋จ์ ํ
์คํธ ์ํธ๋ ๋ณ๊ฒฝ์ด ์ฌ์์ง๊ฒ ํจ โ ์ค๊ณ์ ์ํคํ
์ฒ๋ฅผ ์ต๋ํ ๊นจ๋ํ๊ฒ ๋ณด์กด ๊ฐ๋ฅ
- ๊ฐ๋
์ฑ์ ์ค์ ์ฝ๋๋ณด๋ค ํ
์คํธ ์ฝ๋์์ ๋ ์ค์ํ๋ค โ Build-Operate-Check ํจํด
- ํ
์คํธ ์ฝ๋๋ ์ค์ ์ฝ๋๋งํผ ํจ์จ์ ์ผ ํ์๋ ์๋ค โ ํ
์คํธ ํ๊ฒฝ์์ ์ํ๋๊ธฐ ๋๋ฌธ
- ๊ฐ๋
๋น assert๋ฌธ ์๋ฅผ ์ต์๋ก ์ค์ด์
- ํ
์คํธ ํจ์ ํ๋๋ ๊ฐ๋
ํ๋๋ง ํ
์คํธ
- ํ
์คํธ๋ Fast, Independent, Repeatable, Self-Validating, Timely ํด์ผํ๋ค
- ํด๋์ค ์ฑ
์์ ๊ฐ์๋ ์์์ผ ํ๋ค โ ๊ฐ๊ฒฐํ 25๋จ์ด ๋ด์ธ
- ์์ ์๋์ ๋ง์ด ๋๊ณ ๊ธฐ๋ฅ๊ณผ ์ด๋ฆ์ด ๋ช
ํํ ์ปดํฌ๋ํธ๋ฅผ ๋๋ ๋ฃ๊ธฐ
- ํด๋์ค๋ฅผ ๋ถ๋ฆฌํ์ฌ ์์ง๋๋ฅผ ๋์ฌ๋ผ
- ํด๋์ค๋ฅผ ์๊ฒ ๋ถ๋ฆฌํ์ฌ ๋ณ๊ฒฝํ๊ธฐ ์ฝ๋๋ก ํ๋ค
- ๊ตฌ์ฒด์ ์ธ ๊ตฌํ๋ณด๋ค๋ ์ถ์ํ๋ฅผ ํตํด ๋ณ๊ฒฝ์ผ๋ก๋ถํฐ ๊ฒฉ๋ฆฌํ๋ค
- SRP, OCP, DIP ์์น ์งํค๊ธฐ
1. ํ๊ฐ์ง(์ง์ ๋ ํจ์ ์ด๋ฆ ์๋์์ ์ถ์ํ ์์ค์ด ํ๋์ธ ๋จ๊ณ๋ง ์ํ) ๋ง ํด๋ผ
๐ฅฒ **Before**
const handleConnect = () => {
let config = data[dbIdx];
localStorage.setItem("alias", config.alias);
localStorage.setItem("config", JSON.stringify(config));
execPost("/connect", {
config: config,
})
.then((res) => {
console.log(res.data);
if (res.data === "CONNECTED") {
setIsConnected(true);
history.push("/dashboard");
}
})
.catch((err) => {
console.log(err);
});
};
๐ **After**
const handleConnect = () => {
let config = data[dbIdx];
saveConnect();
moveToDashboard();
};
const saveConnect = () => {
localStorage.setItem("alias", config.alias);
localStorage.setItem("config", JSON.stringify(config));
}
const moveToDashbaord = () => {
execPost("/connect", {
config: config,
})
.then((res) => {
console.log(res.data);
if (res.data === "CONNECTED") {
setIsConnected(true);
history.push("/dashboard");
}
})
.catch((err) => {
console.log(err);
});
}
- handleConnect์์ ํ๋ ์ผ์ด ์ฌ๋ฌ๊ฐ์ง์ฌ์ ๊ฐ๊ฐ์ ํจ์๋ก ๋ถ๋ฆฌํ์ฌ saveConnect์ moveToDashboard ๋ฅผ ์ํ
- argument์ ๋ํ ๊ฒ์ ํจ์ ๋ฐ์ ๊ฒ์ ์จ๋ ๊ด์ฐฎ์๊ฑด์ง ๋ค์ ๊ฒํ ๊ฐ ํ์ํ๋ค
2. ๋ฐ์ํ๊ธฐ ์ฌ์ด ์ด๋ฆ์ ์ฌ์ฉํ๋ผ
๐ฅฒ **Before**
const toYYYYMMDD = (date) =>
new Date(date - date.getTimezoneOffset() * 60000)
.toISOString()
.split("T")[0];
๐ **After**
const generateDate = (date) =>
new Date(date - date.getTimezoneOffset() * 60000)
.toISOString()
.split("T")[0];
- ์ฑ
์์ genymdhms์ ์ผ๋ฌด๋คํ์ฆ ๋ผ๋ ์ด๋ฆ์ ๋ดค์๋๋ ๋ฐ์ฅ๋์ํ๋ค. ํ์ง๋ง ๋์๊ฒ๋ ์์๋ค.. ํฌ์์ด์์ด์์ด์์ด์ ์ ๋๋ ๊ฐ...
- ๋น์ฅ ํจ์ ์ด๋ฆ์ ๋ฐ๊ฟจ๋ค โ generateDate ๋ก
3. NULL์ ๋ฐํํ์ง ๋ง๊ณ ์์ธ๋ ํน์ ๊ฐ์ฒด๋ฅผ ๋ฐํ
๐ฅฒ **Before**
function closePool(name) {
if (Object.prototype.hasOwnProperty.apply(POOLS, [name])) {
const pool = POOLS[name];
delete POOLS[name];
if (typeof pool.close === "function") {
return pool.close();
} else {
return null;
}
}
}
๐ **After**
function closePool(name) {
if (Object.prototype.hasOwnProperty.apply(POOLS, [name])) {
const pool = POOLS[name];
delete POOLS[name];
if (typeof pool.close === "function") {
return pool.close();
} else {
throw Error("Could not close pool")
}
}
}
- Pool์ close ํ ์ ์์ ๋ null์ returnํ๋ ๊ฒ์ด ์๋๋ผ ํ์คํ Error ์ throw ํ๋ ๊ฒ์ผ๋ก ๋ณ๊ฒฝ
๐คย ๋ ์ค๋ฅด๋ ์๊ฐ
- ์ผ๋จ ์์ ํ ์ฝ๋์ ์์ด ๋ถ์กฑํ๋ค. ์ง๊ธ๊น์ง ์์ฑํ ์ฝ๋๋ ๋ ํฌ์ ๊ฐ์๋ ๋ง๋ค๊ณ ์๊ฐํ์ผ๋ ์ค์ ๋ก ์ดํด๋ณด๋ฉด ๋๋ถ๋ถ์ ์ฝ๋๊ฐ ํ๋ก ํธ์๋์ด๊ณ ๋๊ผฌ์์ ๊ฐ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ด๋ฏธ ์์ ํจ์๋ก ์ ์ชผ๊ฐ์ ธ ์์ด ์์๋ฅผ ์ฐพ๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ค์ ๋ค.
๐ย ์ง๋ฌธ
๐ย ์๊ฐ 3์ค ์์ฝ
- ๋ง์ ๋ ์์ ์ ์ฝ๋์์ ์ฑ
์ ๋ด์ฉ์ ์ ์ฉํ์ฌ ๋๋ฌ์์ ์ฐพ์ผ๋ ค๋ ์ด๋ ค์ ๋ค
- ์ฒญ์ํ ๊ฑฐ๋ฆฌ๋ฅผ ๋ง๋ค ์ ์๊ฒ ์คํฌ๋์น๋ถํฐ ์์ฑํ๋ ์ฝ๋์ ์์ ๋๋ ค์ผ ๊ฒ ๋ค
- Refactoring์ ์ ๋ง ๋ง์ ์๊ฐ๊ณผ ๋
ธ๋ ฅ์ ๋ค์ฌ ์ง์์ ์ผ๋ก ์ํํด์ผ๊ฒ ๋ค