1. ๋์์ธ ํจํด
๋์์ธ ํจํด (Design Pattern)
: ํ๋ก๊ทธ๋จ์ ์ค๊ณํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ค์ ๊ฐ์ฒด ๊ฐ์ ์ํธ ๊ด๊ณ ๋ฑ์ ์ด์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋๋ก ํ๋์ ๊ท์ฝ ํํ๋ก ๋ง๋ค์ด ๋์ ๊ฒ
ํ์ฌ ์ ๋ง์ ๋์์ธ ํจํด์ ํ์ต์ ๊ธฐ์ค์ด ๋๋ ์ฑ ์ธ GoF์ '๋์์ธ ํจํด'์์ ํฌ๊ฒ ํจํด์ 3๊ฐ์ง๋ก ์ ์ํ๋ค.
- ํ์ํจํด (๋์ํจํด, ๊ฐ์ฒด๊ฐ์ ํ์๊ฐ ์ฃผ๋ฅผ ์ด๋ฃธ)
- ์์ฑ ํจํด
- ๊ตฌ์กฐ ํจํด (๊ตฌ์กฐ์ ์ธ ๊ฐ๋ ์ ๋ค๋ฃธ)
์ด ์ธ์๋ ๋์์ฑ, ์ํคํ ์ฒ, ๊ธฐํ ํจํด ๋ฑ์ผ๋ก ๋ถ๋ฆฌ๋๋ค.
๋์์ฑ์ ํฌ๊ฒ ๋๊ธฐํ์ ๋ํด ๋ค๋ฃจ๋ฉฐ, ์ํคํ ์ฒ๋ ๋ํ์ ์ผ๋ก MVC ๋ชจ๋ธ ํจํด์ด ์กด์ฌํ๋ค.
1. ์ฑ๊ธํค ํจํด (Singleton Pattern) - ์์ฑ ํจํด
ํ๋์ ํด๋์ค์ ์ค์ง ํ๋์ ์ธ์คํด์ค๋ง ๊ฐ์ง๋ ํจํด์ผ๋ก, ๋ณดํต ๋ฐ์ดํฐ๋ฒ ์ด์คDB ์ฐ๊ฒฐ ๋ชจ๋์ ๋ง์ด ์ฌ์ฉํ๋ค.
- ์์ฑ ํจํด์ ํด๋น
- ํ๋์ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ๊ฐ๋ณ์ ์ธ ์ธ์คํด์ค๋ฅผ ๋ง๋ค ์ ์์ง๋ง ๊ทธ๋ ๊ฒ ํ์ง ์๊ณ ํ๋์ ํด๋์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋จ ํ๋์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ก์ง์ ๋ง๋๋๋ฐ ์ฐ์ธ๋ค.
- ์ฅ์ : ์ธ์คํด์ค ์์ฑํ ๋ ๋๋ ๋น์ฉ์ด ์ค์ด๋ ๋ค.
- ํ๋์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด ๋๊ณ ํด๋น ์ธ์คํด์ค๋ฅผ ๋ค๋ฅธ ๋ชจ๋๋ค์ด ๊ณต์ ํ๋ฉฐ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ธ์คํด์ค: ๊ฐ์ฒด์ ๋ถ์ฌ๋๋ ๊ณ ์ ๋ฒํธ
- ์๋๊ฐ ๋น ๋ฅด๋ค
- ๋จ์ : ์์กด์ฑ์ด ๋์์ง๋ค.
- TTD ๋จ์ ํ ์คํธํ ๋์ ๊ฑธ๋ฆผ๋์ด ๋จ.
์๋ฐ์คํฌ๋ฆฝํธ์ ์ฑ๊ธํค ํจํด
const obj = {
a: 27
}
const obj2 = {
a: 27
}
console.log(obj === obj2)
//false
- ๋ฆฌํฐ๋ด {} ๋๋ new Object๋ก ๊ฐ์ฒด ์์ฑํ๊ฒ ๋๋ฉด, ๋ค๋ฅธ ์ด๋ค ๊ฐ์ฒด์๋ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ ์์ฒด๋ง์ผ๋ก๋ ์ฑ๊ธํค ํจํด ๊ตฌํ ๊ฐ๋ฅ
- obj์ obj2๋ ๋ค๋ฅธ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง๋ค.
class Singleton {
constructor() {
if (!Singleton.instance) {
Singleton.instance = this
}
return Singleton.instance
}
getInstance() {
return this.instance
}
}
const a = new Singleton()
const b = new Singleton()
console.log(a==b)
//true
- Singleton.instance ๋ผ๋ ํ๋์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง๋ Singleton ํด๋์ค ๊ตฌํ
- ์ด๋ฅผ ํตํด a์ b๋ ํ๋์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ชจ๋
const URL = "mongodb://localhost:27017/kundolapp"
const createConnection = (url) => ({ url: url })
class DB {
constructor(url) {
if (!DB.instance) {
DB.instance = createConnection(url)
}
return DB.instance
}
connect() {
return this.instance
}
}
const a = new DB(URL)
const b = new DB(URL)
console.log(a === b)
// true
- DB.instance ๋ผ๋ ํ๋์ ์ธ์คํด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก a, b ์์ฑ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ ๊ดํ ์ธ์คํด์ค ์์ฑ ๋น์ฉ์ ์๋ ์ ์์
์ฑ๊ธํค ํจํด์ ๋จ์
ํ๋์ ์ธ์คํด์ค๋ฅผ ๋๋ ค์ฐ๊ธฐ ๋๋ฌธ์ ์ฃผ๋ก TDD (Test Driven Development) ์ ๊ฑธ๋ฆผ๋์ด ๋๋ค.
- TDD๋ฅผ ํ ๋ ๋จ์ ํ
์คํธ๋ฅผ ์ฃผ๋ก ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋จ์ ํ ์คํธ : ํ ์คํธ๊ฐ ๋ ๋ฆฝ์ ์ด์ด์ผ ํ๊ณ ์ด๋ค ์์๋ก๋ ์คํํ ์ ์์ด์ผ ํ๋ค.
- ๊ฐ ํ
์คํธ๋ง๋ค ‘๋
๋ฆฝ์ ์ธ’ ์ธ์คํด์ค๋ฅผ ๋ง๋ค๊ธฐ ์ด๋ ต๋ค.
- ์ฑ๊ธํค ํจํด์ ๋ฏธ๋ฆฌ ์์ฑ๋ ํ๋์ ์ธ์คํด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ๋ ํจํด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ ์ค์ฉ์ ์ด๋ ๋ชจ๋ ๊ฐ์ ๊ฒฐํฉ์ ๊ฐํ๊ฒ ๋ง๋ค ์ ์๋ค.
์์กด์ฑ ์ฃผ์ (DI, Dependency Injection)
→ ์ฑ๊ธํค ํจํด์ ๋จ์ ์ธ ๋ชจ๋ ๊ฐ์ ๊ฐํ ๊ฒฐํฉ์ ๋์จํ๊ฒ ๋ง๋ค์ด ํด๊ฒฐ
์์กด์ฑ์ ‘์ข ์์ฑ’์ด๋ผ๊ณ ๋ ํ๋ฉฐ, A๊ฐ B์ ์์กด์ฑ์ด ์๋ค๋ ๊ฒ์ B์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด A ๋ํ ๋ณํด์ผ ๋๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์์กด์ฑ ์ฃผ์ ๋ฐฉ์
- ๋ฉ์ธ ๋ชจ๋์ด ์๋ ์์กด์ฑ ์ฃผ์
์๊ฐ ํ์ ๋ชจ๋์ ๊ฐ์ ์ ์ผ๋ก ์์กด์ฑ์ ์ฃผ์
ํ๋ ๋ฐฉ์
- ๋ฉ์ธ ๋ชจ๋์ด ํ์ ๋ชจ๋์ ๋ํ ์์กด์ฑ์ด ๋จ์ด์ง๊ฒ ๋๋ค.
- == ‘๋์ปคํ๋ง์ด ๋๋ค’ (์์กด์ฑ์ด ์ฝํด์ง์๋ก)
- ๊ฒฐํฉ๋์ ์์ง๋์ ์ฐจ์ด
- ๊ฒฐํฉ๋ : ์ข ์์ ( A๊ฐ ๋ณํ๋ฉด B๋ ๋ณํด์ผ ํ๋ค)
- ์์ง๋ : ์๋ก์ ํ๋๊ฐ์ ์์ง๋ ๋ชปํ๊ณ ๋ฉ์ธ ๋ก์ง์ด ๋ณํ์ง ์๋๊ฑธ ์์ง๋๊ฐ ๋๋ค๊ณ ํ๋ค.
์ฅ์
- ๋ชจ๋ ์ฝ๊ฒ ๊ต์ฒด ๊ฐ๋ฅํ ๊ตฌ์กฐ๊ฐ ๋์ด, ์ฌ์ด ํ ์คํ ๊ณผ ์์ํ ๋ง์ด๊ทธ๋ ์ด์
- ์ ํ๋ฆฌ์ผ์ด์
์์กด์ฑ ๋ฐฉํฅ ์ผ๊ด๋จ, ์ฝ๊ฒ ์ถ๋ก ๊ฐ๋ฅ, ๋ชจ๋ ๊ฐ์ ๊ด๊ณ๋ค์ด ๋ ๋ช
ํํด์ง
- ๊ตฌํํ ๋ ์ถ์ํ ๋ ์ด์ด๋ฅผ ๋ฃ๊ณ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํ์ฒด๋ฅผ ๋ฃ์ด ์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
- ์์กด์ฑ์ด ์ค์ด๋ ๋ค.
- ์ฌ์ฌ์ฉ์ฑ์ด ๋์ ์ฝ๋๊ฐ ๋๋ค.
- ํ ์คํธํ๊ธฐ ์ฉ์ดํด์ง๋ค.
- ๊ฐ๋ ์ฑ์ด ๋์์ง๋ค.
๋จ์
- ๋ชจ๋์ด ๋์ฑ๋ ๋ถ๋ฆฌ๋จ → ํด๋์ค ์ ์ฆ๊ฐ → ๋ณต์ก์ฑ ์ฆ๊ฐ → ์ฝ๊ฐ์ ๋ฐํ์ ํ๋ํฐ๊ฐ ์๊ธฐ๊ธฐ๋ ํจ
์์กด์ฑ ์ฃผ์ ์์น
- ์์ ๋ชจ๋์ ํ์ ๋ชจ๋์์ ์ด๋ ํ ๊ฒ๋ ๊ฐ์ ธ์ค์ง ์์์ผ ํ๋ค.
- ๋ ๋ค ์ถ์ํ์ ์์กดํด์ผ ํ๋ฉฐ, ์ด๋ ์ถ์ํ๋ ์ธ๋ถ ์ฌํญ์ ์์กดํ์ง ๋ง์์ผ ํ๋ค.
- ์ ํ์ํ ๊น?
- ์์ค ์ฝ๋์ ์์ , ๋ณ๊ฒฝ ๋ฑ์ ์ํฅ์ ๋ง์ด ๋ฐ๋ ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ํด๋์ค๋ค์ ๋ถ๋ฆฌํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์คํ ์์ ์ ๊ฐ์ฒด ๊ฐ์ ๊ด๊ณ๋ฅผ ๊ฒฐ์ ํด์ค์ผ๋ก์จ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๊ณ ์ ์ฐ์ฑ์ ํ๋ณดํ ์ ์๋ค.
- ํน์ ํด๋์ค(2๊ฐ ์ด์)๋ค์ด ๊ฐํ๊ฒ ๊ฒฐํฉ๋๋ ๋ฌธ์ , ๊ฐ์ฒด๋ค ๊ฐ์ ๊ด๊ณ๊ฐ ์๋ ํด๋์ค ๊ฐ์ ๊ด๊ณ๊ฐ ๋งบ์ด์ง๋ ๋ฌธ์ ๋ฅผ ํด์ํ๊ธฐ ์ํด DI๋ฅผ ์ฌ์ฉํ๋ค.
- ์์กด์ฑ ์ฃผ์ ์ ์ธ๋ถ์์ ์๋์ ์ผ๋ก ์ธ์คํด์คํ๋ฅผ ์งํํ๋ ๊ฒ์ด๋ค. ์๋น์ค์ ํ์ฅ์ ๋ฐ๋ฅธ ๋ถ์์ฉ์ ์ต์ํ ํ๊ธฐ ์ํด ํ์ํ๋ค.
- ์์กด์ฑ ์ฃผ์ ์ผ๋ก ํด๋์ค๊ฐ ๊ฒฐํฉ๋๊ฐ ์ฝํด์ง๊ฒ ๋๋๋ฐ, ์ด ๊ฒฝ์ฐ ํ๋์ ์์ ์ผ๋ก ๋ฆฌํํ ๋ง์ ์์ํ๊ฒ ํ๊ณ , ํ์ฅ์ฑ์ ๋์ด๋ ๋ฐ์ ์๋ค.
2. ํฉํ ๋ฆฌ ํจํด (Factory Pattern)
- ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ์ฝ๋์์ ๊ฐ์ฒด ์์ฑ ๋ถ๋ถ์ ๋ผ์ด๋ด ์ถ์ํํ ํจํด
- ์์ ๊ด๊ณ์ ์๋ ๋ ํด๋์ค์์ ์์ ํด๋์ค๊ฐ ์ค์ํ ๋ผ๋๋ฅผ ๊ฒฐ์ ํ๊ณ , ํ์ ํด๋์ค์์ ๊ฐ์ฒด ์์ฑ์ ๊ดํ ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ ๊ฒฐ์ ํ๋ ํจํด
ํน์ง
- ๋์จํ ๊ฒฐํฉ์ ๊ฐ์ง
- ์์ ํด๋์ค์ ํ์ ํด๋์ค๊ฐ ๋ถ๋ฆฌ๋๊ธฐ ๋๋ฌธ์ด๋ค.
- ๋ ๋ง์ ์ ์ฐ์ฑ์ ๊ฐ์ง
- ์์ ํด๋์ค์์๋ ์ธ์คํด์ค ์์ฑ ๋ฐฉ์์ ๋ํด ์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ ์ง ๋ณด์์ฑ ์ฆ๊ฐ
- ๊ฐ์ฒด ์์ฑ ๋ก์ง์ด ๋ถ๋ฆฌ๋์ด ์์ผ๋ฏ๋ก ์ฝ๋๋ฅผ ๋ฆฌํฉํฐ๋งํ๋๋ผ๋ ํ ๊ณณ๋ง ๊ณ ์น ์ ์๊ฒ ๋๋ค.
- ์์๊ตฌ์ฒด์ ์ธ ๋ด์ฉ์ด ๋ด๊ธด ํ์ ํด๋์ค๊ฐ ์ปจ๋ฒ ์ด์ค ๋ฒจํธ๋ฅผ ํตํด ์ ๋ฌ๋จ → ์์ ํด๋์ค(๋ฐ๋ฆฌ์คํ ๊ณต์ฅ)์์ ๋ ์ํผ๋ฅผ ํ ๋๋ก ๋ฌผ์ง(๋ผ๋ผ, ์ฐ์ ๋ฑ) ์์ฐ
- ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ(๋ผ๋ผ ๋ ์ํผ, ์๋ฉ๋ฆฌ์นด๋ ธ ๋ ์ํผ, ์ฐ์ ๋ ์ํผ)
ํฉํ ๋ฆฌ ํจํด ์ข ๋ฅ 2๊ฐ์ง
- ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด : ์๋ธ ํด๋์ค์ ์์์ ํ๋ค. (์ธํฐํ์ด์ค ์ถ์ํ ์์ผ์ ๋ฉ์ธ ๋ก์ง์์ ๊ฐ์ฒด ์์ฑ์ ํ์ง ์์)
- ์ถ์ ํฉํ ๋ฆฌ ํจํด : ๋น์ทํ ๋ฉ์๋๋ฅผ ์์ฑํ๊ธฐ ์ํ ํจํด
2๊ฐ์ง์ ์ฐจ์ด : ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ ํ๋์ ์ธ์คํด์ค, ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ์์ ์ ํจ. ์ถ์ ํจํด์ --์ถ๊ฐ๊ณต๋ถ
์๋ฐ์คํฌ๋ฆฝํธ์ ํฉํ ๋ฆฌ ํจํด
const num = new Object(42)
const str = new Object("abc");
num.constructor.name; // Number
str.constructor.name; // String
- ์ ๋ฌ๋ฐ์ ๊ฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ํ์ ์ ๊ฐ์ฒด ํ์ ์์ฑํ๋ฉฐ ์ธ์คํด์ค ํ์ ๋ฑ์ ๊ฒฐ์
// ์ปคํผ ํฉํ ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ผ๋ผ ๋ฑ์ ์์ฑํ๋ ์ฝ๋
class Latte {
constructor() {
this.name = "latte"
}
}
class Espresso {
constructor() {
this.name = "Espresso"
}
}
class LatteFactory {
static createCoffee() {
return new Latte()
}
}
class EspressoFactory {
static createCoffee() {
return new Espresso()
}
}
const factoryList = { LatteFactory, EspressoFactory }
class CoffeeFactory {
static createCoffee(type) {
const factory = factoryList[type]
return factory.createCoffee()
}
}
const main = () => {
// ๋ผ๋ผ ์ปคํผ๋ฅผ ์ฃผ๋ฌธํ๋ค.
const coffee = CoffeeFactory.createCoffee("LatteFactory")
// ์ปคํผ ์ด๋ฆ์ ๋ถ๋ฅธ๋ค.
console.log(coffee.name); // latte
}
main()
์์กด์ฑ ์ฃผ์
- ์์ ํด๋์ค CoffeeFactory - ์ค์ํ ๋ผ๋ ๊ฒฐ์
- static ํค์๋๋ฅผ ํตํด createCoffee() ๋ฉ์๋๋ฅผ ์ ์ ๋ฉ์๋๋ก ์ ์ธํจ
- ํ์ ํด๋์ค LatteFactory - ๊ตฌ์ฒด์ ์ธ ๋ด์ฉ ๊ฒฐ์
- LatteFactory ์์ ์์ฑํ ์ธ์คํด์ค๋ฅผ CoffeeFactory ์ ์ฃผ์ ํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- createCoffee() ์ ์ ๋ฉ์๋ ์ ์
- ์ ์ ๋ฉ์๋ ์ฌ์ฉ ์ ์ฅ์
- ํด๋์ค์ ์ธ์คํด์ค ์์ด ํธ์ถ์ด ๊ฐ๋ฅํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฝ ๊ฐ๋ฅ (๋ฉ์๋์ ๋ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ํ ๋ฒ๋ง ํ ์ ์๊ธฐ ๋๋ฌธ)
- ๊ฐ๋ณ ์ธ์คํด์ค์ ๋ฌถ์ด์ง ์์ผ๋ฉฐ ํด๋์ค ๋ด์ ํจ์ ์ ์ ๊ฐ๋ฅ
3. ์ ๋ต ํจํด (Strategy Pattern)
: ๊ฐ์ฒด ํ์๋ฅผ ๋ฐ๊พธ๊ณ ์ถ์ ๊ฒฝ์ฐ ‘์ง์ ’ ์์ ํ์ง ์๊ณ ์ ๋ต์ด๋ผ๊ณ ๋ถ๋ฅด๋ ‘์บก์ํํ ์๊ณ ๋ฆฌ์ฆ’์ ์ปจํ ์คํธ ์์์ ๋ฐ๊ฟ์ฃผ๋ฉด์ ์ํธ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํ๊ฒ ๋ง๋๋ ํจํด
- ์ ๋ต(์ธํฐํ์ด์ค ์์๋ฐ์ ๊ตฌํ ํด๋์ค)๋ง ๋ฐ๊ฟ์น๊ธฐ ํ๋ค.
- ์ฌ๋ฌ ์๊ณ ๋ฆฌ์ฆ์ ํ๋์ ์ถ์์ ์ธ ์ ๊ทผ์ (interface)์ ๋ง๋ค์ด ์ ๊ทผ์ ์์ ์๋ก ๊ตํ ๊ฐ๋ฅ(Deligat)ํ๋๋ก ํ๋ ํจํด
- ์ ์ฑ ํจํด (Policy Pattern)์ด๋ผ๊ณ ๋ ํ๋ค.
- ์ปจํ ์คํธ ์ํฉ, ๋งฅ๋ฝ, ๋ฌธ๋งฅ์ ์๋ฏธ ๊ฐ๋ฐ์๊ฐ ์ด๋ ํ ์์ ์ ์๋ฃํ๋ ๋ฐ ํ์ํ ๋ชจ๋ ๊ด๋ จ ์ ๋ณด๋ฅผ ๋งํ๋ค.
- ์บก์ํ
- ์ถ๊ฐ ๊ณต๋ถ
passport์ ์ ๋ต ํจํด
: Node.js ์ธ์ฆ ๋ชจ๋ ๊ตฌํ ๋ฏธ๋ค์จ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, LocalStrategy ์ ๋ต๊ณผ OAuth ์ ๋ต ๋ฑ์ ์ง์ํ๊ณ ์ฌ๋ฌ ๊ฐ์ง ‘์ ๋ต’์ ๊ธฐ๋ฐ์ผ๋ก ์ธ์ฆํ ์ ์๊ฒ ํ๋ค.
- LocalStrategy ์ ๋ต
- ์๋น์ค ๋ด์ ํ์๊ฐ์ ๋ ID, PW ๊ธฐ๋ฐ ์ธ์ฆ
- OAuth ์ ๋ต
- ํ์ด์ค๋ถ, ๋ค์ด๋ฒ ๋ฑ ๋ค๋ฅธ ์๋น์ค ๊ธฐ๋ฐ ์ธ์ฆ
// ‘์ ๋ต’๋ง ๋ฐ๊ฟ์ ์ธ์ฆํ๋ ์ฝ๋
var passport = require('passport'),
LocalStrategy = require('passport-local').Strategy;
passport.use(new LocalStrategy(
function (username, password, done) {
User.findOne({ username: username }, function (err, user) {
if (err) {
return done(err);
}
if (!user) {
return done(null, false, { message: 'Incorrect username.' });
}
if (!user.validPassword(password)) {
return done(null, false, { message: 'Incorrect password.' });
}
return done(null, user);
});
})
);
- passport.use(new LocalStrategy(..
- passport.use() ๋ฉ์๋์ ‘์ ๋ต’์ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ด ๋ก์ง ์ํ
4. ์ต์ ๋ฒ ํจํด (Obsever Pattern)
: ์ฃผ์ฒด๊ฐ ์ด๋ค ๊ฐ์ฒด(subject)์ ์ํ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ค๊ฐ ์ํ ๋ณํ๊ฐ ์์ ๋๋ง๋ค ๋ฉ์๋ ๋ฑ์ ํตํด ์ต์ ๋ฒ ๋ชฉ๋ก์ ์๋ ์ต์ ๋ฒ๋ค์๊ฒ ๋ณํ๋ฅผ ์๋ ค์ฃผ๋ ๋์์ธ ํจํด
- ์ฃผ์ฒด: ๊ฐ์ฒด์ ์ํ ๋ณํ๋ฅผ ๋ณด๊ณ ์๋ ๊ด์ฐฐ์
- ์ต์ ๋ฒ๋ค: ‘์ถ๊ฐ ๋ณํ ์ฌํญ’์ด ์๊ธฐ๋ ๊ฐ์ฒด๋ค (๊ฐ์ฒด์ ์ํ ๋ณํ์ ๋ฐ๋ผ ์ ๋ฌ๋๋ ๋ฉ์๋ ๋ฑ์ ๊ธฐ๋ฐ
- ์ฃผ์ฒด์ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ๋์ง ์๊ณ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถํ๊ธฐ๋ ํจ (ex. ํธ์ํฐ)
๋ฐํ ๊ตฌ๋ ๋ชจ๋ธ
์น ์์ผ์์ ์ฑํ ๊ตฌํ์ ๋งํ๋ ์ฌ๋์ด ๋ฐํ์, ๋๋จธ์ง๊ฐ ๊ตฌ๋ ์, ์คํธ๋ฆฌ๋จธ(๋ฐํ์)-์์ฒญ์(๊ตฌ๋ ์))
์ค์๊ฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ฑ์ฅํ๋ค. (๊ตฌ๋ ์ ํ์ ๊ฒฝ์ฐ์๋ง ์๋ฆผ์ด ๊ฐ)
์ต์ ๋ฒ ํจํด ์ฅ์ ๊ณผ ๋จ์
| ์ฅ์ | - ๊ฒฐํฉ๋ ๋ฎ์ (๊ตฌ๋ ์ ๋ฐ๋์ ํด์ผํ๋ ๊ฒ, ๋์ด์ผ ํ๋ ๊ฒ๋ ์๋๊ธฐ ๋๋ฌธ) | | --- | --- | | | - ์ค์๊ฐ์ฑ | | | |
์ต์ ๋ฒ ํจํด ๊ตฌ์กฐ
์ฃผ๋ก ์ด๋ฒคํธ ๊ธฐ๋ฐ ์์คํ ๊ณผ MVC ํจํด์ ์ฌ์ฉ๋๋ค.
Model(์ฃผ์ฒด)์ ๋ณ๊ฒฝ ์ฌํญ ๋ฐ์ → update() ๋ฉ์๋๋ก View(์ต์ ๋ฒ)์ ์๋ฆผ → ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก Controller ๋ฑ์ด ์๋
์ต์ ๋ฒ ํจํด ๊ตฌํ
ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์จ์ ๊ตฌํ
- ๊ฐ์ฒด์ ์์ฑ์ด๋ ๋ฉ์๋ ๋ณํ ๊ฐ์ง
- ์ด๋ฅผ ๋ฏธ๋ฆฌ ์ค์ ํด ๋์ ์ต์ ๋ฒ๋ค์๊ฒ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ
ํ๋ก์(proxy) ๊ฐ์ฒด
: ์ด๋ ํ ๋์์ ๊ธฐ๋ณธ์ ์ธ ๋์(์์ฑ ์ ๊ทผ, ํ ๋น, ์ํ, ์ด๊ฑฐ, ํจ์ ํธ์ถ ๋ฑ)์ ์์ ์ ๊ฐ๋ก์ฑ ์ ์๋ ๊ฐ์ฒด
- ์๋ฐ์คํฌ๋ฆฝํธ์์ ํ๋ก์ ๊ฐ์ฒด๋ ๋ ๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง
- target : ํ๋ก์ํ ๋์
- handler : target ๋์์ ๊ฐ๋ก์ฑ๊ณ ์ด๋ ํ ๋์์ ํ ๊ฒ์ธ์ง๊ฐ ์ค์ ๋์ด ์๋ ํจ์
- ๋์์ธ ํจํด ์ค ํ๋์ธ ํ๋ก์ ํจํด์ด ๋ น์๋ค์ด ์๋ ๊ฐ์ฒด
์๋ฐ์คํฌ๋ฆฝํธ์์์ ์ต์ ๋ฒ ํจํด
ํ๋ก์ ๊ฐ์ฒด๋ฅผ ํตํด ๊ตฌํ ๊ฐ๋ฅ
// ํ๋ก์ ๊ฐ์ฒด ๊ตฌํ ์ฝ๋
const handler = {
get: function(target, name) {
return name === 'name' ? `${target.a} ${target.b}` : target[name]
}
}
const p = new Proxy({a: 'KUNDOL', b: 'IS AUMUMU ZANGIN'}, handler)
console.log(p.name). // KUNDOL IS AUMUMU ZANGIN
- new Proxy()๋ก a์ b ์์ฑ์ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด์ handler ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฃ๊ณ p๋ผ๋ ๋ณ์๋ฅผ ์ ์ธ
- ์ด ํ p์ name ์์ฑ์ ์ฐธ์กฐํ๋ a์ b๋ผ๋ ์์ฑ๋ฐ์ ์๋ ๊ฐ์ฒด๊ฐ handler์ “name์ด๋ผ๋ ์์ฑ์ ์ ๊ทผํ ๋ a์ b๋ฅผ ํฉ์ณ์ ๋ฌธ์์ด์ ๋ง๋ค๋ผ” ๋ ๋ก์ง์ ๋ฐ๋ผ ์ด๋ ํ ๋ฌธ์์ด์ ๋ง๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
- ์ด๋ ๊ฒ name ์์ฑ ๋ฑ ์ด๋ ํ ์์ฑ์ ์ ๊ทผํ ๋ ๊ทธ ๋ถ๋ถ์ ๊ฐ๋ก์ฑ์ ์ด๋ ํ ๋ก์ง์ ๊ฐ์ ํ ์ ์๋๊ฒ ํ๋ก์ ๊ฐ์ฒด์ด๋ค.
→ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ ์ต์ ๋ฒ ํจํด
function createReactiveObject(target, callback) {
const proxy = new Proxy(target, {
set(obj, prop, value) {
if (value !== obj[prop]) {
const prev = obj[prop]
obj[prop] = value
callback(`${prop}๊ฐ [${prev}] >> [${value}] ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค`)
}
return true
},
})
return proxy
}
const a = {
ํ๊ท: "์๋ก",
}
const b = createReactiveObject(a, console.log)
b.ํ๊ท = "์๋ก"
b.ํ๊ท = "์ปคํ"
// ํ๊ท๊ฐ [์๋ก] >> [์ปคํ] ๋ก ๋ณ๊ฒฝ๋์์ต๋๋ค
- ํ๋ก์ ๊ฐ์ฒด์ get() ํจ์๋ ์์ฑ๊ณผ ํจ์์ ๋ํ ์ ๊ทผ์ ๊ฐ๋ก์ฑ๋ค.
- has() ํจ์๋ in ์ฐ์ฐ์์ ์ฌ์ฉ์ ๊ฐ๋ก์ฑ๋ค.
- set() ํจ์๋ ์์ฑ์ ๋ํ ์ ๊ทผ์ ๊ฐ๋ก์ฑ๋ค.
→ set() ํจ์๊ฐ ํ๊ท์ ์์ฑ์ ๊ฐ๋ก์ฑ์ ์๋ก์์ ์ปคํ๋ก ๋๋ ๊ฒ์ ํ์ธ
5. ํ๋ก์ ํจํด (Proxy Pattern)
: ๋์ ๊ฐ์ฒด(subject)์ ์ ๊ทผํ๊ธฐ ์ ๊ทธ ์ ๊ทผ์ ๋ํ ํ๋ฆ์ ๊ฐ๋ก์ฑ ๋์ ๊ฐ์ฒด ์๋จ์ ์ธํฐํ์ด์ค ์ญํ ์ ํ๋ ๋์์ธ ํจํด
- ๊ฐ์ฒด์ ์์ฑ, ๋ณํ ๋ฑ์ ๋ณด์
- ๋ณด์, ๋ฐ์ดํฐ ๊ฒ์ฆ, ์บ์ฑ, ๋ก๊น ์ ์ฌ์ฉ
- ํ๋ก์ ๊ฐ์ฒด, ํ๋ก์ ์๋ฒ๋ก๋ ํ์ฉ
- ์ฅ์ : ๊ฐ์ฒด์ ์์ฑ์ ๋ฏธ๋ฃฐ ์ ์์ (์นดํผ๋ณธ์ผ๋ก ์กฐํ๋ฅผ ํ๊ธฐ ๋๋ฌธ์, ๊ฐ์ฒด์ ์ ๊ทผํ์ง ์์๋ ๋๋ฏ๋ก ๋น ๋ฅด๊ฒ ์์ ๊ฐ๋ฅ)
- ๋จ์ : ๊ตฌํ์ด ์ด๋ ค์ ๋ก์ง์ด ๋ํดํด์ง๋ค
- AOP, ๋ฐ์ดํฐ JPE? ์์ ๋ง์ด ์ฐ์
ํ๋ก์ ์๋ฒ์์์ ์บ์ฑ
- ์บ์ ์์ ์ ๋ณด๋ฅผ ๋ด์๋๊ณ , ์บ์ ์์ ์๋ ์ ๋ณด๋ฅผ ์๊ตฌํ๋ ์์ฒญ์ ๋ํด ๋ค์ ์ ๋ฉ๋ฆฌ ์๋ ์๊ฒฉ ์๋ฒ์ ์์ฒญํ์ง ์๊ณ ์บ์ ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๋ ๊ฒ์ ๋งํ๋ค.
- ์ด๋ฅผ ํตํด ๋ถํ์ํ๊ฒ ์ธ๋ถ์ ์ฐ๊ฒฐํ์ง ์๊ธฐ ๋๋ฌธ์ ํธ๋ํฝ์ ์ค์ผ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
5.1. ํ๋ก์ ์๋ฒ (Proxy Server)
: ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์์ ํด๋ผ์ด์ธํธ๊ฐ ์์ ์ ํตํด ๋ค์ ๋คํธ์ํฌ ์๋น์ค์ ๊ฐ์ ์ ์ผ๋ก ์ ์ํ ์ ์๊ฒ ํด์ฃผ๋ ์ปดํจํฐ ์์คํ ์ด๋ ์์ฉ ํ๋ก๊ทธ๋จ
๊ฐ์ ํ๋ก์
์๊ฒฉ ํ๋ก์
A. nginx
๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ๊ตฌ์กฐ์ ๋ค์์ ์ฐ๊ฒฐ์ ํจ๊ณผ์ ์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅํ ์น ์๋ฒ
- ์ฃผ๋ก Node.js ์๋ฒ ์๋จ์ ํ๋ก์ ์๋ฒ๋ก ํ์ฉ
- Node.js ์๋ฒ ๊ตฌ์ถ ์, ์๋จ์ nginx๋ฅผ ๋๋ค.
- Node.js์ ๋ฒํผ ์ค๋ฒ ํ๋ก์ฐ ์ทจ์ฝ์ ์๋ฐฉ
- ์ต๋ช
์ฌ์ฉ์์ ์ง์ ์ ์ธ ์๋ฒ๋ก์ ์ ๊ทผ ์ฐจ๋จ → ๋ณด์์ฑ ๊ฐํ
- ๋ฒํผ ์ค๋ฒํ๋ก์ฐ : ๋ฒํผ๋ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก, ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ๋ฅผ ๋งํ๋ค. ์ด๋ ์ฌ์ฉ๋์ง ์์์ผ ํ ์์ญ์ ๋ฐ์ดํฐ๊ฐ ๋ฎ์ด์์์ ธ ์ฃผ์, ๊ฐ์ ๋ฐ๊พธ๋ ๊ณต๊ฒฉ์ด ๋ฐ์ํ๊ธฐ๋ ํ๋ค.
- ์ค์ ํฌํธ ์จ๊ธฐ๊ธฐ ๊ฐ๋ฅ
- ์ ์ ์์์ gzip ์์ถ ๊ฐ๋ฅ
- gzip ์์ถ : DEFLATE ์๊ณ ๋ฆฌ์ฆ(LZ77 + Huffman ์ฝ๋ฉ์ ์กฐํฉ)์ ๊ธฐ๋ฐ์ผ๋ก ํ ์์ถ ๊ธฐ์ .
- ๋ฐ์ดํฐ ์ ์ก๋์ ์ค์ผ ์ ์์ผ๋, ์์ถ ํด์ ์ ์๋ฒ์์์ CPU ์ค๋ฒํค๋๋ ์๊ฐํด์ gzip ์์ถ ์ฌ์ฉ ์ ๋ฌด ๊ฒฐ์ ํด์ผ ํ๋ค.
- ๋ฉ์ธ ์๋ฒ ์๋จ์์์ ๋ก๊น ๊ฐ๋ฅ
B. CloudFlare
์ ์ธ๊ณ์ ์ผ๋ก ๋ถ์ฐ๋ ์๋ฒ๋ฅผ ํตํด ์ด๋ค ์์คํ ์ ์ฝํ ์ธ ์ ๋ฌ์ ๋น ๋ฅด๊ฒ ํ๋ CDN ์๋น์ค
- ์ฌ์ฉ์, ํฌ๋กค๋ฌ, ๊ณต๊ฒฉ์๊ฐ ์์ ์ ์น ์ฌ์ดํธ์ ์ ์ ์ CloudFlare๋ฅผ ํตํด ๊ณต๊ฒฉ์๋ก๋ถํฐ ๋ณดํธ ๊ฐ๋ฅ
- ์ฌ์ฉ ์ ์ด์
- DDOS ๊ณต๊ฒฉ ๋ฐฉ์ด
- HTTPS ๊ตฌ์ถ
- ์บ์ฑ, ๋ก๊ทธ ๋ถ์
- ์๋ฒ ๋ฐฐํฌ์ ์์ฌ์ค๋ฌ์ด ๋ง์ ํธ๋ํฝ ๋ฐ์์ผ๋ก ์ธํ ํด๋ผ์ฐ๋ ์๋น์ค ๋น์ฉ ๋ฐ์์ ์ผ์ ๋ถ๋ถ ๋ง์์ฃผ๋ ์ญํ ์ํ (CloudFlare๊ฐ CAPTCHA ๋ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์์ฌ์ค๋ฌ์ด ํธ๋ํฝ์ธ์ง ๋จผ์ ํ๋จ)
- CDN (Content Delivery Network)
- ๊ฐ ์ฌ์ฉ์๊ฐ ์ธํฐ๋ท์ ์ ์ํ๋ ๊ณณ๊ณผ ๊ฐ๊น์ด ๊ณณ์์ ์ฝํ ์ธ ๋ฅผ ์บ์ฑ ๋๋ ๋ฐฐํฌํ๋ ์๋ฒ ๋คํธ์ํฌ
- ์ด๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ์น ์๋ฒ๋ก๋ถํฐ ์ฝํ ์ธ ๋ฅผ ๋ค์ด๋ก๋ํ๋ ์๊ฐ ๊ฐ์
DDOS ๊ณต๊ฒฉ ๋ฐฉ์ด
DDOS : ์งง์ ๊ธฐ๊ฐ ๋์ ๋คํธ์ํฌ์ ๋ง์ ์์ฒญ์ ๋ณด๋ด ๋คํธ์ํฌ๋ฅผ ๋ง๋น์์ผ ์น ์ฌ์ดํธ์ ๊ฐ์ฉ์ฑ์ ๋ฐฉํดํ๋ ์ฌ์ด๋ฒ ๊ณต๊ฒฉ ์ ํ
CloudFlare๋ ์์ฌ์ค๋ฌ์ด ํธ๋ํฝ, ํนํ ์ฌ์ฉ์๊ฐ ์ ์ํ๋ ๊ฒ์ด ์๋ ์์คํ ์ ํตํด ์ค๋ ํธ๋ํฝ์ ์๋์ผ๋ก ์ฐจ๋จ → DDOS ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธ
CloudFlare์ ๊ฑฐ๋ํ ์ฉ๋๊ณผ ์บ์ฑ ์ ๋ต์ผ๋ก ์๊ท๋ชจ DDOS ๊ณต๊ฒฉ์ ์ฝ๊ฒ ๋ง์๋ผ ์ ์์ผ๋ฉฐ ์ด๋ฌํ ๊ณต๊ฒฉ์ ๋ํ ๋ฐฉํ๋ฒฝ ๋์๋ณด๋ ์ ๊ณต
HTTPS ๊ตฌ์ถ
์๋ฒ์์ HTTPS ๊ตฌ์ถ ์ CloudFlare๋ฅผ ์ฌ์ฉ์ผ๋ก ๋ณ๋์ ์ธ์ฆ์ ์ค์น ์์ด ์ข ๋ ์์ฝ๊ฒ HTTPS๋ฅผ ๊ตฌ์ถ ๊ฐ๋ฅ
C. CORS์ ํ๋ก ํธ์๋์ ํ๋ก์ ์๋ฒ
CORS (Cross-Origin Resource Sharing): ์๋ฒ๊ฐ ์น ๋ธ๋ผ์ฐ์ ์์ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ ๋, ๋ค๋ฅธ ์ค๋ฆฌ์ง์ ํตํด ๋ก๋ํ์ง ๋ชปํ๊ฒ ํ๋ HTTP ํค๋ ๊ธฐ๋ฐ ๋ฉ์ปค๋์ฆ
- ์ค๋ฆฌ์ง : ํ๋กํ ์ฝ๊ณผ ํธ์คํธ ์ด๋ฆ, ํฌํธ์ ์กฐํฉ
- FE ์๋ฒ ์๋จ์ ํ๋ก์ ์๋ฒ๋ฅผ ๋์์ ๋ง๋ ๋ค.
- FE ์๋ฒ๋ฅผ ๋ง๋ค์ด์ BE ์๋ฒ์ ํต์ ์์ ๋ง์ฃผ์น๋ CORS ์๋ฌ ํด๊ฒฐ ๊ฐ๋ฅ
- FE ์๋ฒ์ BE ์๋ฒ ๊ฐ์ ํฌํธ ๋ฒํธ ๋ถ์ผ์น ์ค๋ฅ ํด๊ฒฐ
- ๋ค์ํ API ์๋ฒ์์ ํต์ ๊ฐ๋ฅ
D. AOP
์ค์ฒด ๊ฐ์ฒด์ ์ ๊ทผํ์ง ์์๋ ๋ผ์ ๋ถ๋ด์ด ์ ๋ค.
์ค์ ๋ก์ง์ ๋ค์ด๊ฐ์ง ์์๋ ํ์ํ ์์ ์ ํ๋ค.
์ง๋ฌธ
ํฉํ ๋ฆฌ ๋ฉ์๋ ํจํด์ด ์ด๋์ ํ์ฉ๋๋ฉด ์ข์ ๊ฒ ๊ฐ์ ์ง์ ๊ทธ ์ด์
- ์๊ตฌ์ฌํญ์ด ๋ง์ด ๋ณํ์ง ์๋ ๊ฐ์ฒด์ ๋ํ ์น ์์ ์ ํ ๋
- ์ถ์ ํฉํ ๋ฆฌ ํจํด์ ๋ด๋ถ ์์ฑ์ ๋ฐ๋๋ ๋ณธ์ง์ ๋ฐ๋์ง ์๋ ์์ ์ ํ์ฉ๋๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค.
์์ฑ ํจํด ์ค ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ๊ฑฐ์ ๊ทธ ์ด์ , ์ฅ๋จ์
- ์ฑ๊ธํค ํจํด
- ์์กด์ฑ ์ฃผ์ ์ ํตํด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์๊ธฐ ๋๋ฌธ, ํ์ฅ์ฑ์๋ ์ค๊ณ๊ฐ ๊ฐ๋ฅํ๋ค.
- ๋จ์ TDD
์ต์ ๋ฒ ํจํด์ ์นดํ์ ์ ์ฉํ๋ค๋ฉด ์ด๋ค๊ฑธ ์ ์ฉํ ์ ์์๊น?
- ์คํ๋ฒ ์ค์ ๋ฐํ์(์นดํ)- ์๋(๊ตฌ๋ ์)์ด ์ ์ฉ๋ ์ ์์ ๊ฑฐ ๊ฐ์ต๋๋ค.
6. ์ดํฐ๋ ์ดํฐ ํจํด (iterator pattern)
**์ดํฐ๋ ์ดํฐ(iterator)**๋ฅผ ์ฌ์ฉํ์ฌ ์ปฌ๋ ์ (collection) ํ๋ ์์ํฌ์ ์์๋ค์ ์ ๊ทผํ๋ ๋์์ธ ํจํด
๋ค๋ฅธ ๊ฐ์ฒด๋ผ๋ ๋๊ฐ์ ์ธํฐํ์ด์ค๋ก ์ํ ๊ฐ๋ฅ ⇒ ์ํํ ์ ์๋ ์ฌ๋ฌ ๊ฐ์ง ์๋ฃํ์ ๊ตฌ์กฐ์๋ ์๊ด์์ด ‘์ดํฐ๋ ์ดํฐ’ ๋ผ๋ ํ๋์ ์ธํฐํ์ด์ค๋ก ์ํ ๊ฐ๋ฅ
- ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ : ์ดํฐ๋ฌ๋ธํ ๊ฐ์ฒด๋ค์ ์ํํ ๋ ์ฐ์ด๋ ๊ท์น
- ์ดํฐ๋ฌ๋ธํ ๊ฐ์ฒด : ๋ฐ๋ณต ๊ฐ๋ฅํ ๊ฐ์ฒด๋ก ๋ฐฐ์ด์ ์ผ๋ฐํํ ๊ฐ์ฒด
์์
- ์ฑ ๊ฝ์ด ์์ ์ฑ ์ ๊ฝ๊ณ , ๋ค์ ์ฑ ์ ํ๋์ฉ ํ์ธํ๋ ์์
์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋
const mp = new Map()
mp.set('a',1)
mp.set('b',2)
mp.set('c',3)
const st = new Set()
st.add(1)
st.add(2)
st.add(3)
for (let a of mp) console.log(a)
for (let a of st) console.log(a)
/*
์ถ๋ ฅ
[ 'a', 1 ]
[ 'b', 2 ]
[ 'c', 3 ]
1
2
3
*/
๋ค๋ฅธ ์๋ฃ ๊ตฌ์กฐ์ธ set๊ณผ map → ๋๊ฐ์ ‘for a of b’๋ผ๋ ์ดํฐ๋ ์ดํฐ ํ๋กํ ์ฝ์ ํตํด ์ํํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
7. ๋ ธ์ธ๋ชจ๋ ํจํด(revealing module pattern)
์ฆ์ ์คํ ํจ์๋ฅผ ํตํด ์ ๊ทผ ์ ์ด์๋ฅผ ๋ง๋๋ ํจํด (ex. private, public ๋ฑ)
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ ์ญ ๋ฒ์์์ ์คํฌ๋ฆฝํธ ์คํ(์ ๊ทผ ์ ์ด์ ์กด์ฌx) → ๋ ธ์ธ๋ชจ๋ ํจํด์ ํตํด ์ ๊ทผ ์ ์ด์ ๊ตฌํ
- ์ฆ์ ์คํ ํจ์ : ํจ์๋ฅผ ์ ์ํ์๋ง์ ๋ฐ๋ก ํธ์ถํ๋ ํจ์๋ก, ์ด๊ธฐํ ์ฝ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ด ์ ์ญ ๋ณ์์ ์ถฉ๋ ๋ฐฉ์ง ๋ฑ์ ์ฌ์ฉ
- ๋
ธ์ธ๋ชจ๋์ ์ฅ์
- ๊ฐ๋ฐ์ ๊นใฒ๋ฏํ๊ณ ์ ๊ทผํ๊ธฐ ์ฌ์ด ๋ฐฉ๋ฒ ์ ๊ณต
- public, private ๋ฑ์ ํตํด ์ฝ๋์ ๋ช ์์ฑ์ ๋์ผ ์ ์๋ค.
- ์ ์ญ ๋ณ์๋ฅผ ์ฐ์ง ์์์ ์ค์ฝํ๋ฅผ ๋๋ฝํ์ง ์๋๋ค.
ํด๋์ค์ ์ ์๋ ํจ์ ์์ ํด๋์ค ์ธ๋ถ ํด๋์ค
public | ์ ๊ทผ ๊ฐ๋ฅO | ์ ๊ทผ ๊ฐ๋ฅO | ์ ๊ทผ ๊ฐ๋ฅO |
protected | ์ ๊ทผ ๊ฐ๋ฅO | ์ ๊ทผ ๊ฐ๋ฅO | ์ ๊ทผ ๊ฐ๋ฅX |
private | ์ ๊ทผ ๊ฐ๋ฅO | ์ ๊ทผ ๊ฐ๋ฅX | ์ ๊ทผ ๊ฐ๋ฅX |
const pukuba = (() => {
const a = 1
const b = () => 2
const public = {
c : 2,
d : () => 3
}
return public
})()
console.log(pukuba) // { c: 2, d: [Function: d] }
console.log(pukuba.a) // undefinded
- a, b: ๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉํ ์ ์๋ ๋ณ์๋ ํจ์, private ๋ฒ์๋ฅผ ๊ฐ์ง๋ค.
- c, d: ๋ค๋ฅธ ๋ชจ๋์์ ์ฌ์ฉํ ์ ์๋ ๋ณ์๋ ํจ์, public ๋ฒ์๋ฅผ ๊ฐ์ง๋ค.
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋ ๋ฐฉ์ : CJS(CommonJS) ๋ชจ๋ ๋ฐฉ์
8. MVC ํจํด
๋ชจ๋ธ(Model), ๋ทฐ(View), ์ปจํธ๋กค๋ฌ(Controller)๋ก ์ด๋ฃจ์ด์ง ๋์์ธ ํจํด
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑ ์์๋ฅผ ์ธ ๊ฐ์ง ์ญํ ๋ก ๊ตฌ๋ถํ์ฌ ๊ฐ๋ฐ ํ๋ก์ธ์ค์์ ๊ฐ๊ฐ์ ๊ตฌ์ฑ ์์์๋ง ์ง์คํด์ ๊ฐ๋ฐ ๊ฐ๋ฅ
- ์ฅ์
- ์ฌ์ฌ์ฉ์ฑ, ํ์ฅ์ฑ ์ฉ์ดํจ
- ๋จ์
- ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ณต์กํด์ง์๋ก ๋ชจ๋ธ๊ณผ ๋ทฐ์ ๊ด๊ณ๊ฐ ๋ณต์กํด์ง
Model ๋ชจ๋ธ
์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ดํฐ (๋ฐ์ดํฐ๋ฒ ์ด์ค, ์์, ๋ณ์ ๋ฑ)
- ๋ทฐ์์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ฑฐ๋ ์์ ํ๋ฉด ์ปจํธ๋กค๋ฌ๋ฅผ ํตํด ๋ชจ๋ธ์ ์์ฑํ๊ฑฐ๋ ๊ฐฑ์ ํ๋ค.
- ์์ : ์ฌ๊ฐํ ๋ชจ์์ ๋ฐ์ค ์์ ๊ธ์
- ์ฌ๊ฐํ ๋ชจ์์ ๋ฐ์ค ์์น ์ ๋ณด, ๊ธ์ ๋ด์ฉ, ๊ธ์ ์์น, ๊ธ์ ํฌ๋งท(utf-8)์ ๊ดํ ์ ๋ณด
View ๋ทฐ
์ฌ์ฉ์ ์ธํฐํ์ด์ค ์์ (inputbox, checkbox, textarea ๋ฑ)
๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์๊ฐ ๋ณผ ์ ์๋ ํ๋ฉด
- ๋ชจ๋ธ์ด ๊ฐ์ง๊ณ ์๋ ์ ๋ณด๋ฅผ ๋ฐ๋ก ์ ์ฅํ์ง ์์์ผ ํ๋ค. (๋จ์ํ ์ฌ๊ฐํ ๋ชจ์ ๋ฑ ํ๋ฉด์ ํ์ํ๋ ์ ๋ณด๋ง ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค.)
- ๋ณ๊ฒฝ์ด ์ผ์ด๋๋ฉด ์ปจํธ๋กค๋ฌ์ ์ด๋ฅผ ์ ๋ฌํด์ผ ํ๋ค.
Controller ์ปจํธ๋กค๋ฌ
ํ๋ ์ด์์ ๋ชจ๋ธ๊ณผ ํ๋ ์ด์์ ๋ทฐ๋ฅผ ์๋ ๋ค๋ฆฌ ์ญํ ๋ก, ๋ฉ์ธ ๋ก์ง ๋ด๋น (์ด๋ฒคํธ ๋ฑ)
๋ชจ๋ธ๊ณผ ๋ทฐ์ ์๋ช ์ฃผ๊ธฐ ๊ด๋ฆฌ
๋ชจ๋ธ์ด๋ ๋ทฐ์ ๋ณ๊ฒฝ ํต์ง๋ฅผ ๋ฐ์ผ๋ฉด ์ด๋ฅผ ํด์ํ์ฌ ๊ฐ๊ฐ์ ๊ตฌ์ฑ ์์์ ํด๋น ๋ด์ฉ์ ๋ํด ์๋ ค์ค๋ค.
MVC ํจํด์ ์ : ๋ฆฌ์กํธ
MVC ํจํด์ ์ด์ฉํ ๋ํ์ ์ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฆฌ์กํธ(React.js)
๋ฆฌ์กํธ๋ ์ ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก, ‘Vitual DOM’์ ํตํด ์ค์ DOM์ ์กฐ์ํ๋ ๊ฒ์ ์ถ์ํํด์ ์ฑ๋ฅ์ ๋์๋ค.
- ํน์ฑ
- ๋ถ๋ณ์ฑ(immutable)
- state๋ setState๋ฅผ ํตํด์๋ง ์์ ์ด ๊ฐ๋ฅ
- props๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํด์ ๋ง๋ค์ด์ง๋ ์ปดํฌ๋ํธ์ธ pureComponent
- ๋จ๋ฐฉํฅ ๋ฐ์ธ๋ฉ์ด ์ ์ฉ๋์ด ์๋ค.
- ์์ ๋๊ฐ ๋๋ค.
- ๋ฉํ(ํ์ด์ค๋ถ)์ด ์ด์ํ๋ฉฐ, ๋ทํ๋ฆญ์ค, ํธ์ํฐ, ๋๋กญ๋ฐ์ค, ์ฐ๋ฒ, ํ์ดํ, ๋ง์ดํฌ๋ก์ํํธ ๋ฑ์์ ์ฌ์ฉ
- ๋ถ๋ณ์ฑ(immutable)
MVC ํจํด์ ์ : ์คํ๋ง(Spring)
MVC ํจํด์ ์ด์ฉํ ์๋ฐ์ ๋ํ์ ์ธ ํ๋ ์์ํฌ ์คํ๋ง(Spring)
Spring์ WEB MVC๋ ์น์๋น์ค๋ฅผ ๊ตฌ์ถํ๋๋ฐ ํธ๋ฆฌํ ๊ธฐ๋ฅ๋ค์ ๋ง์ด ์ ๊ณตํ๋ค.
- ํธ๋ฆฌํ ๊ธฐ๋ฅ ์ ๊ณต
- ์1 : @RequestParam, @RequestHeader, @PathVariable ๋ฑ์ ์ ๋ํ
์ด์
์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์์ ์์ฒญ๊ฐ๋ค์ ์ฝ๊ฒ ๋ถ์ํ ์ ์๋ค.
- ์ฌ์ฉ์์ ์ด๋ ํ ์์ฒญ์ด ์ ํจํ ์์ฒญ์ธ์ง๋ฅผ ์ฝ๊ฒ ๊ฑฐ๋ฅผ ์ ์์ต๋๋ค.
- ์2 : ์ซ์๋ฅผ ์ ๋ ฅํด์ผ ํ๋๋ฐ ๋ฌธ์๋ฅผ ์ ๋ ฅํ๋ ์ฌ๋ก
- ์1 : @RequestParam, @RequestHeader, @PathVariable ๋ฑ์ ์ ๋ํ
์ด์
์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์์ ์์ฒญ๊ฐ๋ค์ ์ฝ๊ฒ ๋ถ์ํ ์ ์๋ค.
- ์ฅ์
- ์ฌ์ฌ์ฉ๊ฐ๋ฅํ ์ฝ๋, ํ ์คํธ, ์ฝ๊ฒ ๋ฆฌ๋๋ ์ ํ ์ ์๊ฒ ํ๋ค.
์คํ๋ง ์ฐธ๊ณ ์์ ์ ํ๋ธ ํฐ๋์ ํฐ์ - 'Spring๊ณผ MVCํจํด' ์์
9. MVP ํจํด
MVC์ ์ปจํธ๋กค๋ฌ C๊ฐ ํ๋ ์ ํฐ(presenter)๋ก ๊ต์ฒด๋ ํจํด
๋ทฐ์ ํ๋ ์ ํฐ๋ ์ผ๋์ผ ๊ด๊ณ์ด๋ฏ๋ก MVC ํจํด๋ณด๋ค ๋ ๊ฐํ ๊ฒฐํฉ์ ์ง๋ ๋์์ธ ํจํด
์ฅ์ : 1:1๊ด๊ณ V์ P๊ฐ ์์กด์ฑ์ด ๋์์ง๋ค.
๋จ์ : V์ M์ ์์กด์ฑ์ด ๋ฎ์์ง๋ค.
10. MVVM ํจํด
MVC์ ์ปจํธ๋กค๋ฌ C๊ฐ ๋ทฐ ๋ชจ๋ธ(view model)๋ก ๊ต์ฒด๋ ํจํด
View model (๋ทฐ ๋ชจ๋ธ) : ๋ทฐ๋ฅผ ๋ ์ถ์ํํ ๊ณ์ธต
- ์ถ์ํ
- ๋์์์ ํน์ง์ ๋ฝ์๋ธ ๊ฒ์ผ๋ก ํ๋ก๊ทธ๋๋ฐ์์๋ interface ์์ ํจ์๋ฅผ ์ฐ๋๊ฒ ์ถ์ํ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ฝ๋๋ฅผ ์ผ์ ๋ ์ด๋ค ๋ด์ฉ์ ์ํํ๋์ง๊ฐ ํ๋์ ํ์ ๋์ง ์์๋ ์ถ์์ ์ด๋ผ๊ณ ๋งํ ์ ์์ต๋ค.
- MVC ํจํด๊ณผ์ ์ฐจ์ด์
- ์ฝ๋๊ฐ ์ ์ด๋ ์ปค๋งจ๋์ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ์ ๊ฑฐ์ณ์ผ ํ๋ค.
- ์ฅ์
- ๋ทฐ์ ๋ทฐ๋ชจ๋ธ ์ฌ์ด์ ์๋ฐฉํฅ ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ ์ง์
- UI๋ฅผ ๋ณ๋์ ์ฝ๋ ์์ ์์ด ์ฌ์ฌ์ฉํ ์ ์๋ค.
- ๋จ์ ํ ์คํ ํ๊ธฐ ์ฝ๋ค.
- ์ปค๋งจ๋
- ์ฌ๋ฌ ๊ฐ์ง ์์์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ํ๋์ ์ก์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํ๋ ๊ธฐ๋ฒ
- ๋ฐ์ดํฐ ๋ฐ์ธ๋ฉ
- ํ๋ฉด์ ๋ณด์ด๋ ๋ฐ์ดํฐ์ ์น ๋ธ๋ผ์ฐ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ผ์น์ํค๋ ๊ธฐ๋ฒ
- ๋ทฐ๋ชจ๋ธ์ ๋ณ๊ฒฝํ๋ฉด ๋ทฐ๊ฐ ๋ณ๊ฒฝ๋๋ค.
- ๋ทฐ ์ ์ฉ ๋ชจ๋ธ์ ๋ง๋๋๋ฐ UI์ ์ฑํฌ๋ฅผ ๋ง์ถ๋ ์์
- ๋ทฐ์ ๋น์ฆ๋์ค ๋ก์ง์ด ๋ถ๋ฆฌ๋์ด๋ ๋๊ธฐํ๊ฐ ๋๋ค.
- ์ต์ ๋ฒ ํจํด๊ณผ ์ ์ฌ
MVVM ํจํด์ ์ : ๋ทฐ
๋ทฐ(Vue.js)๋ ๋ฐ์ํ(reactivity)์ด ํน์ง์ธ ํ๋ก ํธ์๋ ํ๋ ์์ํฌ
์๋ฅผ ๋ค์ด, watch์ computed ๋ฑ์ผ๋ก ์ฝ๊ฒ ๋ฐ์ํ์ ์ธ ๊ฐ๋ค์ ๊ตฌ์ถํ ์ ์๋ค.
- ํน์ง
- ํจ์๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ ๋์ ๋ง์ผ๋ก๋ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋๋ค.
- ์๋ฐฉํฅ ๋ฐ์ธ๋ฉ, html์ ํ ๋๋ก ์ปดํฌ๋ํธ๋ฅผ ๊ตฌ์ถํ ์ ์๋ค.
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก UI ๊ตฌ์ถ ๊ฐ๋ฅ
- BMW, ๊ตฌ๊ธ, ๋ฃจ์ด๋นํต ๋ฑ์์ ์ฌ์ฉ
'๐ช CS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ERD์ ์ ๊ทํ ๊ณผ์ (0) | 2023.02.23 |
---|---|
๋ฐ์ดํฐ๋ฒ ์ด์ค (DB, DataBase) (0) | 2023.02.23 |
์๊ฐ ๋ณต์ก๋ Big-O (0) | 2023.02.23 |
์ง๋ฌธ ๋ฆฌ์คํธ - ๋์์ธ ํจํด (0) | 2023.01.04 |
ํ๋ ์์ํฌ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐจ์ด (1) | 2023.01.04 |