LG์ ํ๋ฌ์ค์์ 1๋ 4์๋์ ์ฌ์งํ๋ฉฐ, Javascript์ ๊ฐ๋ ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณ ๋ฏผํ์ต๋๋ค.
์์ํ๊ธฐ์ ์์ ๐โ
๋น์ ๊ฐ๋ฐํ๊ฒฝ์ด ๋งค์ฐ ํน์ดํ๊ณ , ์ด๋ ค์ด ์ ์ด ๋ง์์ต๋๋ค.
๋น์ ๊ฐ๋ฐํ๊ฒฝโ
I๋ชจ ์ ์ฒด์ SPA๊ธฐ๋ฐ ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ์๊ณ , XML ํ์ผ ์์์ JS๋ก์ง์ ๊ฐ๋ฐํ๋ ๋ฐฉ์์ด์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ๊ฐ์ ์ ์ฒด์์ ๊ฐ๋ฐํ Chrome ๊ธฐ๋ฐ์ ๊ฒ์ ์ฌ์ฉํ์ต๋๋ค.
์ฌ 3์ ๊ธฐ์ค Chrome 92 ๊ธฐ๋ฐ์ด ์ต์ ์ด์์ต๋๋ค. IDE๋ Spring Tool Suite๋ฅผ ์ฌ์ฉํ์ต๋๋ค.
๋ฌธ์ ์ โ
- Syntax ์๋์์ฑ ๋ถ๊ฐ (4์์ฏค๋ถํฐ ์ง์)
- VS code ์ฌ์ฉ๋ถ๊ฐ (Editor๋ก์จ๋ง ์ฌ์ฉ๊ฐ๋ฅ)
- ๊ทธ๋ค๋ง์ Data ๊ตฌ์กฐ
- ๊ทธ๋ค๋ง์ API
- ๋จ์ํ ์คํธ โ
- ํตํฉํ ์คํธ โ
์์ฝํด์ ๋งํ์๋ฉด, ์ ์ง๋ณด์๊ฐ ๋งค์ฐ ์ด๋ ค์ด ํ๊ฒฝ์ด์์ต๋๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒโ
์ฝ๋ ์ ์ฒด๊ฐ ์นด์ค์ค๋ก ํฅํ๊ธฐ ์ ์, ๋ฆฌํฉํ ๋ง์ ํตํด ๊ฐ๋ ์ฑ์ ๋์ด๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ณ ๋ฏผํด๋ดค์ต๋๋ค.
1. Closure ๐ฆโ
๊ฐ๋ โ
Closure๋ ์ธ๋ถ ํจ์๊ฐ ์คํ์ ์๋ฃํ ํ์๋ ๋ด๋ถ ํจ์๊ฐ ์ธ๋ถ ํจ์์ ๋ณ์ ๋ฐ ๋งค๊ฐ๋ณ์์ ์ก์ธ์คํ ์ ์๋ค๋ผ๋ ๊ฐ๋ ์ ๋๋ค.
์์โ
Closure๋ฅผ ์ดํดํ๊ธฐ ์ํด, ๊ฐ๋จํ Counter๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
function createCounter() {
let count = 0;
return {
increment: function () {
count++;
},
decrement: function () {
count--;
},
getCount: function () {
return count;
},
};
}
const counter = createCounter();
counter.increment();
counter.increment();
console.log(counter.getCount()); // ์ถ๋ ฅ : 2
counter.decrement();
console.log(counter.getCount()); // ์ถ๋ ฅ : 1
console.log(counter.count); // ์ถ๋ ฅ : undefined
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด, createCounter ํจ์๊ฐ ์คํ๋๋ฉด์ count ๋ณ์๊ฐ ์์ฑ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ createCounter ํจ์๋ increment, decrement, getCount ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ๊ฒ createCounter ํจ์๊ฐ ์คํ๋๊ณ ๋๋ฉด, count ๋ณ์๋ ์ฌ๋ผ์ง๋๋ค. ํ์ง๋ง, createCounter ํจ์๊ฐ ๋ฐํํ ๊ฐ์ฒด์ ๋ฉ์๋๋ค์ count ๋ณ์์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ด๊ฒ์ด Closure์ ๊ฐ๋
์
๋๋ค.
์ ์ฉ ์ฌ๋กโ
scwin.initialize = () => {
// ๊ถํ Controller
const authController = {
checkAccessAuth: async () => {
// ๋ณต์กํ ๋ด๋ถ ๋ก์ง
},
spcyAuthCallback: () => {
// ๋ณต์กํ ๋ด๋ถ ๋ก์ง
},
};
// ๋ฐ์ดํฐ Controller
const dataController = {
initCommonCode: () => {
// ๋ณต์กํ ๋ด๋ถ ๋ก์ง
},
initUserData: () => {
// ๋ณต์กํ ๋ด๋ถ ๋ก์ง
},
initPageData: () => {
// ๋ณต์กํ ๋ด๋ถ ๋ก์ง
},
};
// ๊ฐ๋ฐ์๊ฐ ์ง์ ํธ์ถํ๋ ๋ฉ์๋
return {
// ๋ชจ๋ ๊ถํ ์ฒดํฌ
checkAuth: async () => {
await authController.checkAccessAuth();
authController.spcyAuthCallback();
},
// ๋ชจ๋ ๋ณ์ ์ด๊ธฐํ
initData: () => {
dataController.initCommonCode();
dataController.initUserData();
dataController.initPageData();
},
};
};
SOLID๋ก ์๊ฐํด๋ณด๊ธฐโ
๋จ์ผ ์ฑ ์ ์์น(SRP): ์ด ์ฝ๋๋
authController์dataController๋ผ๋ ๋ ๊ฐ์ ์ปจํธ๋กค๋ฌ๋ก ๋๋ฉ๋๋ค. ๊ฐ ์ปจํธ๋กค๋ฌ์๋ ๊ณ ์ ํ ์ฑ ์์ด ์์ผ๋ฉฐ,authController๋ ๊ถํ ๋ถ์ฌ ๋ก์ง์ ์ฒ๋ฆฌํ๊ณdataController๋ ๋ฐ์ดํฐ ์ด๊ธฐํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ด๋ ๊ฒ ์ ๋ฌด๋ฅผ ๋ถ๋ฆฌํ๋ฉด ์ฝ๋๋ฅผ ์ ์ง ๊ด๋ฆฌํ๊ณ ์์ ํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.๊ฐ๋ฐฉ/ํ์ ์์น(OCP): ์ฝ๋์ ๊ตฌ์กฐ๋ ์ฝ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๊ธฐ์กด ๋ฉ์๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋
authController๋๋dataController์ ๋ฉ์๋๋ฅผ ๋ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ ์ฐ์ฑ์ ํ์ฌ ๊ธฐ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์์ ์๋ฏธํฉ๋๋ค.์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น(ISP):
authController์dataController๋ ๊ฐ๊ฐ ํน์ ์์ ์ ์ด์ ์ ๋ง์ถ ๋ฉ์๋๊ฐ ํฌํจ๋ ๋ช ํํ๊ณ ์ต์ํ์ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์ค๊ณ๋ ๊ฐ ์ปจํธ๋กค๋ฌ๊ฐ ๋ด๋น ์ ๋ฌด์ ๊ด๋ จ๋ ๋ฉ์๋๋ง ๋ ธ์ถํ๋๋ก ํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ถํ์ํ ๋ณต์ก์ฑ ๋ถ๋ด ์์ด ์ฝ๋๋ฅผ ์ฝ๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
2. this๋ฅผ ํ์ฉํ Method Chaining ๐โ
๊ฐ๋ โ
Method Chaining์ ๋จ์ผ ๊ฐ์ฒด ์ธ์คํด์ค์์ ์ฌ๋ฌ ๋ฉ์๋๋ฅผ ํ๋์ ํํ์์ผ๋ก ์ฐจ๋ก๋ก ํธ์ถํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
์ด๋ฅผ ํตํด ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ์ด ์ข๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
Method Chaining์ this๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ฉ๋๋ค.
ํ์ดํ ํจ์๋ this ์ปจํ
์คํธ๋ฅผ ๊ฐ์ง์ง ์๊ณ , ์์ ์ค์ฝํ์ this๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์.
์์โ
Method Chaining์ ์ดํดํ๊ธฐ ์ํด, ๊ฐ๋จํ Calculator ํด๋์ค๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
class Calculator {
constructor() {
this.value = 0;
}
add(num) {
this.value += num;
return this;
}
subtract(num) {
this.value -= num;
return this;
}
multiply(num) {
this.value *= num;
return this;
}
divide(num) {
this.value /= num;
return this;
}
}
const calc = new Calculator();
calc.add(10).subtract(3).multiply(2).divide(7);
concole.log(calc.value); // ์ถ๋ ฅ : 2
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด, add, subtract, multiply, divide ๋ฉ์๋๊ฐ ๋ชจ๋ this๋ฅผ ๋ฐํํฉ๋๋ค. ์ด๋ ๊ฒ this๋ฅผ ๋ฐํํ๋ฉด, calc ์ธ์คํด์ค์์ ๋ฉ์๋๋ฅผ ์ฐ์์ ์ผ๋ก ํธ์ถํ ์ ์์ต๋๋ค.
์ ์ฉ ์ฌ๋กโ
class ParamData {
constructor() {
this.userInfo = {};
this.encnInfo = {};
this.hmMllnGrpId = "";
}
async setUserInfo() {
const userInfo = await getUserInfo();
this.userInfo = userInfo;
return this;
}
async setEncnInfo() {
const encnInfo = await getEncnInfo();
this.encnInfo = encnInfo;
return this;
}
async setHmMllnGrpId() {
const hmMllnGrpId = await getHmMllnGrpId();
this.hmMllnGrpId = hmMllnGrpId;
return this;
}
async checkUserInfo() {
const { userInfo } = this;
if (!userInfo) {
throw new Error("์ฌ์ฉ์ ์ ๋ณด๊ฐ ์์ต๋๋ค.");
}
return this;
}
async checkEncnInfo() {
const { encnInfo } = this;
if (!encnInfo) {
throw new Error("encn ์ ๋ณด๊ฐ ์์ต๋๋ค.");
}
return this;
}
async checkHmMllnGrpId() {
const { hmMllnGrpId } = this;
if (!hmMllnGrpId) {
throw new Error("hmMllnGrpId๊ฐ ์์ต๋๋ค.");
}
return this;
}
}
// ์ฌ์ฉ ์์
const paramData = new ParamData();
try {
paramData.setUserInfo().then(() => paramData.checkUserInfo());
paramData.setEncnInfo().then(() => paramData.checkEncnInfo());
paramData.setHmMllnGrpId().then(() => paramData.checkHmMllnGrpId());
} catch (error) {
console.log(error);
}
SOLID๋ก ์๊ฐํด๋ณด๊ธฐโ
๋จ์ผ ์ฑ ์ ์์น(SRP): ParamData ํด๋์ค๋ ์ฌ์ฉ์ ์ ๋ณด, encn ์ ๋ณด ๋ฐ hmMllnGrpId์ ๋ํ ๊ด๋ จ ๋ฐ์ดํฐ์ ๋ฉ์๋๋ฅผ ์บก์ํํฉ๋๋ค. ํด๋์ค์ ๊ฐ ๋ฉ์๋์๋ ๋จ์ผ ์ฑ ์์ด ์์ผ๋ฏ๋ก ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ ์ง ๊ด๋ฆฌํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
๊ฐ๋ฐฉ/ํ์ ์์น(OCP): ParamData ํด๋์ค๋ฅผ ํ์ฅํ์ฌ ๊ธฐ์กด ๊ตฌํ์ ์์ ํ์ง ์๊ณ ๋ ๋ ๋ง์ ๋ฐ์ดํฐ์ ๊ด๋ จ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ParamData๋ฅผ ์๋ธํด๋์ฑํ๋ฉด ๊ธฐ์กด ๊ธฐ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
๋ฆฌ์ค์ฝํ ์นํ ์์น(LSP): ์ด ์ฝ๋๋ ์ ์ฒด ๊ธฐ๋ฅ์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์ ParamData์ ์๋ธํด๋์ค๋ฅผ ์ฝ๊ฒ ์์ฑํ๊ณ ๋์ฒดํ ์ ์๋ ๋ฐฉ์์ผ๋ก ์์ฑ๋์์ต๋๋ค. ParamData๋ฅผ ํ์ฅํ๋ ์๋ก์ด ํด๋์ค๊ฐ ๋์ ๋ ๊ฒฝ์ฐ ๊ธฐ๋ณธ ํด๋์ค ๋์ ๋ฌธ์ ์์ด ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น(ISP): ParamData ํด๋์ค๋ ํน์ ๋ฐ์ดํฐ ์์ฑ์ ์ค์ ํ๊ณ ํ์ธํ๋ ๋ฉ์๋๊ฐ ์๋ ์ง์ค์ ์ด๊ณ ์ต์ํ์ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์ค๊ณ๋ ํด๋์ค๊ฐ ๋ด๋น ์ ๋ฌด์ ๊ด๋ จ๋ ๋ฉ์๋๋ง ๋ ธ์ถํ๋๋ก ํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ถํ์ํ ๋ณต์ก์ฑ ์์ด ์ฝ๋๋ฅผ ์ฝ๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
๋ง์น๋ฉฐโ
์ด ๊ธ์ ์ ๋ชฉ์ (JS) Closure์ Method Chaining ๐์ด์ง๋ง, ์ค์ ๋ก๋ SOLID ์์น์ ๋ํ ๊ธ์
๋๋ค. SOLID ์์น์ ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์์ ๊ฐ์ฅ ์ค์ํ ์์น ์ค ํ๋์
๋๋ค. ์ด ์์น์ ์ ์ดํดํ๊ณ ์ ์ฉํ๋ฉด, ์ฝ๋๋ฅผ ๋ ๊น๋ํ๊ณ ๊ฐ๋
์ฑ์ด ์ข๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
๋ฆฌํฉํ ๋ง์ผ๋ก ์์ฑ๋ ์์ JavaScript ์ฝ๋ ์์ ๋ SOLID ์์น์ ํตํด, ์ด๋ป๊ฒ ๋ ๊น๋ํ๊ณ ์ฒด๊ณ์ ์ด๋ฉฐ ํจ์จ์ ์ธ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๋์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์์ง ๋ถ์กฑํ ์ ์ด ๋ง์ง๋ง ์์ผ๋ก SOLID ์์น๊ณผ ๋๋ถ์ด ๊ฒฐํฉ๋๋ ๋ฎ์ถ๊ณ ์์ง๋๋ ๋์ด๋ ๋ฑ์ ๋ค์ํ ๋ฆฌํฉํ ๋ง ๊ธฐ๋ฒ์ ๊ณต๋ถํ๊ณ ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค.