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 ์์น๊ณผ ๋๋ถ์ด ๊ฒฐํฉ๋๋ ๋ฎ์ถ๊ณ ์์ง๋๋ ๋์ด๋ ๋ฑ์ ๋ค์ํ ๋ฆฌํฉํ ๋ง ๊ธฐ๋ฒ์ ๊ณต๋ถํ๊ณ ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค.