ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Recent Posts
02-08 13:57

Today
Total

Recent Comments
๊ด€๋ฆฌ ๋ฉ”๋‰ด

์—ฐ์˜ ๊ธฐ๋ก ๐Ÿช

[๋ฉด์ ‘์„ ์œ„ํ•œ CS ์ „๊ณต์ง€์‹ ๋…ธํŠธ] ๋””์ž์ธ ํŒจํ„ด๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ณธ๋ฌธ

์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[๋ฉด์ ‘์„ ์œ„ํ•œ CS ์ „๊ณต์ง€์‹ ๋…ธํŠธ] ๋””์ž์ธ ํŒจํ„ด๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„

kite707 2023. 9. 13. 13:34

SECTION1 ๋””์ž์ธ ํŒจํ„ด

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด

ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ์˜ค์ง ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๊ฐ€์ง€๋Š” ํŒจํ„ด์ด๋‹ค. ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ชจ๋“ˆ์— ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฉฐ, ์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์ด ๊ณต์œ ํ•˜๋ฉฐ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ๋‹ค. ๋น„์šฉ์€ ์ค„์ง€๋งŒ ์˜์กด์„ฑ์ด ๋†’๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด db์— ์—ฐ๊ฒฐํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด, DB๋ผ๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— DB.instance๋ผ๋Š” ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

const URL = 'dbUrl' 
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

์ด๋Ÿฌํ•œ ์‹ฑ๊ธ€ํ†คํŒจํ„ด์€ TDD์— ๋ณ„๋กœ ์ข‹์ง€ ์•Š์€๋ฐ, ๊ทธ ์ด์œ ๋Š” ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๋•Œ ๋ชจ๋“ˆ๊ฐ„ ์ข…์†์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋กœ ๋…๋ฆฝ์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋“ˆ๊ฐ„์˜ ๊ฒฐํ•ฉ์„ ๋Š์Šจํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์˜์กด์„ฑ ์ฃผ์ž…(Dependency Injection)์ด๋ผ๋Š” ๊ฐœ๋…์ด ๊ณ ์•ˆ๋˜์—ˆ๋‹ค.

์ฆ‰ ์ค‘๊ฐ„์— ์˜์กด์„ฑ ์ฃผ์ž…์ž๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๊ณ , ๋ฉ”์ธ๋ชจ๋“ˆ์€ ์˜์กด์„ฑ ์ฃผ์ž…์ž๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

ํŒฉํ† ๋ฆฌ ํŒจํ„ด

ํŒฉํ† ๋ฆฌ ํŒจํ„ด์€ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์บก์Šํ™”ํ•˜๋Š” ํŒจํ„ด์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ๋ผ๋–ผ, ์•„๋ฉ”๋ฆฌ์นด๋…ธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์ปคํ”ผ ๊ณต์žฅ์ด๋ผ๋Š” ํด๋ž˜์Šค ๋‚ด์— ์žˆ์„ ๋•Œ ํŒฉํ† ๋ฆฌ ํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค. ์•„๋ž˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค.

class CoffeeFactory {
    static createCoffee(type) {
        const factory = factoryList[type]
        return factory.createCoffee()
    }
}   
class Latte {
    constructor() {
        this.name = "latte"
    }
}
class Espresso {
    constructor() {
        this.name = "Espresso"
    }
} 

class LatteFactory extends CoffeeFactory{
    static createCoffee() {
        return new Latte()
    }
}
class EspressoFactory extends CoffeeFactory{
    static createCoffee() {
        return new Espresso()
    }
}
const factoryList = { LatteFactory, EspressoFactory } 


const main = () => {
    // ๋ผ๋–ผ ์ปคํ”ผ๋ฅผ ์ฃผ๋ฌธํ•œ๋‹ค.  
    const coffee = CoffeeFactory.createCoffee("LatteFactory")  
    // ์ปคํ”ผ ์ด๋ฆ„์„ ๋ถ€๋ฅธ๋‹ค.  
    console.log(coffee.name) // latte
}
main()

static์„ ํ†ตํ•ด createCoffee๋ฅผ ์ •์ ์œผ๋กœ ์„ ์–ธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— LatteFactory ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  createCoffee ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ „๋žต ํŒจํ„ด

์ „๋žตํŒจํ„ด์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ–‰์œ„๋ฅผ ์ „๋žต์ด๋ผ๋Š” ์บก์Šํ™”ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๊ฐ์‹ธ๋Š” ํŒจํ„ด์œผ๋กœ, passport๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด ๋กœ๊ทธ์ธ์ด๋ผ๋Š” ํฐ ํด๋ž˜์Šค ๋‚ด์— ์นด์นด์˜ค, ๋„ค์ด๋ฒ„, ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ์„ ๊ตฌํ˜„ํ•œ ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ์ „๋žต์œผ๋กœ ๊ฐ์‹ธ์„œ ๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ ์ „๋žตํŒจํ„ด๊ณผ ํŒฉํ† ๋ฆฌํŒจํ„ด์ด ์‚ฌ์‹ค์ƒ ๊ฐ™์€ ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ํ•˜๋Š” ์ƒ๊ฐ์„ ํ–ˆ๋Š”๋ฐ ํŒฉํ† ๋ฆฌํŒจํ„ด์€ ๊ฐ์ฒด ์ƒ์„ฑ์„ ์ถ”์ƒํ™”ํ•˜๋Š”๊ฒƒ์ด ๋ชฉ์ . ์ „๋žต ํŒจํ„ด์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํ–‰๋™ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ฆ‰ ๋ชฉ์ ์— ๋”ฐ๋ผ ๊ตฌ๋ถ„๋˜๋Š” ๋“ฏ ํ•˜๋‹ค.

์˜ต์ €๋ฒ„ ํŒจํ„ด

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

function observe(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= {"์ด๋ฆ„":"k"}
const b=observe(a,console.log);
b.์ด๋ฆ„="J";
b.์ด๋ฆ„="KK";p

ํ”„๋ก์‹œ ํŒจํ„ด

ํ”„๋ก์‹œ ํŒจํ„ด์€ ๋Œ€์ƒ ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๊ธฐ ์ „ ๊ทธ ์ ‘๊ทผ์— ๋Œ€ํ•œ ํ๋ฆ„์„ ๊ฐ€๋กœ์ฑ„ ๊ฐ์ฒด ์•ž๋‹จ์˜ ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• ์„ ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.

์œ„ ํŒจํ„ด์„ ์ ์šฉํ•œ ์˜ˆ์‹œ ์ค‘ ํ•˜๋‚˜๋Š” ํ”„๋ก์‹œ ์„œ๋ฒ„์ด๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ nginx๋ผ๋Š” ์„œ๋ฒ„๊ฐ€ Node.js ์„œ๋ฒ„์˜ ํ”„๋ก์‹œ ์„œ๋ฒ„๋กœ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์ด nginx๋Š” ์„œ๋ฒ„์— ์ ‘์†ํ•˜๊ธฐ ์ „ ๊ฑฐ์ณ๊ฐ€์•ผํ•˜๋Š” ์ˆ˜๋ฌธ์žฅ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•ด์ค€๋‹ค.

MVC ํŒจํ„ด

model view controller๋กœ ์ด๋ฃจ์–ด์ง„ ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค. model์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ, view๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค, controller๋Š” ๋ชจ๋ธ๊ณผ ๋ทฐ๋ฅผ ์ด์–ด์ฃผ๋Š”, ๋กœ์ง์ด ๊ตฌํ˜„๋œ ๋ถ€๋ถ„์„ ์˜๋ฏธํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ํ•˜๋‚˜์˜ ๋ทฐ์™€ ํ•˜๋‚˜์˜ ์ปจํŠธ๋กค๋Ÿฌ๋งŒ์ด ์—ฐ๊ฒฐ๋˜์—ˆ์„ ๋•Œ๋ฅผ MVPํŒจํ„ด์ด๋ผ๊ณ  ํ•œ๋‹ค. ์ฆ‰ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ”„๋ ˆ์  ํ„ฐ(presenter)๋กœ ๊ต์ฒด๋œ ๊ฒƒ์ด๋‹ค.

MVVM ํŒจํ„ด

MVVMํŒจํ„ด์€ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ทฐ๋ชจ๋ธ(view model)๋กœ ๋ฐ”๋€ ํŒจํ„ด์ด๋‹ค. ๋ทฐ์™€ ๋ชจ๋ธ์„ ๋ฌถ์–ด์„œ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ๊ฐ€์ง„๋‹ค. ๋ทฐ์™€ ๋ทฐ๋ชจ๋ธ ์‚ฌ์ด์˜ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ง€์›ํ•œ๋‹ค.

UI๋ฅผ ๋ณ„๋„์˜ ์ฝ”๋“œ ์ˆ˜์ • ์—†์ด ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋‹จ์œ„ ํ…Œ์ŠคํŒ… ํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.(์˜์กด์„ฑx)

 

SECTION2 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„

์˜ค๋ฒ„๋กœ๋”ฉ

๊ฐ™์€ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ ๋‘๋Š” ๊ฒƒ. ํƒ€์ž…, ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์œ ํ˜•, ๊ฐœ์ˆ˜ ๋“ฑ์œผ๋กœ ๊ตฌ๋ถ„๋จ. ์ •์  ๋‹คํ˜•์„ฑ

์˜ค๋ฒ„๋ผ์ด๋”ฉ

์ƒ์œ„ ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›์€ ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜ํ•˜๋Š” ๊ฒƒ. ๋™์  ๋‹คํ˜•์„ฑ