λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
  • μž₯원읡 κΈ°μˆ λΈ”λ‘œκ·Έ
πŸŽ› Others.../- old dev log

[Best Of the Best ν™œλ™κΈ°] 1μ°¨ νŒ€ ν”„λ‘œμ νŠΈ ν›„κΈ° - ν”„λ‘ νŠΈμ—”λ“œλ₯Ό κ°œλ°œν•˜λ©° ν–ˆλ˜ κ³ λ―Όλ“€

by Wonit 2021. 8. 25.

μ˜€λŠ˜μ€ BoB 10κΈ° λ³΄μ•ˆμ œν’ˆκ°œλ°œ νŠΈλž™μ˜ λ³΄μ•ˆ μ†”λ£¨μ…˜ μ œμž‘ μˆ˜μ—…μ—μ„œ ν•œλ‹¬λ™μ•ˆ μ§„ν–‰ν•œ 1μ°¨ νŒ€ ν”„λ‘œμ νŠΈμ— λŒ€ν•΄μ„œ 이야기해보렀 ν•œλ‹€.

ν•΄λ‹Ή 글은 총 5λΆ€μž‘μœΌλ‘œ νŒ€ λΉŒλ”©κ³Ό ν˜‘μ—… κ³Όμ • 그리고 μ„œλΉ„μŠ€ μ„€λͺ… 및 개발 κ³Όμ • 으둜 λ‚˜λ‰˜μ–΄μ Έ μžˆμŠ΅λ‹ˆλ‹€.

ν”„λ‘œμ νŠΈ github λ°”λ‘œκ°€κΈ° -> λ³΄μ•ˆ μœ„ν˜‘ νŠΈλž˜ν”½ 뢄석 μ†”λ£¨μ…˜ github

 

GitHub - dhslrl321/L7-monitor: πŸ” L7 μ—μ„œ λ™μž‘ν•˜λŠ” Access Log 기반 νŠΈλž˜ν”½ 뢄석 및 λ³΄μ•ˆ μœ„ν˜‘ 뢄석 μ„œλΉ„μŠ€

πŸ” L7 μ—μ„œ λ™μž‘ν•˜λŠ” Access Log 기반 νŠΈλž˜ν”½ 뢄석 및 λ³΄μ•ˆ μœ„ν˜‘ 뢄석 μ„œλΉ„μŠ€ (BoB 10 κΈ° λ³΄μ•ˆμ œν’ˆκ°œλ°œ 1μ°¨ νŒ€ ν”„λ‘œμ νŠΈ) - GitHub - dhslrl321/L7-monitor: πŸ” L7 μ—μ„œ λ™μž‘ν•˜λŠ” Access Log 기반 νŠΈλž˜ν”½ 뢄석 및 보

github.com

 

μ§€λ‚œ μ‹œκ°„ μš°λ¦¬κ°€ ν–ˆλ˜ κ³ λ―Όλ“€κ³Ό λ¬Έμ œλ“€, 그리고 ν˜‘μ—…μ— λŒ€ν•œ λ‚΄μš©μ„ μ •λ¦¬ν•΄λ³΄μ•˜λ‹€.

 

μ˜€λŠ˜μ€ μš°λ¦¬κ°€ κ°œλ°œν•œ μ„œλΉ„μŠ€λ₯Ό μ’€ 더 기술적인 κ΄€μ μ—μ„œ μ•Œμ•„λ³΄λ € ν•œλ‹€.

 

κ°œλ°œν•˜λŠ” 과정이 μ–΄λ–»κ²Œ μ§„ν–‰λ˜κ³  μ–΄λ–€ λ¬Έμ œλ“€μ„ λ§Œλ‚¬μœΌλ©° μ–΄λ–€ 방법을 μ·¨ν–ˆλŠ”μ§€!

 

λ‚˜λŠ” Web 파트λ₯Ό λ§‘μ•˜κΈ° λ•Œλ¬Έμ— λ‚΄κ°€ κ°œλ°œν•œ κΈ°λŠ₯κ³Ό API에 λŒ€ν•΄μ„œλ§Œ μ„€λͺ…을 ν•  μˆ˜λ„ μžˆλ‹€ γ…Žγ…Ž..

 

μ„œλΉ„μŠ€ ꡬ쑰

 

μš°μ„  μ„œλΉ„μŠ€μ˜ λͺ©μ μ€ μ§€λ‚œ μ‹œκ°„μ— μ΄μ•ΌκΈ°ν–ˆλ˜ 것 처럼 Access Log 기반 νŠΈλž˜ν”½ 뢄석 및 λ³΄μ•ˆ μœ„ν˜‘ 뢄석 이닀.

 

μ‚¬λ‚΄μ˜ Web Application 이 기쑴에 μŒ“μ•„λ†“λ˜ Access Log λ₯Ό 기반으둜 ν•˜μ—¬ λΆ„μ„ν•˜κ³  λ³΄μ•ˆ μœ„ν˜‘μ„ μ‹œκ°ν™” ν•΄μ€€λ‹€.

 

μ„œλΉ„μŠ€μ˜ 큰 ν”Œλ‘œμš°λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

 

μ„œλΉ„μŠ€ ν”Œλ‘œμš°

 

  1. κ³ κ°μ‚¬λŠ” 기쑴에 μš΄μ˜μ€‘μ΄λ˜ μ„œλ²„μ™€ ν•΄λ‹Ή μ„œλ²„κ°€ μ €μž₯ν•˜λŠ” access.log κ°€ μ‘΄μž¬ν•œλ‹€.
  2. μš°λ¦¬κ°€ κ°œλ°œν•œ Agent νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•œλ‹€.
  3. ν•΄λ‹Ή Agentμ—μ„œ access log 의 μœ„μΉ˜λ₯Ό μ§€μ •ν•˜κ³  뢄석 μ„œλ²„λ‘œ access log λ₯Ό μ „λ‹¬ν•œλ‹€.
  4. 운영 μ„œλ²„μ˜ μ„±λŠ₯을 μœ„ν•΄μ„œ 뢄석은 λ‹€λ₯Έ μ„œλ²„μ—μ„œ μ§„ν–‰ν•œλ‹€.
  5. 뢄석 μ„œλ²„λ‘œ λ“€μ–΄μ˜¨ access log λŠ” 뢄석을 μ§„ν–‰ν•˜μ—¬ 곡격 μœ ν˜•μ— λ”°λΌμ„œ DB에 μ €μž₯ν•œλ‹€.
  6. ν•΄λ‹Ή DB 의 값듀을 ν† λŒ€λ‘œ λ³΄μ•ˆ λ ˆλ²¨μ„ μ‚°μΆœν•˜κ³  각쒅 μ‹œκ°ν™”μ— ν•„μš”ν•œ 데이터λ₯Ό μ •μ œν•˜μ—¬ Front둜 λ°˜ν™˜ν•œλ‹€.
  7. Front ServerλŠ” Backend μ—κ²Œ λ°›μ•„μ˜¨ 데이터λ₯Ό 가지고 λŒ€μ‹œλ³΄λ“œμ—μ„œ μ‹œκ°ν™”λ₯Ό μˆ˜ν–‰ν•œλ‹€.

 

μ›λž˜ 처음 κΈ°νšμ€ SaaS ν˜•νƒœμ˜€κΈ° λ•Œλ¬Έμ— 뢄석 μ„œλ²„λŠ” μš°λ¦¬κ°€ μš΄μ˜ν•˜λŠ” μ„œλ²„μ—¬μ•Ό ν•˜μ§€λ§Œ μ‹œκ°„μ  문제둜 인해 On-Premise ν˜•νƒœλ‘œ κ΅¬μ„±ν•˜λŠ” λ°©ν–₯으둜 μ§„ν–‰ν–ˆλ‹€.

 

즉, ClientλŠ” 기쑴에 μš΄μ˜μ€‘μ΄λ˜ μ„œλ²„ + 뢄석 μ„œλ²„λ₯Ό μš΄μ˜ν•˜λŠ” λ°©ν–₯인데, 이게 쑰금 μ„œλΉ„μŠ€ κ΄€μ μ—μ„œ λ§Žμ€ 의문과 λΉ„νš¨μœ¨μ΄ μ‘΄μž¬ν•œλ‹€.

 

μ–΄μ©” 수 μ—†λ‹€κ³  νƒ€ν˜‘ν–ˆμ§€λ§Œ 아직 많이 아쉽닀..

 

ν”„λ‘ νŠΈμ—”λ“œμ˜ 기술적 κ³ λ―Ό

 

μ•žμ„œ μ΄μ•ΌκΈ°ν–ˆλ“―, μš°λ¦¬λŠ” Front Endλ₯Ό React둜 κ°œλ°œν•˜μ˜€λ‹€.

 

이 κ³Όμ •μ—μ„œ ν–ˆλ˜ 고민듀은 크게 3가지 이닀.

 

  1. HTML Rendering Server 의 κ²°μ •
  2. λ¦¬μ•‘νŠΈμ˜ state 관리 도ꡬ
  3. 톡신 λͺ¨λ“ˆμ˜ 선택
  4. λ””μžμΈ νŒ¨ν„΄μ˜ λ„μž…

ν•˜λ‚˜μ”© μ•Œμ•„λ³΄μž!

HTML Rendering Server 의 κ²°μ •

 

Front Endλ₯Ό μ²˜μŒλΆ€ν„° React둜 ν•˜λ €λ˜ 생각은 μ—†μ—ˆλ‹€.

 

μ²˜μŒμ—λŠ” 순수 HTMLκ³Ό Vanila Javascript λ₯Ό μ΄μš©ν•  μƒκ°μ΄μ—ˆλ‹€.

 

그리고 μ—¬λŸ¬ 기술 쑰사λ₯Ό ν–ˆμ„ λ•Œ, κ°„λ‹¨νžˆ λ“€μ—ˆλ˜ 생각은 λ°”λ‘œ Express.jsλ₯Ό μ΄μš©ν•΄ static file render μ„œλ²„λ₯Ό κ΅¬μΆ•ν•˜λŠ” κ²ƒμ΄μ—ˆλ‹€.

 

Expressjs λŠ” Template Engine ν”„λ ˆμž„μ›Œν¬μ΄κΈ° λ•Œλ¬Έμ— html render server λ‘œμ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ λͺ‡ 가지 μž‘μ—…μ„ ν•΄μ€˜μ•Ό ν•œλ‹€.

 

μš°μ„  app.js μ—μ„œ express.static() 을 μ΄μš©ν•΄μ„œ static νŒŒμΌμ„ λ Œλ”ν•˜λ„λ‘ κ΅¬μ„±ν–ˆλ‹€.

 

import express from "express";

import path from "path";
const __dirname = path.resolve();

const app = express();
const port = 3000;

const setRenderPage = (filename) => __dirname + "/views/" + filename;

app.use("/script", express.static("script"));
app.use("/static", express.static("static"));

app.get("/", (req, res) => {
  res.sendFile(setRenderPage("index.html"));
});

app.listen(port, () => {
  console.log("server started on " + port);
});

 

이 λ°©λ²•μ—λŠ” ν•œ 가지 λ¬Έμ œκ°€ μƒκ²ΌλŠ”λ°, λ°”λ‘œ css, images, js νŒŒμΌμ„ 각각 render ν•  url 을 μ—΄μ–΄μ€˜μ•Ό ν–ˆμ—ˆλ‹€.

 

κ·Έλž˜μ„œ <head> νƒœκ·Έ 내뢀에 url routing path λ₯Ό μƒκ°ν•˜λ©΄μ„œ static file 을 λ°˜ν™˜ν–ˆμ§€λ§Œ, μ΄λŠ” 생산성을 μ €ν•΄μ‹œν‚€λŠ” κ²ƒμœΌλ‘œ λ³΄μ˜€λ‹€.

 

이건 그래 ν•΄κ²° κ°€λŠ₯ν•œλ°, λ¬Έμ œλŠ” λ°”λ‘œ es6 μ—μ„œ Module을 Bundling ν•˜λŠ”λ° 정말 νž˜λ“€μ—ˆλ‹€.

 

예λ₯Ό λ“€λ©΄ es6 μ΄μ „μ—λŠ” λͺ¨λ“ˆμ„ κ°€μ Έμ˜¬ λ•Œ, const express = require('express') 와 같은 방식을 μ΄μš©ν–ˆμ§€λ§Œ es6 이상은 import express from 'express' ν˜•νƒœλ‘œ μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— 이듀 μ‚¬μ΄μ˜ νŒ¨λŸ¬λ‹€μž„ 뢈일치?λ₯Ό ν•΄κ²°ν–ˆμ–΄μ•Ό ν–ˆκ³ , 각각 λ”°λ‘œ λ²ˆλ“€λ§μ„ ν•˜λŠ” 방법이 ν•„μš”ν–ˆλ‹€.

 

μ „λ¬Έ Front κ°œλ°œμžκ°€ μ•„λ‹Œ λ‚˜μ—κ²ŒλŠ” 쑰금 μ–΄λ €μ› λ‹€..

 

κ·Έλž˜μ„œ 생각해낸 방법이 λ°”λ‘œ Webpack μ΄μ—ˆλ‹€.

 

 

μ›ΉνŒ©μ€ λͺ¨λ˜ jsλ₯Ό μœ„ν•œ static λͺ¨λ“ˆ bundler 라고 ν•œλ‹€.

 

κ°„λ‹¨ν•˜κ²Œ μ›ΉνŒ©μ— λŒ€ν•΄μ„œ μ΄μ•ΌκΈ°ν•˜μžλ©΄, main.js νŒŒμΌμ„ λ§Œλ“€μ–΄μ„œ ν•˜λ‚˜μ˜ main.js 에 μš°λ¦¬κ°€ λ§Œλ“  λ‹€μ–‘ν•œ λͺ¨λ“ˆλ“€μ„ λ„£κ³  main.js ν•˜λ‚˜λ§Œ url 둜 κ°œλ°©ν•΄μ£ΌλŠ” 방법과 λΉ„μŠ·ν•œκ²ƒ κ°™μ•˜λ‹€.

 

κ·Έλž˜μ„œ μ•žμ„œ λ°œμƒν–ˆλ˜ λ¬Έμ œλ“€μ€ 더 κΉ”λ”ν•˜κ³  ν˜„λŒ€μ μΈ λ°©λ²•μœΌλ‘œ ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€.

 

사싀 λ¦¬μ•‘νŠΈλ„ μ›ΉνŒ©μ„ μ΄μš©ν•˜κ³  있고 λ‚˜λ„ μ›ΉνŒ©μ— λŒ€ν•œ 언급은 λ“€μ–΄λ΄€μ§€λ§Œ 깊게 곡뢀해본 적이 μ—†μ—ˆλŠ”λ°, 이제 μ›ΉνŒ©μ΄ 무엇을 ν•˜λŠ” κΈ°μˆ μΈκ°€? 에 λŒ€ν•œ 닡을 μ–΄λŠμ •λ„ ν•  수 있게 λ˜μ–΄μ„œ 맀우 μ‹ λ‚¬μ—ˆλ‹€ γ…Žγ…Ž..

 

μžμ„Έν•œ 사항은 기술 고민을 μ •λ¦¬ν•œ githubμ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€ -> Webpack 으둜 Front-Server κ΅¬μ„±ν•˜κΈ°

ν•˜μ§€λ§Œ 이 λ§ˆμ €λ„ μ™„λ²½ν•œ 기술 선정은 μ•„λ‹ˆμ—ˆλ‹€.

 

λ‚˜λŠ” Vanila js 둜 ν•˜λ‚˜μ˜ 웹을 κ°œλ°œν•΄λ³Έ κ²½ν—˜μ΄ μ—†μ—ˆκΈ°μ— λ§Œμ•½ ν”„λ‘ νŠΈ 개발 νŒ€μ›μ΄ 도움을 μš”μ²­ν•  λ•Œ, 큰 도움을 쀄 수 없을것 κ°™μ•˜λ‹€.

 

λ¦¬μ•‘νŠΈμ—μ„œλŠ” data fetching 을 ν•˜λ©΄ stateλ₯Ό λ°”κΏ”μ£Όμ–΄ λ Œλ”λ§μ„ μˆ˜ν–‰ν–ˆμ§€λ§Œ, 바닐라 js μ—μ„œλŠ” 직접 document 객체λ₯Ό μ΄μš©ν•΄μ„œ dom 을 μ‘°μž‘ν•΄μ•Ό ν–ˆκ³ , ajax ν†΅μ‹ μ—μ„œλ„ μ–΄λ–»κ²Œ λ Œλ”λ₯Ό λ°”κΏ”μ•Ό ν•˜λŠ”μ§€ ν™•μ‹€ν•œ 이해가 λΆ€μ‘±ν–ˆμ—ˆλ‹€.

 

κ°„λ‹¨νžˆ κ²Œμ‹œνŒ μ •λ„λŠ” κ°œλ°œν•  수 μžˆμ–΄μ„œ λ¨Έλ¦¬μ†μœΌλ‘œλŠ” μ–΄λ–»κ²Œ ν•΄μ•Όκ² λ‹€! μ‹Άμ§€λ§Œ 막상 규λͺ¨κ°€ μžˆλŠ” 앱을 κ°œλ°œν•  λ•Œ, λ°œμƒν•  문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” μžμ‹ κ°μ΄ λΆ€μ‘±ν–ˆλ‹€.

 

정말 닀행인 것은 ν”„λ‘ νŠΈλ₯Ό 맑은 νŒ€μ›μ΄ λ¦¬μ•‘νŠΈ κ²½ν—˜μ΄ μžˆλ‹€κ³  ν•˜μ—¬ λ¦¬μ•‘νŠΈλ‘œ ν•˜λŠ” 것은 μ–΄λ–»κ² λƒλŠ” μ˜κ²¬μ„ λ‚΄μ—ˆκ³ , κΈμ •μ μœΌλ‘œ λ°›μ•„λ“€μ—¬μ€˜μ„œ μš°λ¦¬λŠ” ν”„λ‘ νŠΈλ₯Ό λ¦¬μ•‘νŠΈλ‘œ κ΅¬μ„±ν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€.

 

κ²°κ΅­ νŒ€μ›λ“€μ˜ μ–‘ν•΄λ₯Ό ꡬ해 λ¦¬μ•‘νŠΈλ‘œ λ³€κ²½!

 

μ§€λ‚œ λ‚΄ κ²½ν—˜μ—μ„œλŠ” 직접 Designκ³Ό Style κ°œλ°œμ„ ν–ˆμ—ˆμ§€λ§Œ, 이번 ν”„λ‘œμ νŠΈμ—μ„œλŠ” Backend μ—μ„œ ν•΄μ•Όν•  일듀이 쑰금 μžˆμ—ˆκ³ , λ‚΄κ°€ μΈν”„λΌκΉŒμ§€ ꡬ성을 ν–ˆμ–΄μ•Ό ν–ˆκΈ° λ•Œλ¬Έμ— λ””μžμΈ μͺ½μ€ μ•„μ˜ˆ ν•  수 μ—†μ—ˆλ‹€.

 

λ˜ν•œ UIλ₯Ό μ „λ¬Έμ μœΌλ‘œ κ³΅λΆ€ν–ˆλ˜ νŒ€μ›λ“€μ΄ μ—†μ—ˆκΈ°μ— React Bootstrap을 μ΄μš©ν•˜κΈ°λ‘œ ν–ˆλ‹€.

 

 

λ‚˜λŠ” Bootstrap 을 ν•œ λ²ˆλ„ μ‚¬μš©ν•΄λ³Έ 적이 μ—†μ—ˆκΈ°μ— ν”„λ‘ νŠΈλ₯Ό 맑은 νŒ€μ›μ΄ Bootstrap 을 만져보며 μš°λ¦¬μ—κ²Œ ν•„μš”ν•œ Chart λ“€κ³Ό μ»΄ν¬λ„ŒνŠΈλ₯Ό λ”°λ‘œ λΉΌμ„œ λͺ¨λ“ˆν™”λ₯Ό ν•΄ μ£Όμ—ˆλ‹€.

 

그리고 ν”„λ‘œμ νŠΈ Repository μ—μ„œ create-react-app 을 μ΄μš©ν•΄μ„œ κΈ°λ³Έ Building 을 ν•˜κ³ , ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈλ“€μ„ 가져와 μ‚¬μš©μ„ ν–ˆμ—ˆλ‹€.

 

λ¦¬μ•‘νŠΈμ˜ state 관리 도ꡬ

 

React 의 큰 νŠΉμ§• 두 가지λ₯Ό 이야기 ν•˜μžλ©΄ λ°”λ‘œ State와 Props 이닀.

 

Props와 StateλŠ” 일반 Js 객체둜 μ»΄ν¬λ„ŒνŠΈλ₯Ό λ Œλ”λ§ν•  λ•Œμ˜ 영ν–₯을 μ£ΌλŠ” 데이터λ₯Ό μ˜λ―Έν•œλ‹€.

 

stateλŠ” ν•˜λ‚˜μ˜ μ»΄ν¬λ„ŒνŠΈ λ‚΄λΆ€μ—μ„œ μ‚¬μš©λ˜λŠ” λ³€μˆ˜ν˜• 데이터인데, ν•΄λ‹Ή stateλ₯Ό μ΄μš©ν•΄μ„œ 동적인 데이터λ₯Ό κ²°μ •ν•˜κ³  μ»΄ν¬λ„ŒνŠΈ UI에 μ‚½μž…ν•΄μ„œ λ Œλ”λ§ν•œλ‹€.

 

이 κ³Όμ •μ—μ„œ stateλŠ” ν•˜λ‚˜μ˜ μ»΄ν¬λ„ŒνŠΈ 내뢀에 μœ„μΉ˜ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈ λ Œλ” 트리λ₯Ό 잘 μƒκ°ν•΄μ„œ μ»΄ν¬λ„ŒνŠΈλ₯Ό ꡬ성해야 ν•œλ‹€.

 

이런 νŠΉμ„±μ„ 잘λͺ» μ΄μš©ν•œλ‹€λ©΄ μ›ν•˜λŠ” κ²°κ³Όκ°€ 잘 λ Œλ”λ§λ˜μ§€ μ•Šκ²Œ λ˜λŠ”λ°, 이λ₯Ό μ œλŒ€λ‘œ μ‚¬μš©ν•˜κΈ°λž€ 쑰금 κΉŒλ‹€λ‘­λ‹€.

 

κ·Έλž˜μ„œ 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” λ°©λ²•μœΌλ‘œλŠ” λ‹€μ–‘ν•œ 선택지가 μžˆμ—ˆλ‹€.

 

  1. 순수 State + Props μ΄μš©ν•˜κΈ°
  2. μ „μ—­ State 관리 도ꡬ μ΄μš©ν•˜κΈ° (Mobx, Context API, Redux)

 

순수 State + Props μ΄μš©ν•˜κΈ°

 

순수 stateλ₯Ό μ‚¬μš©ν•œλ‹€λ©΄ μ»΄ν¬λ„ŒνŠΈ λ Œλ” 트리의 ꡬ쑰λ₯Ό 잘 νŒŒμ•…ν•˜κ³  적절히 props둜 λ‚΄λ €μ€˜μ•Ό ν•œλ‹€.

 

κ·Έλž˜μ„œ μ½”λ“œκ°€ 자칫 잘λͺ»ν•˜λ©΄ μ’€ λ”λŸ¬μ›Œμ§€κ±°λ‚˜ 가독성이 λ‚˜λΉ μ§„λ‹€.

 

μ „μ—­ state 관리 도ꡬ μ΄μš©ν•˜κΈ°

 

ν˜„μž¬ 개인적인 ν”„λ‘œμ νŠΈμ—μ„œ ν”„λ‘ νŠΈμ—”λ“œλ₯Ό redux와 redux-thunk λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλ‹€.

 

ν™•μ‹€νžˆ 순수 state와 props λ₯Ό μ‚¬μš©ν•  λ•Œ 보닀 λ‹€μ–‘ν•˜κ³  더 μ‰¬μš΄ 개발이 κ°€λŠ₯ν•˜μ§€λ§Œ ν™˜κ²½μ„ κ΅¬μ„±ν•˜κΈ° κΉŒμ§€ 쑰금 μ‹œκ°„μ΄ 걸리며, 무엇보닀 이 생각이 μ•žμ„°λ‹€.

 

κ³Όμ—° 우리 μ„œλΉ„μŠ€μ—μ„œ Reduxκ°€ ν•„μš”ν• κΉŒ??

 

정닡은 No 이닀.

 

사싀 동적 Data Fetching 도 μ—†κ³  단지 μ»΄ν¬λ„ŒνŠΈμ˜ Depth 도 κΉŠμ–΄λ΄€μž 5개? μ •λ„μ˜€λ‹€.

 

κ·Έλž˜μ„œ ReduxλŠ” κ³ΌκΉ€νžˆ Pass ν•˜κ³  순수 state와 props와 useState 훅을 주둜 μ΄μš©ν•˜κΈ°λ‘œ ν•˜μ˜€λ‹€.

 

톡신 λͺ¨λ“ˆμ˜ 선택

 

λΈŒλΌμš°μ €μ—μ„œ Ajax λ₯Ό ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‚΄κ°€ μ‚¬μš©ν–ˆλ˜ 톡신 λͺ¨λ“ˆμ€ 2가지 이닀.

 

  1. Fetch API
  2. Axios

 

λ‘˜ λ‹€ Ajax 의 Request λ₯Ό μΆ”μƒν™”ν•œ λͺ¨λ“ˆλ‘œ 개인적으둜 Axiosλ₯Ό 더 많이 μ„ ν˜Έν•œλ‹€.

 

κ·Έ μ΄μœ λŠ” λͺ‡ 가지가 μžˆλŠ”λ°,

 

  1. Promise μ²˜λ¦¬κ°€ 쉽닀
  2. μ½”λ“œκ°€ κΉ”λ”ν•˜λ‹€
  3. json μ²˜λ¦¬κ°€ 더 쉽닀
  4. κ²½ν—˜μ΄ 더 λ§Žλ‹€ γ…Žγ…Ž

 

 

κ²°κ΅­ Axios λ₯Ό μ΄μš©ν•˜κΈ°λ‘œ ν•˜μ˜€κ³ , λ‹€μŒκ³Ό 같이 API λͺ¨λ“ˆμ„ κ΅¬μ„±ν–ˆλ‹€.

 

import axios from "axios";

export const SERVER = axios.create({
  baseURL: "http://" + process.env.REACT_APP_HOST_IP,
  headers: {
    "Content-Type": "application/json",
  },
});

export const TEST_SERVER = axios.create({
  baseURL: "http://localhost:8080/api",
  headers: {
    "Content-Type": "application/json",
  },
});

 

SERVER.js λΌλŠ” νŒŒμΌμ„ λ§Œλ“€κ³  μœ„μ™€ 같이 μ„œλ²„μ˜ 호좜 ipλ₯Ό λ„£μ–΄μ„œ axios instance λ₯Ό μƒμ„±ν•œλ‹€.

 

그리고 각각의 관심사에 맞게 λ―Όλ“  Service.js νŒŒμΌμ—μ„œ axios instance λ₯Ό import ν•˜μ—¬ μ‚¬μš©ν•˜λŠ” 방법이닀.

 

import { SERVER, TEST_SERVER } from "util/SERVER";

export const fetchAllLog = async () => {
  const { data } = await SERVER.get("/api/logs/all");

  return data;
};

export const fetchUnknownLog = async () => {
  const { data } = await SERVER.get("/api/logs/unknown");

  return data;
};

 

λ””μžμΈ νŒ¨ν„΄μ˜ λ„μž…

 

λ‚˜λŠ” λ””μžμΈ νŒ¨ν„΄μ€ μ†Œν”„νŠΈμ›¨μ–΄ κ°œλ°œμ— μžˆμ–΄μ„œ 맀우맀우맀우 μ€‘μš”ν•˜λ‹€κ³  μƒκ°ν•˜λŠ” μ‚¬λžŒμ΄λ‹€

 

κ·Έλž˜μ„œ κ°„λ‹¨ν•˜λ‹€κ³  λ³Ό 수 μžˆλŠ” 이번 ν”„λ‘œμ νŠΈμ—μ„œλ„ κ°€μž₯ λ¨Όμ € λ””μžμΈ νŒ¨ν„΄μ„ κ³ λ―Όν–ˆμ—ˆλ‹€.

 

λ‚΄κ°€ ν”„λ‘œμ νŠΈμ—μ„œ κ²½ν—˜ν–ˆλ˜ λ””μžμΈ νŒ¨ν„΄μ€ 크게 2κ°€μ§€μ˜€λ‹€.

 

  1. Container-Presenter Pattern
  2. Atomic Design Pattern

 

Atomic Design Pattern 은 μ›μ†Œκ°€ λ˜λŠ” μ»΄ν¬λ„ŒνŠΈλ₯Ό μž¬μ‚¬μš©ν•˜λŠ” 데에 νŠΉν™”λ˜μ–΄ μžˆλŠ”λ°, μš°λ¦¬λŠ” 사싀상 Single Page 둜 운영되고 Routing μ‘°μ°¨ ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— κ²°κ΅­ Container-Presenter Pattern 을 μ‚¬μš©ν•˜μ˜€λ‹€.

 

μ•žμ„œ μ΄μ•ΌκΈ°ν–ˆλ˜ 톡신 λͺ¨λ“ˆκ³Ό Service λ₯Ό Container μ—μ„œ 받아와 κ·Έ μ•„λž˜μ˜ Presenter λ“€μ—κ²Œ Props 둜 μ „λ‹¬ν•΄μ£Όκ²Œ λœλ‹€.

 

 

μ•„λž˜ μ½”λ“œλŠ” μ‹€μ œ Log λ₯Ό ν…Œμ΄λΈ” ν˜•μ‹μœΌλ‘œ λ Œλ”ν•˜λŠ” μ»΄ν¬λ„ŒνŠΈ μ—μ„œ μ‚¬μš©ν•˜λŠ” Container μ½”λ“œμ΄λ‹€.

 

import React, { useEffect, useState } from "react";

import LogTable from "components/presenter/LogTable/index";

import { fetchAllLog } from "service/LogService";
const LogTableContainer = () => {
  const [logDatas, setLogDatas] = useState([]);

  useEffect(async () => {
    const data = await fetchAllLog();
    setLogDatas(data);
  }, []);

  return <LogTable logDatas={logDatas} />;
};

export default LogTableContainer;

 

λ¨Όμ € ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈκ°€ λΈŒλΌμš°μ €μ— λ‘œλ“œλ˜λŠ” μˆœκ°„ API ν˜ΈμΆœμ„ μ‹œλ„ν•˜κ²Œ ν•˜λ €κ³  useEffect λ‚΄λΆ€μ—μ„œ data fetching 을 ν•œλ‹€.

 

λ°›μ•„μ˜¨ 데이터λ₯Ό <LogTable> 의 props 둜 λ„˜κ²¨μ£Όλ©΄, λ‹€μŒκ³Ό 같이 적절히 μžμ‹ μ»΄ν¬λ„ŒνŠΈλ‘œ λ‚΄λ €μ£Όλ©΄μ„œ μžμ—°μŠ€λŸ½κ²Œ UIλ₯Ό λ Œλ”λ§ν•˜κ²Œ λœλ‹€.

 

 

이런 ꡬ쑰둜 Front End React Application 은 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

 

 

사싀 이 ꡬ쑰가, ν”„λ‘ νŠΈλ₯Ό λ¦¬μ•‘νŠΈλ‘œ μ„ μ •ν•œ 이유 μ‘°μ°¨κ°€ νƒ€λ‹Ήν•˜μ§€ μ•Šμ„ 수 μžˆλ‹€.

 

λ˜ν•œ 기술 자체의 μ‚¬μš©λ²•λ„ μ˜¬λ°”λ₯΄μ§€ μ•Šμ€ λ°©ν–₯으둜 κ΅¬ν˜„λ˜μ–΄μžˆμ„ 수 μžˆμ§€λ§Œ λ‚˜λ¦„ 1λ‹¬μ΄λΌλŠ” 짧은 κΈ°κ°„λ™μ•ˆ μœ μš©ν•˜κ³  κ½€λ‚˜ ꡬ쑰적으둜 잘 κ΅¬μ„±ν•˜μ—¬ ν˜‘μ—…μ„ μ§„ν–‰ν–ˆμ—ˆλ‹€.

 

ν”„λ‘ νŠΈμ—”λ“œλŠ” λ‹¨μˆœνžˆ μ·¨λ―Έ 쯀으둜 μƒκ°ν–ˆλ˜ μ§€λ‚œμ˜ κ²½ν—˜λ“€μ΄ μ΄λ ‡κ²Œ 빛을 λ‚Ό 수 μžˆλ‹€λŠ” 사싀이 λΏŒλ“―ν–ˆκ³ , λ‚˜λ¦„ μžλž‘μŠ€λŸ¬μ› λ”° γ…Žγ…Ž.

 

λ‹€μŒ μ‹œκ°„μ€ λ°±μ—”λ“œμ˜ Spring Boot 에 λŒ€ν•΄μ„œ 이야기해보렀 ν•œλ‹€!

 

λŒ“κΈ€