๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿช CS

1. Design Pattern ๋””์ž์ธ ํŒจํ„ด (์‹ฑ๊ธ€ํ†ค, ์˜ต์ €๋ฒ„, MVC, MVVM ๋“ฑ)

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๋„ ๋ณ€ํ•ด์•ผ ํ•œ๋‹ค)
    • ์‘์ง‘๋„ : ์„œ๋กœ์˜ ํ•„๋“œ๊ฐ’์„ ์•Œ์ง€๋„ ๋ชปํ•˜๊ณ  ๋ฉ”์ธ ๋กœ์ง์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๊ฑธ ์‘์ง‘๋„๊ฐ€ ๋†’๋‹ค๊ณ  ํ•œ๋‹ค.

์žฅ์ 

  1. ๋ชจ๋“ˆ ์‰ฝ๊ฒŒ ๊ต์ฒด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๊ฐ€ ๋˜์–ด, ์‰ฌ์šด ํ…Œ์ŠคํŒ…๊ณผ ์ˆ˜์›”ํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
  2. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์˜์กด์„ฑ ๋ฐฉํ–ฅ ์ผ๊ด€๋จ, ์‰ฝ๊ฒŒ ์ถ”๋ก  ๊ฐ€๋Šฅ, ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ด€๊ณ„๋“ค์ด ๋” ๋ช…ํ™•ํ•ด์ง
    • ๊ตฌํ˜„ํ•  ๋•Œ ์ถ”์ƒํ™” ๋ ˆ์ด์–ด๋ฅผ ๋„ฃ๊ณ  ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌํ˜„์ฒด๋ฅผ ๋„ฃ์–ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์˜์กด์„ฑ์ด ์ค„์–ด๋“ ๋‹ค.
  • ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์€ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค.
  • ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์šฉ์ดํ•ด์ง„๋‹ค.
  • ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๋‹ค.

๋‹จ์ 

  • ๋ชจ๋“ˆ์ด ๋”์šฑ๋” ๋ถ„๋ฆฌ๋จ → ํด๋ž˜์Šค ์ˆ˜ ์ฆ๊ฐ€ → ๋ณต์žก์„ฑ ์ฆ๊ฐ€ → ์•ฝ๊ฐ„์˜ ๋Ÿฐํƒ€์ž„ ํŽ˜๋„ํ‹ฐ๊ฐ€ ์ƒ๊ธฐ๊ธฐ๋„ ํ•จ

์˜์กด์„ฑ ์ฃผ์ž… ์›์น™

  • ์ƒ์œ„ ๋ชจ๋“ˆ์€ ํ•˜์œ„ ๋ชจ๋“ˆ์—์„œ ์–ด๋– ํ•œ ๊ฒƒ๋„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.
  • ๋‘˜ ๋‹ค ์ถ”์ƒํ™”์— ์˜์กดํ•ด์•ผ ํ•˜๋ฉฐ, ์ด๋•Œ ์ถ”์ƒํ™”๋Š” ์„ธ๋ถ€ ์‚ฌํ•ญ์— ์˜์กดํ•˜์ง€ ๋ง์•„์•ผ ํ•œ๋‹ค.
  • ์™œ ํ•„์š”ํ• ๊นŒ?
    • ์†Œ์Šค ์ฝ”๋“œ์˜ ์ˆ˜์ •, ๋ณ€๊ฒฝ ๋“ฑ์— ์˜ํ–ฅ์„ ๋งŽ์ด ๋ฐ›๋Š” ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ํด๋ž˜์Šค๋“ค์„ ๋ถ„๋ฆฌํ•˜๊ณ , ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์‹œ์ ์— ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๊ฒฐ์ •ํ•ด์คŒ์œผ๋กœ์จ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์œ ์—ฐ์„ฑ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํŠน์ • ํด๋ž˜์Šค(2๊ฐœ ์ด์ƒ)๋“ค์ด ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜๋Š” ๋ฌธ์ œ, ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ์•„๋‹Œ ํด๋ž˜์Šค ๊ฐ„์˜ ๊ด€๊ณ„๊ฐ€ ๋งบ์–ด์ง€๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•ด DI๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์˜์กด์„ฑ ์ฃผ์ž…์€ ์™ธ๋ถ€์—์„œ ์ž๋™์ ์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์„œ๋น„์Šค์˜ ํ™•์žฅ์— ๋”ฐ๋ฅธ ๋ถ€์ž‘์šฉ์„ ์ตœ์†Œํ™” ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค.
    • ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ํด๋ž˜์Šค๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ์•ฝํ•ด์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ์ด ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ์ˆ˜์ •์œผ๋กœ ๋ฆฌํŽ™ํ† ๋ง์„ ์ˆ˜์›”ํ•˜๊ฒŒ ํ•˜๊ณ , ํ™•์žฅ์„ฑ์„ ๋†’์ด๋Š” ๋ฐ์— ์žˆ๋‹ค.

 

 

 

2. ํŒฉํ† ๋ฆฌ ํŒจํ„ด (Factory Pattern)


  1. ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ ๋ถ€๋ถ„์„ ๋–ผ์–ด๋‚ด ์ถ”์ƒํ™”ํ•œ ํŒจํ„ด
  2. ์ƒ์† ๊ด€๊ณ„์— ์žˆ๋Š” ๋‘ ํด๋ž˜์Šค์—์„œ ์ƒ์œ„ ํด๋ž˜์Šค๊ฐ€ ์ค‘์š”ํ•œ ๋ผˆ๋Œ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ , ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ์— ๊ด€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์„ ๊ฒฐ์ •ํ•˜๋Š” ํŒจํ„ด

ํŠน์ง•

  • ๋А์Šจํ•œ ๊ฒฐํ•ฉ์„ ๊ฐ€์ง
    • ์ƒ์œ„ ํด๋ž˜์Šค์™€ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋ถ„๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ๊ฐ€์ง
    • ์ƒ์œ„ ํด๋ž˜์Šค์—์„œ๋Š” ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์•Œ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ์œ ์ง€ ๋ณด์ˆ˜์„ฑ ์ฆ๊ฐ€
    • ๊ฐ์ฒด ์ƒ์„ฑ ๋กœ์ง์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•˜๋”๋ผ๋„ ํ•œ ๊ณณ๋งŒ ๊ณ ์น  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • ์˜ˆ์‹œ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ์ด ๋‹ด๊ธด ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ์ปจ๋ฒ ์ด์Šค ๋ฒจํŠธ๋ฅผ ํ†ตํ•ด ์ „๋‹ฌ๋จ → ์ƒ์œ„ ํด๋ž˜์Šค(๋ฐ”๋ฆฌ์Šคํƒ€ ๊ณต์žฅ)์—์„œ ๋ ˆ์‹œํ”ผ๋ฅผ ํ† ๋Œ€๋กœ ๋ฌผ์งˆ(๋ผ๋–ผ, ์šฐ์œ  ๋“ฑ) ์ƒ์‚ฐ
  • ๊ตฌ์ฒด์ ์ธ ๋‚ด์šฉ(๋ผ๋–ผ ๋ ˆ์‹œํ”ผ, ์•„๋ฉ”๋ฆฌ์นด๋…ธ ๋ ˆ์‹œํ”ผ, ์šฐ์œ  ๋ ˆ์‹œํ”ผ)

ํŒฉํ† ๋ฆฌ ํŒจํ„ด ์ข…๋ฅ˜ 2๊ฐ€์ง€

  1. ํŒฉํ† ๋ฆฌ ๋ฉ”์†Œ๋“œ ํŒจํ„ด : ์„œ๋ธŒ ํด๋ž˜์Šค์— ์œ„์ž„์„ ํ•œ๋‹ค. (์ธํ„ฐํŽ˜์ด์Šค ์ถ”์ƒํ™” ์‹œ์ผœ์„œ ๋ฉ”์ธ ๋กœ์ง์—์„œ ๊ฐ์ฒด ์ƒ์„ฑ์„ ํ•˜์ง€ ์•Š์Œ)
  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() ์ •์  ๋ฉ”์„œ๋“œ ์ •์˜
    • ์ •์  ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ ์‹œ ์žฅ์ 
    1. ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์—†์ด ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝ ๊ฐ€๋Šฅ (๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•œ ๋ฒˆ๋งŒ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ)
    2. ๊ฐœ๋ณ„ ์ธ์Šคํ„ด์Šค์— ๋ฌถ์ด์ง€ ์•Š์œผ๋ฉฐ ํด๋ž˜์Šค ๋‚ด์˜ ํ•จ์ˆ˜ ์ •์˜ ๊ฐ€๋Šฅ

 

 

 

 

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
    • ๋‹จ๋ฐฉํ–ฅ ๋ฐ”์ธ๋”ฉ์ด ์ ์šฉ๋˜์–ด ์žˆ๋‹ค.
    • ์ž์œ ๋„๊ฐ€ ๋†’๋‹ค.
    • ๋ฉ”ํƒ€(ํŽ˜์ด์Šค๋ถ)์ด ์šด์˜ํ•˜๋ฉฐ, ๋„ทํ”Œ๋ฆญ์Šค, ํŠธ์œ„ํ„ฐ, ๋“œ๋กญ๋ฐ•์Šค, ์šฐ๋ฒ„, ํŽ˜์ดํŒ”, ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ ๋“ฑ์—์„œ ์‚ฌ์šฉ
    ๊ฐ€์ƒ๋” ์ฐธ๊ณ  ์˜์ƒ (https://bit.ly/3hDX620)%EC%9D%84)

MVC ํŒจํ„ด์˜ ์˜ˆ : ์Šคํ”„๋ง(Spring)


MVC ํŒจํ„ด์„ ์ด์šฉํ•œ ์ž๋ฐ”์˜ ๋Œ€ํ‘œ์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ ์Šคํ”„๋ง(Spring)

Spring์˜ WEB MVC๋Š” ์›น์„œ๋น„์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š”๋ฐ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ๋“ค์„ ๋งŽ์ด ์ œ๊ณตํ•œ๋‹ค.

  • ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต
    • ์˜ˆ1 : @RequestParam, @RequestHeader, @PathVariable ๋“ฑ์˜ ์• ๋„ˆํ…Œ์ด์…˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ๊ฐ’๋“ค์„ ์‰ฝ๊ฒŒ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์‚ฌ์šฉ์ž์˜ ์–ด๋– ํ•œ ์š”์ฒญ์ด ์œ ํšจํ•œ ์š”์ฒญ์ธ์ง€๋ฅผ ์‰ฝ๊ฒŒ ๊ฑฐ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์˜ˆ2 : ์ˆซ์ž๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•˜๋Š”๋ฐ ๋ฌธ์ž๋ฅผ ์ž…๋ ฅํ•˜๋Š” ์‚ฌ๋ก€
  • ์žฅ์ 
    • ์žฌ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ, ํ…Œ์ŠคํŠธ, ์‰ฝ๊ฒŒ ๋ฆฌ๋””๋ ‰์…˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

์Šคํ”„๋ง ์ฐธ๊ณ  ์˜์ƒ ์œ ํŠœ๋ธŒ ํฐ๋Œ์˜ ํ„ฐ์ „ - '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, ๊ตฌ๊ธ€, ๋ฃจ์ด๋น„ํ†ต ๋“ฑ์—์„œ ์‚ฌ์šฉ