์ํคํ ์ฒ์ ๋์์ธ ํจํด in TS - 1. ์ํคํ ์ฒ - MVC ์ดํด๋ณด๊ธฐ
๐ ๋ณด๋ฆ์นผ๋ผ
๋จ์ ๊ธฐ๋ก๋ณด๋จ ์ข ๋ ์์ง์, ์ ๋ฆฌ๋ ๊ธ์ ์ฐ๊ณ ์ ์์ํ๋ ๋ณด๋ฆ์นผ๋ผ
๋ถ๋ด์์ด ๋งค ๋ณด๋ฆ ํ๋์ ์ฃผ์ ๋ฅผ ๊น๊ฒ ๋ค์ฌ๋ค๋ณผ ์ ์๋ ๊ธฐํ๊ฐ ๋์์ผ๋ฉด ์ข๊ฒ ๋ค.
๊ฐ์ ์ค์ข
์ ๋์ด ์๊ฐ ์ค์ข
์ ์ ํตํด ๊พธ์คํ ์์
์ ๋ด์๋ ๊ฒ๊ณผ ๊ฐ์ด ๋ณด๋ฆ์นผ๋ผ์ ์ ์ด๋ณด์!
๋ณด๋ฆ์นผ๋ผ ๊ท์น
- ๋งค์ผ์ ๊ธฐ๋กํ๋ ์ฑ์ฅ์ผ์ง๋ณด๋ค ์ข๋ ๊น์ ๋ด์ฉ์ ๊ธ์ ์์ฑํ ์ ์๋๋ก ํ์.
- ๋๋ฌด ์์ฌ๋ถ๋ฆฌ์ง๋ง๊ณ ํ๋์ ์ฃผ์ (ํค์๋)์ ์ง์คํ๋ค.
- 2์ฃผ์ ํ ๋ฒ ๋ค๋ฌ์ด์ง ์นผ๋ผ ํํ์ ๊ธ์ ์์ฑํ๋ค.
- ๋ง๊ฐ์ ๋งค์ฃผ ์ผ์์ผ์ ๊ธฐ์ค์ผ๋ก ํ๋ค.
๐ ๊ธ๋ 8๊ธฐ
๊ฐ๋ฐ์๋ค์ด ๋ชจ์ฌ ํจ๊ป ๊ธ์ ์ฐ๊ณ ํผ๋๋ฐฑํ๋ ์ปค๋ฎค๋ํฐ์ธ ๊ธ๋(๊ธ์ฐ๋ ๋๋ผ์ด๊ฐ ์ธ์์ ๋ฐ๊พผ๋ค.)์์
ํ๋ํ๊ฒ ๋์ด ๋ณด๋ฆ์นผ๋ผ์ ๊ท์น์ ๊ธ๋์ ๊ท์น์ ๋ฐ๋ฅด๊ธฐ๋ก ํ๋ค.
2์ฃผ๋ง๋ค ๊ธ์ ์์ฑํ๋ ๊ท์น์ ๋์ผํ๋ฉฐ, ๊ทธ ๋ง๊ฐ ๋ ์ง๋ ์๋์ ๊ฐ๋ค. ๋ง๊ฐ ๋ ์ง๋ฅผ ์ฒดํฌํ๋ฉฐ ๋งค๋ฒ ๊ธ ์์ฑ์ ๋ํด ์ธ์งํ๋๋ก ํ์!
๐ ๋ค์ด๊ฐ๊ธฐ์ ์์โฆ
๋งค๋ฒ ์์ ํ๋ก์ ํธ ๋๋ง๋ค ๋ฆฌํฉํ ๋งํ๋ ๊ฒ ์ฝ์ง ์์๋ค. ๊ทธ๋ฌ๋ค ๊ณต๋ถ๋ฅผ ํ๋ฉฐ ์ํคํ ์ฒ, ๋์์ธ ํจํด ๋ฑ์ ์๊ฒ ๋์๊ณ ์์ฃผ ์ฌ์ฉ๋๋ ํจํด์ ์ ์ฉํ๋ฉด ์ถํ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๊ธฐ ์ข์ ๊ฑฐ๋ผ๋ ๋๋์ด ์๋ค! ํด์ ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๊ณต๋ถํ ์ํคํ ์ฒ์ ๋์์ธ ํจํด์ ๋ํ ๋ด์ฉ๋ค, ๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ ์๋ชป์๊ณ ์์๋ ๋ถ๋ถ๋ค์ ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค.
๐ ํจํด???
ํจํด(pattern)์ ํ๋์ค์ด ๋ฑ๋ง์ธ patron
์์ ๋์จ ๋ง๋ก, ๋ํ์ด๋๋ ์ฌ๊ฑด์ด๋ ๋ฌผ์ฒด์ ํํ
๋ฅผ ์๋ฏธํ๋ค. ์ฆ, ๊ฐ๋ฐ์ ์์ด์์ ํจํด์ ์ฝ๋๋ก ํํ๋ ์ด๋ค ๋ํ์ด๋๋ ํํ
๋ฅผ ์๋ฏธํ๋ค๊ณ ๋ณผ ์ ์๋ค.
๐ ์ํํธ์จ์ด ์ํคํ ์ฒ..?
๋จผ์ ์ํคํผ๋์ ์ ์๋ฅผ ๋ณด์.
์ํํธ์จ์ด ๊ตฌ์กฐย ๋๋ย ์ํํธ์จ์ด ์ํคํ ์ฒ(software architecture)๋ย ์ํํธ์จ์ด์ ๊ตฌ์ฑ์์๋ค ์ฌ์ด์์ ์ ๊ธฐ์ ๊ด๊ณ๋ฅผ ํํํ๊ณ ์ํํธ์จ์ด์ ์ค๊ณ์ ์ ๊ทธ๋ ์ด๋๋ฅผ ํต์ ํ๋ ์ง์นจ๊ณผ ์์น์ด๋ค.
์โฆ ์ง์ ์ ์ผ๋ก ์๋ฟ์ง๋ ์์ง๋ง, ๋์ถฉ ๋ญ๊ฐ ์ ๊ฒ ๊ฐ์ ์ค๋ช
์ด๋ค. ์ํํธ์จ์ด์ ๊ตฌ์กฐ๋ฅผ ํํํ๊ณ ์ด๋ฅผ ์ค๊ณํ๋ ์ด๋ค ์์น ์ ๋
๋ก ์๊ฐํด๋ณผ ์ ์์ ๊ฒ ๊ฐ๋ค. ์ข๋ ์์๋ ฅ์ ํตํด ๋ง๋ถ์ฌ๋ณด์๋ฉด ๋ญ๊ฐ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๊ธฐ ์ํ ์ง์ฌ์ ธ ์๋ ํ(?) ์ ๋์ ๋๋๋ ๋๋ค.
๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ
๋ชจ๋ํ
- ์์คํ ์ ๊ธฐ๋ฅ๋ค์ ๋ชจ๋ ๋จ์๋ก ๋๋๋ค. ์ถ์ํ
- ์ ์ฒด์ ์ด๊ณ ํฌ๊ด์ ์ธ ๊ฐ๋ ์ ์ค๊ณํ๋ค. ๋จ๊ณ์ ๋ถํด
- ๋ฌธ์ ๋ฅผ ์์์ ์ค์ ๊ฐ๋ ์์๋ถํฐ ํ์ ๊ฐ๋ ์ผ๋ก ๋ถํ ํ๋ฉฐ ๊ตฌ์ฒดํ์ํจ๋ค. ์ ๋ณด ์๋
- ํ ๋ชจ๋ ๋ด๋ถ์ ํฌํจ๋ ์ ์ฐจ์ ์๋ฃ๋ฅผ ์จ๊ธฐ๋ฉฐ ๋ ๋ฆฝ์ ์ธ ์ฑ ์๊ณผ ์ญํ ์ ๊ฐ๊ฒ ํ๊ณ ์ธ๋ถ์์ ์ ๊ทผํ๊ฑฐ๋ ๋ณ๊ฒฝํ์ง ๋ชปํ๊ฒ ํ๋ค.
๐งโฆ ์ ์๋ณด๋ค ๊ธฐ๋ณธ์ ์ธ ์๋ฆฌ๊ฐ ๋ ํท๊ฐ๋ฆฌ๋ ๊ธฐ๋ถ์ด๋ค. ์ ์๋ง ๋ดค์ ๋๋ ๋๋ฌด ์ถ์์ ์ด๋ผ ๊ตฌ์ฒด์ ์ผ๋ก ์๋ฟ์ง ์์๋ค๋ฉด, ์๋ฆฌ๋ ๊ฐ์ฒด์งํฅ์ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋ ์ด๋ผ ๋๋ฌด ๋น์ฐํ ๋๋์ด ๋ ๋ค.
์ ์ค์ํ๊ฐ?
์ ์ํํธ์จ์ด ์ํคํ ์ณ๋ฅผ ์ค์ํ๊ฒ ์๊ฐํด์ผํ ๊น?
์๋ ๊ทธ๋ฆผ์ ๋งํด ํ์ธ๋ฌ - ์ํํธ์จ์ด ์ํคํ
์ฒ์ ์ค์์ฑ
์์์์ ๋์ค๋ ์๋ฃ์ด๋ค.
์ํคํ ์ฒ ์ค๊ณ๊ฐ ๋์ด์์ง ์์์ฑ๋ก ๊ฐ๋ฐ์ ์งํํ๊ฒ ๋๋ฉด ๋จ๊ธฐ์ ์ผ๋ก๋ ๋ง์ ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ ์ ์๋๋ผ๋ ๊ฒฐ๊ตญ์ ์๊ฐ์ด ์ง๋๋ฉด์ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง๋ค. ์ฆ, ์ ์ง๋ณด์๊ฐ ํ๋ค์ด์ง๊ณ ์ ์ ๋ ๋ง์ ์๊ฐ๊ณผ ๋น์ฉ์ด ๋ฐ์ํ๊ฒ ๋๋ค. ๋ฐ๋ฉด, ์ฒ์๋ถํฐ ์ํคํ ์ฒ๋ฅผ ์ ์ ์ํ๊ณ ๊ฐ๋ฐ์ ํ๋ค๋ฉด ์ํคํ ์ฒ๋ฅผ ์ค๊ณํ๋ ์ด๊ธฐ ์๊ฐ๊ณผ ๋น์ฉ์ด ์๊ฒ ์ง๋ง ์ถํ์ ๊ธฐ๋ฅ์ ๋ํ๊ณ ๊ด๋ฆฌํจ์ ์์ด์ ํจ์ฌ ์์ํด์ง๋ค.
์ข์ ๋ด๋ถ ํ์ง์ ๊ฐ์ง ์ํํธ์จ์ด๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋๋ฐ ์ด๊ธฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋๋ผ๋ ์ถํ์ ๋ ๋น ๋ฅด๊ฒ ์ํ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ณ ๋ํ ์ ์๋ค.
- ์ํคํ ์ฒ๊ฐ ์ ์ฉ๋๊ธฐ ์
- ์ํคํ ์ฒ๊ฐ ์ ์ฉ๋ ํ
์์ ์ฌ์ง์ ๋ณด๋ฉด ์ด๋จ๊น? ๋๊ฐ๋ด๋ ํ์์ ์ฌ์ง์ด ๋ ์ถํ ๋ฌผ๊ฑด์ ๋ํ๊ฑฐ๋ ์ ๊ฑฐํ๋ ๊ฒ ์ฝ๊ณ ํธํด๋ณด์ธ๋ค.(๋ฌผ๋ก ํ์์ ์ฌ์ง๋ ์ค์์ ํฌ์คํธ์์ ๋ํ ์์กด์ฑ์ด ๋๋ฌด ํฐ ๋ฌธ์ ๊ฐ ์๊ธด ํ๋ค.)
์๊ฐ์ ์ธ ์๋ฃ๋ก ๋ณด๋ ์ด์ ์กฐ๊ธ์ ์ ๊ฒ ๊ฐ๋ค. ๊ฒฐ๊ตญ ์ํคํ
์ฒ๋ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๊ธฐ์ ์์ ์ ํ๋๋ ๊ฑฐ๋ํ ๊ตฌ์กฐ ๊ทธ๋ฆฌ๊ณ ๊ฐ๋ฐ์ ๋ํ ์ง์นจ
์ ์ญํ ์ ํ๋ค๊ณ ๋ณผ ์ ์๋ค. ๋ํ, ์ด๋ฐ ์ค๊ณ ํจํด์ ์ ๋ฆฝํ๊ณ ๊ฐ๋ฐ์ ํ๊ฒ ๋๋ฉด ๊ทธ์ ๋ฐ๋ฅธ ๋ฌธ์ ๋ค, ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฌธ์ ๋ค์ ๋ํ ๋์์ฑ
๋ค์ด ๋ฐ์ดํฐ๋ก ์์ด๊ฒ ๋๋ค. ์ฆ, ์ํคํ
์ฒ๋ฅผ ์ ๋ฆฝํ๊ณ ๊ฐ๋ฐํ๊ฒ ๋๋ฉด ์ด๋ค ๋ฌธ์ ๋ฅผ ๋ง์ฃผํ๋๋ผ๋ ์ด๋ฏธ ์กด์ฌํ๋ ์๋ง์ ํด๊ฒฐ์ฑ
๋ค์ด ์กด์ฌํ๋ค๋ ์๋ฏธ์ด๋ค.
๐ฆด ์ด๋ค ์ํคํ ์ฒ ํจํด๋ค์ด ์์๊น?
- Layered pattern
- Client-server pattern
- Master-slave pattern
- Pipe-filter pattern
- Broker pattern
- Peer-to-peer pattern
- Event-bus pattern
- Model-view-controller pattern
- Blackboard pattern
- Interpreter pattern
์โฆ ์ฌ์ค ๋๋ ์์ 10๊ฐ ์ค MVC๋ง ์๊ณ ์์๊ณ ์ฐธ๊ณ ์๋ฃ์์ ๋ด์ฉ์ ์ดํด๋ณด๋ Client-server pattern๋ ์๊ณ ๋ ์์์ง๋ง, ์ด๊ฒ ์ํคํ ์ณ ํจํด ์ค ํ๋์ธ์ง๋ ์ฒ์ ์๊ฒ ๋์๋ค. ์ด ์ค MVC ํจํด์ด ์์ฃผ ์ฌ์ฉ๋๊ณ (๋ฐฑ์๋์์ ์์ฃผ ์ค์ํ ํจํด) ์ฌ๊ธฐ์ MVVM, Flux ํจํด ๋ฑ์ด ํ์๋์๋ค๊ณ ํด๋ ๋ฌด๋ฐฉํ๊ธฐ์ MVC ํจํด์ ๋ํด์ ์ข๋ ์์๋ณด๋ ค ํ๋ค.
MVC(Model - View - Controller) ํจํด
- ๋ชจ๋ธ(Model) - ์ํํธ์ด์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ๋ทฐ(View) - ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋ ํ๋ฉด์ ๋ด๋นํ๋ค.
- ์ปจํธ๋กค๋ฌ(Controller) - ๋ชจ๋ธ๊ณผ ๋ทฐ ์ฌ์ด์์ ์ด ๋์ ๊ด๋ฆฌํ์ฌ ์์กด์ฑ์ ๋ฎ์ถ๋ ์ญํ ์ ํ๋ค.
์ฌ์ค ๋ถ๋๋ฝ์ง๋ง, ์ํคํ ์ฒ์ ๊ฐ๋ ์ด ์ด๋ ๊ฒ ๊ฑฐ๋ํ ๊ฒ์ธ์ค ๋ชจ๋ฅด๊ณ ์ด๋ฒ ํ๋ก์ ํธ์์ ๊ฐ ์ปดํฌ๋ํธ๋ฅผ MVC ํจํด์ผ๋ก ๊ฐ๋ฐํด๋ณด์๋ค. ์ด ๋, Controller์ ์ญํ ์ Component๋ผ๊ณ ๋ถ๋ฅด๊ธฐ๋ก ํ๊ณ Component์์ Model๊ณผ View๋ฅผ ์ด์ฉํ์ฌ ํ๋์ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ์ค๊ณ๋ฅผ ํด๋ณด์๋ค.
MVC ํจํด์ผ๋ก ์ค๊ณํด๋ณธ ์ปดํฌ๋ํธ(feat. TypeScript)
๋จผ์ Model, View, Component(Controller)์ ๋ํ interface์ด๋ค.
export interface Model {
setState(state: State): void;
get state(): State;
}
export interface View {
render(state: State): void;
get element(): HTMLElement;
}
// Component๋ ์ข๋ ์ ์ฐํ๊ฒ interface๋ก๋ง ๊ด๋ฆฌ
export interface Component {
// private _model: Model;
// private _view: View;
// setState๋ฅผ private ์ฒ๋ฆฌํจ์ผ๋ก์จ ์์ ์ปดํฌ๋ํธ์์ ํ์ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ์ง์ ์กฐ์ํ์ง ๋ชปํ๊ฒ ๋ง์.
// private setState(state: State): void;
get element(): HTMLElement;
attachTo(component: Component): void;
get state(): State;
}
- Model์ state๋ฅผ ๊ด๋ฆฌํ๊ณ setState๋ฅผ ํตํด state๋ฅผ ๋ณ๊ฒฝํ๋ ์ญํ ์ ํ๋ค.
- View๋ state๋ฅผ ๋ฐ์ ํ๋ฉด์ ๊ทธ๋ฆฌ๋ render ํจ์ ๊ทธ๋ฆฌ๊ณ ํด๋น ํ๋ฉด์ element๋ก ๋ฐํํ ์ ์๋ element getter๋ฅผ ๊ฐ๊ณ ์๋ค.
- Component๋Model๊ณผ View๋ฅผ ํตํด state ๊ด๋ฆฌ์ ํ๋ฉด์ ๊ทธ๋ ค์ฃผ๊ฒ ๋๋ฉฐ attachTo ๋ฉ์๋๋ฅผ ํตํด ์ปดํฌ๋ํธ ๊ฐ์ ์ํ์ ๊ด๊ณ๋ฅผ ํ์ฑํ๋ค.(DOM Tree ๊ตฌ์กฐ๋ฅผ ๋ง๋ค๊ธฐ ์ํจ)
๊ทธ๋ฆฌ๊ณ ์ด์ ์์ interface๋ฅผ ํตํด ์ข๋ ๊ตฌ์ฒด์ ์ธ ์ถ์ ํด๋์ค๋ฅผ ์์ฑํด๋ณด์๋ค.
export abstract class AbstractModel implements Model {
protected _state: State;
protected constructor() {
this._state = {};
}
setState(newState: State) {
this._state = { ...this._state, ...newState };
}
get state() {
return this._state;
}
}
export abstract class AbstractView implements View {
protected _templateElement: HTMLTemplateElement;
protected _element: HTMLElement;
protected constructor() {
this._templateElement = document.createElement('template');
this._element = this._templateElement.content
.firstElementChild as HTMLElement;
this.setTemplate();
this.setElement();
}
protected setTemplate() {
this._templateElement.innerHTML = ``;
}
protected setElement() {
this._element = this._templateElement.content
.firstElementChild as HTMLElement;
}
render(state: State) {
this.element.innerHTML = ``;
}
get element() {
return this._element;
}
setEvent(
selector: string,
eventName: keyof WindowEventMap,
handler: EventListener,
) {
$(selector, this.element)!.addEventListener(eventName, handler);
}
}
๋จผ์ Model์ interface์ ํฐ ์ฐจ์ด๊ฐ ์๊ธฐ์ ์๋ตํ๊ณ , View๋ฅผ ์ดํด๋ณด์. ์กฐ๊ธ ์ง์ ๋ถํ์ง๋ง ๊ฐ๋จํ๋ค. ๋จผ์ template element๋ฅผ ๋ง๋ค๊ณ ์ด element์ innerHTML๋ก ๋ด๊ฐ ์ํ๋ element์ html ํํ๋ฅผ ์ ๋ฌํ๋ค. ์ดํ template element์ ์ฒซ๋ฒ์งธ ์์์ ์ ํํ์ฌ template ํ๊ทธ๋ฅผ ์ ์ธํ ๊ทธ ๋ด๋ถ template literal์ ํด๋นํ๋ element๋ฅผ ์ป์ด๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ์ปดํฌ๋ํธ์ ์กด์ฌํ๋ element๋ค์ ์ด๋ค ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ๋ถ์ฌ์ฃผ๊ธฐ ์ํ setEvent ๋ฉ์๋๋ฅผ ์ถ๊ฐํ์๋ค.
Controller์ ์ญํ ์ ํ๊ฒ ๋ Component๋ Model๊ณผ View๋ฅผ ์์กด์ฑ ์ฃผ์ ํํ๋ก ๋ฐ๋ ๊ฒ ์๋๋ผ ๊ฐ๊ฐ์ Component๋ง๋ค ๋ชจ๋๋ก ๋ฐ์์ ์ฒ๋ฆฌํ๊ธฐ์ ๋ฐ๋ก ์ถ์ ํด๋์ค๋ฅผ ๋์ง ์์๋ค.
์ด์ ์ด๋ ์ ๋ ๋๋ง์ ์ค๊ณ๋ ์์ฑ๋์๊ณ ์ด๋ฅผ ํตํด ์์ฃผ ๊ฐ๋จํ ์ปดํฌ๋ํธ ์์๋ฅผ ํ๋ ์ดํด๋ณด๋ ค ํ๋ค.
- HeaderModel
import { AbstractModel } from '@custom-types/abstracts.js';
export class HeaderModel extends AbstractModel {
constructor() {
super();
}
}
Model์ ๋๋ฌด ๊ฐ๋จํ๋ค. ์์ ์ถ์ ํด๋์ค๋ฅผ ์์ํ์ฌ header
์ปดํฌ๋ํธ๊ฐ ๊ฐ๊ฒ ๋ ์ํ๋ง์ ๊ด๋ฆฌํ๋ค.
- HeaderView
import { State } from '@custom-types/types';
import { AbstractView } from '@custom-types/abstracts.js';
export class HeaderView extends AbstractView {
constructor() {
super();
}
protected setTemplate() {
this._templateElement.innerHTML = `<header class="h-1/6 bg-green-100 border border-green-500 text-3xl text-gray-500 grid place-content-center">Header</header>`;
}
render(state: State) {
return;
}
}
์์ ๊ฐ์ด ๋ด๊ฐ ์ํ๋ header
์ ํํ๋ฅผ template literal๋ก ์ ๋ฌํด์ฃผ๊ณ render์์๋ state๋ฅผ ๋ฐ์ ์ ๋ฌ๋ฐ์ template literal์ ์กฐ์ํ๋ ์์
์ ํ๋ค.(์ถํ์ ์ด ๋ถ๋ถ์ด ๋ด๊ฐ ์ํ๋ ๋ฆฌ์กํธ์ค๋ฌ์ด ์ค๊ณ๊ฐ ์๋๋ผ๋ ๊ฑธ ์๊ฒ ๋์ด์ ๋๊ท๋ชจ๋ก ๋ฆฌํฉํ ๋ง์ ํ๊ฒ ๋๋คโฆ๐ฅบ ์ด๋ ๋ชฐ๋์งโฆใ
)
์ฐธ๊ณ ๋ก html ํ๊ทธ์ class๋ด์ ์๋ ๊ฐ๋ค์ tailwindCSS๋ฅผ ํตํ ์คํ์ผ ํํ๋ฒ์ด๋ค. ์ด ๊ธ์์๋ ์์ธํ ๋ค๋ฃจ์ง ์๊ฒ ์ง๋ง, ์ด๋ฒ ํ๋ก์ ํธ์์๋ ์ฝ๋์ ์ค๊ณ์ ์ง์คํ๊ณ ์ถ์ด์ ๋น๊ต์ style์ ๋ํ ๊ณ ๋ฏผ์ ๋ํ ์ ์๊ฒ ํด์ฃผ๋(?) tailwindCSS๋ฅผ ์ฌ์ฉํ์๋ค.
์์ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ฅ ๋ฐ๊นฅ์ root
id๋ฅผ ๊ฐ์ง ํ๊ทธ์ ๋ถ์ฌ์ค๋ค.
import { HeaderComponent } from '@components/header/HeaderComponent.js';
import { MainComponent } from '@components/main/MainComponent.js';
import { FooterComponent } from '@components/footer/FooterComponent.js';
export class App {
constructor(appRoot: HTMLElement) {
const header = new HeaderComponent();
const main = new MainComponent();
const footer = new FooterComponent();
appRoot.appendChild(header.element); // ์ด ๋
์์ด ์์์ ๊ตฌํํ header ์ปดํฌ๋ํธ
appRoot.appendChild(main.element);
appRoot.appendChild(footer.element);
}
}
์ฌ๊ธฐ์๋ App ์ปดํฌ๋ํธ๋ ๋ด๊ฐ ์ค๊ณํ component๋ฅผ ์ ์ฉํ์ง ์์๊ธฐ์ DOM api์ธ appendChild๋ฅผ ํตํด ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ถ์ด๊ฒ ๋๋ค.
์์ ๊ฒฐ๊ณผ๋ฌผ์ ์ดํด๋ณด์๋ฉด
์ด๋ฐ ์์ Header๊ฐ ์์ฑ๋๋ค. ์ด์ ์ฌ๊ธฐ์ ๋ ์์ ์ปดํฌ๋ํธ๋ฅผ ๋ถ์ฌ์ ํ๋์ ํฐ ํ๋ก์ ํธ๋ฅผ ์ค๊ณํ ์ ์๋ค.
๐ ๊ธ์ ๋ง์น๋ฉฐโฆ
์ฒ์ ์ด ๊ธ์ ์ฃผ์ ๋ ์ํคํ
์ฒ vs ๋์์ธ ํจํด
์ด์๋ค. ๋งค๋ฒ ์ค๊ณ์์ด ์งํํ๋ ํ๋ก์ ํธ๋ฅผ ์ถํ์ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ ๋๋ฌด ํ๋ค์ด์ ์ด๋ฒ ํ๋ก์ ํธ์์ ์ค๊ณ์ ์ ๋ง ๋ง์ ์๊ฐ์ ๋ค์๋ค. ํ์ง๋ง ์ด๊ฒ ์ฌ๊ฑธโฆ ์ํคํ
์ฒ์ ๋์์ธ ํจํด์ ๊ทผ๋ณต์ ์ธ ์ฐจ์ด๋ ๋ชจ๋ฅด๊ณ ๊ทธ์ ์ ๋ช
ํ MVC ํจํด์ ์ ์ฉํด์ ๋๋ง์ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ ์์๊ณ , MVC์ ์ต์ ๋ฒ ํจํด์ ๋์ผํ ์ ์์ ๊ฐ๋
์ผ๋ก ์๊ฐํ๊ณ ํ๋ก์ ํธ์ ์ ์ฉํ๋ค. ๊ทธ๋ฌ๋ค ์ ๊ณต์์ธ ๋๋ฃ์์ ๋ํ ์ค ์ํคํ
์ฒ ํจํด(ex. MVC)๊ณผ ๋์์ธ ํจํด(ex. ์ต์ ๋ฒ ํจํด)์ ์ฐจ์ด๋ฅผ ์๊ฒ ๋์๊ณ ๋ญฃ๋ชจ๋ฅด๊ณ ์ค๊ณํ ํ๋ก์ ํธ์ ์ฝ๋๊ฐ ์กฐ๊ธ์ ๋ถ๋๋ฌ์์ก๋ค. ์ด๋ฐ ์ด์ ๋ก ์ด ๋์ ์ฐจ์ด๋ฅผ ํ์คํ ์๊ณ ๋ด๊ฐ ์ ์ฉํ๋ ๋ฐฉ๋ฒ์ด ํต์ฉ๋๋ ๋ฐฉ๋ฒ(?)์ ์๋์์์ ๊ธฐ๋กํ๊ธฐ ์ํด ์ด ์ฃผ์ ๋ฅผ ์ ์ ํ์๋ค.
๋ค์์๋ ๋์์ธ ํจํด์ ๋ํด์ ์์๋ณด๊ณ ๋์์ธ ํจํด ์ค ์ต์ ๋ฒ ํจํด์ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ฑํ ๊ฒฝํ์ ์ ์ด๋ณด๋ ค ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ค์๋ ์ด ์ฐจ์ด๋ฅผ ์๊ณ ์ ์๋กญ๊ฒ ๋ฆฌํฉํ ๋งํ ์ฝ๋์ ๋ํด์๋ ๋ค๋ค๋ณผ ์์ ์ด๋ค.
์์ง ๋ง์ด ๋ถ์กฑํ ๊ฐ๋ฐ์์ ๋๋ค. ๋ด์ฉ์ ๋ํ ์ค๋ฅ๊ฐ ์๋ค๋ฉด, ์ธ์ ๋ ํธํ๊ฒ ๋ง์ํด์ฃผ์ธ์! ๊ฐ์ฌํฉ๋๋ค!
๐ ์ฐธ๊ณ
- ํจํด
- ์ํํธ์จ์ด ์ํคํ ์ฒ ์ํคํผ๋์
- ๋์์ธ ํจํด - ๋ฆฌํฉํ ๋ง ๊ตฌ๋ฃจ
- ์ํคํ ์ฒ ํจํด๊ณผ ๋์์ธ ํจํด
- ๋งํด ํ์ธ๋ฌ - ์ํํธ์จ์ด ์ํคํ ์ฒ์ ์ค์์ฑ
- ์ฐ์์ฝ 2022 - ๊ฐ๋ฐ์๊ฐ ์ํคํ ์ฒ์ ์ง์ฐฉํ๋ ์ด์ , ์ฝ๊ฒ ์๋ ค๋๋ฆฝ๋๋ค.
- ์ํคํ ์ฒ ํจํด์ด๋