Sam Baek, The Dev's Corner

πŸ’» μ„œλ²„μ‚¬μ΄λ“œ μžλ°”μŠ€ν¬λ¦½νŠΈ Node [2편]

07 Jul 2023

미듀웨어에 λŒ€ν•˜μ—¬


λ―Έλ“€μ›¨μ–΄λŠ” μš”μ²­κ³Ό μ‘λ‹΅μ˜ 쀑간 λ‹¨κ³„μ—μ„œ μ΄λ€„μ§€λŠ” μ†Œν”„νŠΈμ›¨μ–΄ ꡬ성 μš”μ†Œλ₯Ό μ˜λ―Έν•œλ‹€.
λ―Έλ“€μ›¨μ–΄λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ 톡신을 μ²˜λ¦¬ν•˜κ³ 
μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ™μž‘μ„ μ œμ–΄ν•˜λ©° κΈ°λŠ₯을 ν™•μž₯μ‹œν‚€λŠ” 역할을 μˆ˜ν–‰ν•œλ‹€.
보톡은 μš”μ²­ μ²˜λ¦¬μ™€ μ‘λ‹΅μ²˜λ¦¬, μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ œμ–΄, κΈ°λŠ₯ ν™•μž₯ 등을 μ£Όμš” λͺ©μ μœΌλ‘œ μ‚¬μš©λ˜λŠ”λ°
각 λͺ©μ μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • μš”μ²­ 처리 : λ―Έλ“€μ›¨μ–΄λŠ” 인증, 인가, 데이터 μœ νš¨μ„± 검사 λ“±
    ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„°μ˜ μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³  ν•„μš”ν•œ λ™μž‘μ„ μˆ˜ν–‰ν•œλ‹€.
  • 응닡 처리 : μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 보낸 응닡을 훔쳐 μˆ˜μ • μ²˜λ¦¬ν•œλ‹€.
    응닡에 헀더λ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ 데이터λ₯Ό μ••μΆ•ν•˜κ±°λ‚˜ 캐싱을 μ‚¬μš©ν•˜λŠ” 것이 κ·Έ μ˜ˆμ΄λ‹€.
  • μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ μ œμ–΄ : λ―Έλ“€μ›¨μ–΄λŠ” 쑰건 처리λ₯Ό ν•˜κ±°λ‚˜ λ‹€μŒ λ―Έλ“€μ›¨μ–΄λ‘œ λ„˜κΈ°κ±°λ‚˜ μ—λŸ¬ 처리 λ“±
    μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 흐름을 μ œμ–΄ν•˜κ³  μš”μ²­κ³Ό μ‘λ‹΅μ˜ 전달을 μ‘°μ •ν•œλ‹€.
  • κΈ°λŠ₯ ν™•μž₯ : λ―Έλ“€μ›¨μ–΄λŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ κΈ°λŠ₯을 ν™•μž₯ν•œλ‹€.
    μ™ΈλΆ€APIλ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜ DB μ—°κ²°ν•˜κ±°λ‚˜ 캐싱 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” 것이 κ·Έ μ˜ˆμ΄λ‹€.

미듀웨어λ₯Ό 톡해 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λͺ¨λ“ˆν™” μ‹œν‚¬ 수 있고, μœ μ—°ν•˜κ³  μž¬μ‚¬μš© κ°€λŠ₯ν•œ ꡬ성 μš”μ†Œλ‘œ 뢄리해
관리할 수 μžˆλ‹€.

미듀웨어 μœ ν˜•


λ―Έλ“€μ›¨μ–΄μ—μ„œ 일반적으둜 μ‚¬μš©λ˜λŠ” μœ ν˜•μ€ λ‘œκΉ… 미듀웨어, 인증 및 인가 미듀웨어,
λΌμš°νŒ… 미듀웨어, μ—λŸ¬ 처리 미듀웨어, μ••μΆ• 미듀웨어, 캐싱 미듀웨어, DB관리 미듀웨어 등이 μžˆλ‹€.

λ‘œκΉ… λ―Έλ“€μ›¨μ–΄λŠ” μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 둜그λ₯Ό κΈ°λ‘ν•˜κ³  μ €μž₯ν•˜λŠ” 미듀웨어닀.
λ‘œκΉ…μ€ 디버깅, λͺ¨λ‹ˆν„°λ§, 였λ₯˜ 좔적 등에 μ‚¬μš©λ˜κ³  μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ™μž‘μ„ νŒŒμ•…ν•˜λŠ”λ° μœ μš©ν•˜λ‹€.

인증 및 인가 λ―Έλ“€μ›¨μ–΄λŠ” μ‚¬μš©μžμ˜ 신원을 ν™•μΈν•˜κ³  κΆŒν•œμ„ λΆ€μ—¬ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” 미듀웨어닀.
μ‚¬μš©μž 인증을 μ²˜λ¦¬ν•˜κ³ , μ ‘κ·Ό μ œμ–΄ 및 κΆŒν•œ 검사λ₯Ό μˆ˜ν–‰ν•΄ λ³΄μ•ˆμ„ κ°•ν™”ν•˜λŠ” 역할을 ν•œλ‹€.

λΌμš°νŒ… λ―Έλ“€μ›¨μ–΄λŠ” μš”μ²­ν•œ URL 경둜λ₯Ό 기반으둜 ν•΄λ‹Ήν•˜λŠ” ν•Έλ“€λŸ¬λ‚˜ 컨트둀러 μš”μ²­μ„ λΌμš°νŒ…ν•˜λŠ” 미듀웨어닀.
λ‹€μ–‘ν•œ μ—”λ“œν¬μΈνŠΈλ₯Ό κ΄€λ¦¬ν•˜κ³  μ μ ˆν•œ 처리 둜직으둜 μš”μ²­μ„ μ „λ‹¬ν•œλ‹€.

μ—λŸ¬ 처리 λ―Έλ“€μ›¨μ–΄λŠ” λ°œμƒν•œ μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ‘λ‹΅ν•˜λŠ” 미듀웨어닀.
μ˜ˆμ™Έ 처리, 였λ₯˜ λ©”μ‹œμ§€ 생성, μ—λŸ¬ νŽ˜μ΄μ§€ ν‘œμ‹œ 등을 λ‹΄λ‹Ήν•˜λŠ” 역할을 ν•œλ‹€.

μ••μΆ• λ―Έλ“€μ›¨μ–΄λŠ” μš”μ²­κ³Ό μ‘λ‹΅μ˜ 데이터λ₯Ό μ••μΆ• μ „λ‹¬ν•˜λŠ” 미듀웨어닀.
λŒ€μš©λŸ‰ 데이터 전솑을 μ΅œμ ν™”ν•˜κ³  λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­μ„ μ ˆμ•½ν•˜λŠ” 역할을 ν•œλ‹€.

캐싱 λ―Έλ“€μ›¨μ–΄λŠ” 반볡적 μš”μ²­μ— λŒ€ν•œ 응닡을 μΊμ‹±ν•˜μ—¬ μ„±λŠ₯을 ν–₯μƒμ‹œν‚€λŠ” 미듀웨어닀.
μΊμ‹±μ˜ 역할은 μ•žμ„œ μ—¬λŸ¬ μ°¨λ‘€ μ–ΈκΈ‰ν•¨μœΌλ‘œ μƒλž΅ν•˜κ³ μž ν•œλ‹€.

미듀웨어 μš”μ²­ 처리 흐름


  • ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­ : ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ΄ μ„œλ²„λ‘œ λ„λ‹¬ν•œλ‹€. μš”μ²­μ€ λΌμš°ν„°λ₯Ό 톡해 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ— μ „λ‹¬λœλ‹€.
  • 미듀웨어 μ‹€ν–‰ : μš”μ²­μ΄ μ „λ‹¬λ˜λ©΄ 첫 번째 미듀웨어가 λ™μž‘ν•œλ‹€. 주둜 μš”μ²­μ„ κ°€λ‘œμ±„ ν•„μš”ν•œ μ „μ²˜λ¦¬ μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€.
    κ·Έλž˜μ„œ 보톡은 λ‘œκΉ… 미듀웨어가 둜그λ₯Ό μƒμ„±ν•˜κ³  μ €μž₯ν•˜λŠ” 단계가 μ΄λ€„μ§€λŠ” ꡬ간이닀.
  • λ‹€μŒ 미듀웨어 μ‹€ν–‰ : 인증 및 인가, 데이터 μœ νš¨μ„± 검사 λ“± 각 미듀웨어가 νŠΉμ •ν•œ 역할을 λ‹΄λ‹Ήν•΄ 순차적으둜 μ‹€ν–‰λœλ‹€.
  • μš”μ²­ 전달 : μš”μ²­μ„ μ μ ˆν•œ ν•Έλ“€λŸ¬λ‚˜ 컨트둀러둜 μ „λ‹¬ν•˜κ³  ν•„μš”ν•œ λ‘œμ§μ„ μˆ˜ν–‰ν•œλ‹€.
  • 응닡 생성 : ν•Έλ“€λŸ¬λ‚˜ μ»¨νŠΈλ‘€λŸ¬λŠ” μš”μ²­μ— λŒ€ν•œ 응닡을 μƒμ„±ν•˜κ³  λ‹€μ‹œ 미듀웨어λ₯Ό 거쳐 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ „λ‹¬λœλ‹€.
  • 응닡 처리 : 응닡이 미듀웨어 체인을 ν†΅κ³Όν•˜λ©° μ••μΆ• 미듀웨어 같은 ν›„μ²˜λ¦¬ μž‘μ—…μ„ κ±°μΉœλ‹€.
  • 응닡 전달 : μ΅œμ’… 응닡이 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ „λ‹¬λœλ‹€.

μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν™•μž₯


미듀웨어λ₯Ό μ‚¬μš©ν•˜λ©΄ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ κΈ°λŠ₯을 ν™•μž₯ν•  수 μžˆλ‹€.
μ•žμ„œ λ§ν•œ 인증과 인가 ν˜Ήμ€ 캐싱과 λ‘œκΉ…μ΄ λŒ€ν‘œμ μΈ μ˜ˆμ‹œκ³ ,
이 밖에도 μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•˜κ±°λ‚˜ μ„Έμ…˜μ„ κ΄€λ¦¬ν•˜λŠ” λ“±μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•΄
μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ κΈ°λŠ₯을 이전보닀 ν™•μž₯μ‹œν‚¬ 수 μžˆλ‹€.
λ˜ν•œ, λ―Έλ“€μ›¨μ–΄λŠ” 데이터λ₯Ό λ³€ν™˜ν•˜κ³  κ°€κ³΅ν•˜λŠ”λ° μ‚¬μš©ν•˜κΈ°λ„ ν•˜λŠ”λ°
μš”μ²­κ³Ό μ‘λ‹΅μ˜ 데이터λ₯Ό λ³€ν™˜ν•˜κ³  가곡할 수 있게 λ§Œλ“€μ–΄μ€€λ‹€.

Node.js Express 미듀웨어 μ˜ˆμ‹œ


Expressμ—μ„œ 미듀웨어λ₯Ό μ‚¬μš©ν•  λ•Œ, λ―Έλ“€μ›¨μ–΄λ§Œ λͺ¨μ•„μ„œ ν‘œν˜„ν•˜κΈ°λ„ ν•˜λŠ”λ°
μ›λž˜ ν‘œν˜„ 과정은 이렇닀고 ν•œλ‹€.

app.get('/user/:userId', (req, res, next) => {
    const filteredData = data.filter(item => {item.id == req.params.userId });
    next();
});