Skip to content
@ODD-C202

ODD-C202

๐Ÿคฉ ๊ฟˆ์„ ์šฐ์ฃผ์˜ ๋ณ„๋กœ ๊ธฐ๋กํ•˜๊ณ  AI ์˜์ƒ์œผ๋กœ ๋ณด์—ฌ์ฃผ๋Š” ์šฐ๊ฟˆ๋‹ค ์„œ๋น„์Šค

main


ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

  • ๊ฟˆ์„ ์šฐ์ฃผ์˜ ๋ณ„๋กœ ๊ธฐ๋กํ•˜๊ณ , ๊ฟˆ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ AI์˜์ƒ์„ ์ƒ์„ฑํ•˜์—ฌ ์ฆ๊ฑฐ์›€์„ ์ฃผ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

ํŒ€์› ๊ตฌ์„ฑ

๊ฐ•ํ˜„ํ˜ธ ์ •ํ˜„์ˆ˜ ๋ฐ•์ฃผ์ฐฌ ์žฅํฌํ˜„ ์ž„์ฑ„ํ˜„ ๊น€์„œ๋ฆฐ
ํ”„๋กœํ•„ ์•„์ด์ฝ˜ ํ”„๋กœํ•„ ์•„์ด์ฝ˜ ํ”„๋กœํ•„ ์•„์ด์ฝ˜ ํ”„๋กœํ•„ ์•„์ด์ฝ˜ ํ”„๋กœํ•„ ์•„์ด์ฝ˜ ํ”„๋กœํ•„ ์•„์ด์ฝ˜

1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • Front-end:
    React 18, TypeScript, Redux Toolkit, Tailwind CSS, Axios, React Router, react-three-fiber, drei

  • Back-end:
    Spring Boot 3.x, Spring Security, Spring WebFlux & MVC, Spring Data JPA, MySQL, Redis, RabbitMQ, ElasticSearch, FastAPI

  • ๋ฒ„์ „ ๋ฐ ์ด์Šˆ ๊ด€๋ฆฌ:
    GitLab + Git Flow ์ „๋žต, Jira (Sprint ๊ธฐ๋ฐ˜ ํƒœ์Šคํฌ ๊ด€๋ฆฌ), Notion (ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๋ฐ ๋ฌธ์„œํ™”)

  • ํ˜‘์—… ํˆด:
    Mattermost (์‹ค์‹œ๊ฐ„ ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜), Figma (๋””์ž์ธ), Google Drive (์ž๋ฃŒ ๊ณต์œ ), Draw.io (์•„ํ‚คํ…์ฒ˜ ๋‹ค์ด์–ด๊ทธ๋žจ)

  • ์„œ๋น„์Šค ๋ฐฐํฌ ํ™˜๊ฒฝ:
    AWS EC2, Docker Compose, Jenkins, Nginx + Let's Encrypt(HTTPS), Docker Hub, Prometheus + Grafana + Loki (๋ชจ๋‹ˆํ„ฐ๋ง)

  • ๋””์ž์ธ:
    Figma ๊ธฐ๋ฐ˜ ํ”„๋กœํ† ํƒ€์ž…, ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค ๊ธฐ๋ฐ˜ UI/UX ๊ตฌ์„ฑ, 3D ๋ณ„์ž๋ฆฌ ๊ฐ์ • ํ‘œํ˜„ ์‹œ๊ฐํ™” ์ค‘์‹ฌ ๋””์ž์ธ


2. ์ฑ„ํƒํ•œ ๊ฐœ๋ฐœ ๊ธฐ์ˆ ๊ณผ ๋ธŒ๋žœ์น˜ ์ „๋žต

React

  • React ๊ธฐ๋ฐ˜์˜ SPA ๊ตฌ์กฐ๋กœ ์ „์ฒด UI ๊ตฌํ˜„
  • React Router๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง€ ์ „ํ™˜ ์—†์ด ๋ถ€๋“œ๋Ÿฌ์šด UX ์ œ๊ณต
  • ์ƒํƒœ ๊ด€๋ฆฌ๋Š” Redux / Redux-toolkit์„ ์ฑ„ํƒํ•˜์—ฌ ์ „์—ญ ์ƒํƒœ(๋ชจ๋‹ฌ, ์•Œ๋ฆผ, ๋กœ๊ทธ์ธ ๋“ฑ) ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌ

three.js

  • 3D ๋ณ„์ž๋ฆฌ ๊ตฌํ˜„์„ ์œ„ํ•ด three.js + react-three-fiber ์กฐํ•ฉ ํ™œ์šฉ
  • Drei ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด OrbitControls, Stars, useGLTF ๋“ฑ 3D ์‹œ๊ฐํ™” ๋ณด์กฐ ๊ธฐ๋Šฅ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„
  • ๋ณ„ ์ƒ์„ฑ, ํ™•๋Œ€, ๋ฐ˜์ง์ž„ ๋“ฑ์˜ ํšจ๊ณผ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์˜ ๊ฐ์ •์„ ์‹œ๊ฐํ™”ํ•œ ์šฐ์ฃผ ๊ณต๊ฐ„ ๊ตฌ์„ฑ

Spring

  • Spring Boot ๊ธฐ๋ฐ˜์˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜(MSA) ๊ตฌ์„ฑ
  • ๊ฐ ์„œ๋น„์Šค๋Š” Spring Web(MVC or WebFlux), Spring Security, Spring Data JPA ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ์ถ•
  • ์ธ์ฆ/์ธ๊ฐ€: JWT + Redis ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ ํ† ํฐ ๊ด€๋ฆฌ
  • ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ: RabbitMQ๋ฅผ ์ด์šฉํ•œ ์•Œ๋ฆผ/๊ฒ€์ƒ‰ ์ธ๋ฑ์‹ฑ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ
  • ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ: ElasticSearch ์—ฐ๋™, ํ•œ๊ตญ์–ด ์ž์—ฐ์–ด ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ปค์Šคํ…€ analyzer ๊ตฌ์„ฑ
  • ๊ณตํ†ต ๋ชจ๋“ˆํ™”: ๊ณตํ†ต ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ์‘๋‹ต ํฌ๋งท, ์œ ํ‹ธ์„ ๊ณต์šฉ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•ด ์ผ๊ด€์„ฑ ์œ ์ง€

SSE (Server-Sent Events)

  • ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ตฌํ˜„์„ ์œ„ํ•ด SSE ๊ธฐ๋ฐ˜์˜ ๋‹จ๋ฐฉํ–ฅ ํ‘ธ์‹œ ์‹œ์Šคํ…œ ๊ตฌํ˜„
  • ์‚ฌ์šฉ์ž์˜ ์•Œ๋ฆผ ๊ตฌ๋… ์š”์ฒญ ์‹œ SseEmitter๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ ์œ ์ง€
  • notification-service๋Š” RabbitMQ๋กœ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•œ ๋’ค, ํ•ด๋‹น ์œ ์ €์—๊ฒŒ SSE๋กœ ์•Œ๋ฆผ ์ „์†ก
  • ์—ฐ๊ฒฐ ๋Š๊น€, ์žฌ์—ฐ๊ฒฐ, ๋‹ค์ค‘ ํƒญ ๋“ฑ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•œ ์•ˆ์ •์  ์—ฐ๊ฒฐ ๊ด€๋ฆฌ ๋กœ์ง ๊ตฌ์„ฑ

FastAPI

  • AI ์˜์ƒ ์ƒ์„ฑ ์„œ๋ฒ„๋ฅผ Python ๊ธฐ๋ฐ˜์˜ FastAPI๋กœ ๊ตฌ์ถ•
  • ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ง€์›ํ•˜์—ฌ ChatGPT, Stable Diffusion, Runway ๋ชจ๋ธ ํ˜ธ์ถœ์„ ๋น ๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ
  • ํ…์ŠคํŠธ โ†’ ํ‚ค์›Œ๋“œ โ†’ ์ด๋ฏธ์ง€ โ†’ ์˜์ƒ ์ƒ์„ฑ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐ API๋กœ ๋ถ„๋ฆฌํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ™•์žฅ์„ฑ ํ™•๋ณด
  • ํ”„๋ก ํŠธ ์š”์ฒญ โ†’ ๋ฐฑ์—”๋“œ โ†’ FastAPI โ†’ AI ๋ชจ๋ธ ์‹คํ–‰ โ†’ S3 ์—…๋กœ๋“œ ํ›„ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜๊นŒ์ง€ ์ผ๊ด€๋œ ํ๋ฆ„์œผ๋กœ ์—ฐ๋™

๋ธŒ๋žœ์น˜ ์ „๋žต

  • Git-flow ์ „๋žต์—์„œ ์ฃผ์š” ํ†ตํ•ฉ์€ dev ๋ธŒ๋žœ์น˜์—์„œ ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
  • dev ๋ธŒ๋žœ์น˜๋Š” ์‹ค์ œ ๊ฐœ๋ฐœ์˜ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜๋กœ ํ™œ์šฉ๋˜๋ฉฐ, ๋ชจ๋“  ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋ฐ ๊ธ‰ํ•œ ์ˆ˜์ •(Hotfix) ์‚ฌํ•ญ์„ ํ†ตํ•ฉ&ํ…Œ์ŠคํŠธ ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • feature ๋ธŒ๋žœ์น˜๋Š” ๊ฐœ๋ณ„ ๊ธฐ๋Šฅ์ด๋‚˜ ๊ฐœ์„  ์‚ฌํ•ญ์„ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ๋ธŒ๋žœ์น˜ ์ด๋ฆ„์€ feature/ ๋’ค์— ์ž‘์—… ๋„๋ฉ”์ธ(์˜ˆ: FE, AI, BE, INFRA)์™€ ๊ธฐ๋Šฅ ์„ค๋ช…, ๊ทธ๋ฆฌ๊ณ  ๋’ค์— JIRA ํ‹ฐ์ผ“ ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์ด๋Š” ํ˜•์‹์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • TIL ๋ธŒ๋žœ์น˜๋Š” ๊ฐœ๋ฐœ ์ค‘ ๋ฐฐ์šด ๋‚ด์šฉ์ด๋‚˜ ๊ฒฝํ—˜์„ ์ •๋ฆฌํ•˜๋Š” ์šฉ๋„๋กœ ์šด์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.
master
โ””โ”€โ”€ dev
       โ”œโ”€โ”€ feature/AI
       โ”‚   โ””โ”€โ”€ feature/AI-video-creat/123
       โ”œโ”€โ”€ feature/BE
       โ”‚   โ”œโ”€โ”€ feature/BE-auth-api/124
       โ”‚   โ””โ”€โ”€ feature/BE-logging/125
       โ”œโ”€โ”€ feature/FE
       โ”‚   โ”œโ”€โ”€ feature/FE-login-page/126
       โ”‚   โ””โ”€โ”€ feature/FE-user-profile/127
       โ””โ”€โ”€ hotfix/login-bugfix


3. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

woo-ggum-da/
โ”œโ”€โ”€ frontend/
โ”‚   โ”œโ”€โ”€ .eslint.js
โ”‚   โ”œโ”€โ”€ .prettierrc
โ”‚   โ”œโ”€โ”€ tsconfig.json
โ”‚   โ”œโ”€โ”€ package-lock.json
โ”‚   โ”œโ”€โ”€ package.json
โ”‚   โ”œโ”€โ”€ index.html
โ”‚   โ”œโ”€โ”€ public/
โ”‚   โ”‚   โ”œโ”€โ”€ 3d_component.gtlf
โ”‚   โ”‚   โ””โ”€โ”€ 3d_component.fbx
โ”‚   โ””โ”€โ”€ src/
โ”‚       โ”œโ”€โ”€ components/         # ๊ณตํ†ต UI ์ปดํฌ๋„ŒํŠธ
โ”‚       โ”œโ”€โ”€ hooks/              # ๊ณตํ†ต React ํ›…
โ”‚       โ”œโ”€โ”€ stores/             # ๊ธ€๋กœ๋ฒŒ Redux ์ƒํƒœ ๊ด€๋ฆฌ
โ”‚       โ”œโ”€โ”€ routers/            # ๊ธ€๋กœ๋ฒŒ ๋ผ์šฐํŒ… ์„ค์ •
โ”‚       โ”œโ”€โ”€ apis/               # API ๊ด€๋ จ ์ฝ”๋“œ
โ”‚       โ”œโ”€โ”€ themes/             # ์Šคํƒ€์ผ/ํ…Œ๋งˆ ๊ด€๋ จ ํŒŒ์ผ
โ”‚       โ”œโ”€โ”€ types/              # ํƒ€์ž… ํŒŒ์ผ
โ”‚       โ”œโ”€โ”€ domains/
โ”‚       โ”‚   โ”œโ”€โ”€ ๊ธฐ๋Šฅ1 (ex. Login)/
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ components/
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ pages/      # ๋ณด์ด๋Š” ํŽ˜์ด์ง€
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ hooks/
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ stores/
โ”‚       โ”‚   โ”‚   โ”œโ”€โ”€ apis/       # API ๊ด€๋ จ ์ฝ”๋“œ
โ”‚       โ”‚   โ”‚   โ””โ”€โ”€ themes/
โ”‚       โ”‚   โ””โ”€โ”€ ๊ธฐ๋Šฅ2 (ex. SignUp)/
โ”‚       โ”œโ”€โ”€ config.ts           # ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฐ ์„ค์ •
โ”‚       โ”œโ”€โ”€ App.tsx             # ์•ฑ ๋ฃจํŠธ
โ”‚       โ”œโ”€โ”€ main.tsx            # React ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ
โ”‚       โ”œโ”€โ”€ .prettierrc
โ”‚       โ”œโ”€โ”€ eslint.config.js
โ”‚       โ”œโ”€โ”€ tailwind.config.js
โ”‚       โ”œโ”€โ”€ vite.config.js
โ”‚       โ”œโ”€โ”€ jsconfig.json
โ”‚       โ””โ”€โ”€ index.css           # ๊ธ€๋กœ๋ฒŒ ์Šคํƒ€์ผ
โ”‚
โ”œโ”€โ”€ backend/
โ”‚   โ”œโ”€โ”€ package.json
โ”‚   โ”œโ”€โ”€ src/
โ”‚   โ””โ”€โ”€ config/
โ”‚
โ”œโ”€โ”€ AI/
โ”‚   โ”œโ”€โ”€ app/
โ”‚   โ”‚   โ”œโ”€โ”€ config/
โ”‚   โ”‚   โ”œโ”€โ”€ core/               # chain, ํ”„๋กฌํ”„ํŠธ
โ”‚   โ”‚   โ””โ”€โ”€ models/             # DTO
โ”‚   โ”‚       โ”œโ”€โ”€ request/
โ”‚   โ”‚       โ””โ”€โ”€ response/
โ”‚   โ””โ”€โ”€ main.py

...

4. ํ”„๋กœ์ ํŠธ ์•„ํ‚คํ…์ณ

architecture

5. ์—ญํ•  ๋ถ„๋‹ด

๐Ÿœ๊ฐ•ํ˜„ํ˜ธ

  • Backend

    • JWT + Redis ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ธํ”„๋ผ ๊ตฌ์ถ•
      โ†’ Gateway์—์„œ ์ธ์ฆ ํ•„ํ„ฐ ์ฒ˜๋ฆฌ, Access/Refresh ํ† ํฐ ๊ตฌ์กฐ ๊ตฌํ˜„, Redis ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ํฌํ•จ
    • ElasticSearch ์—ฐ๋™ ๋ฐ Nori/NGram ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ๋กœ์ง ๊ตฌํ˜„
      • ์ผ๊ธฐ/์œ ์ € ๊ฒ€์ƒ‰ ์ธ๋ฑ์‹ฑ ์ž๋™ํ™”
      • Analyzer, Tokenizer, Transactional ๊ด€๋ จ ํŠธ๋Ÿฌ๋ธ” ๋‹ค์ˆ˜ ํ•ด๊ฒฐ
    • RabbitMQ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ ์„ค๊ณ„
      • ์„œ๋น„์Šค ๊ฐ„ ๋А์Šจํ•œ ๊ฒฐํ•ฉ์„ ์œ„ํ•œ ์ด๋ฒคํŠธ ๋ฐœํ–‰ ๊ตฌ์กฐ ๊ตฌ์„ฑ
      • AlarmMessage ๊ตฌ์กฐ ์ •์˜ ๋ฐ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ์—ฐ๋™
    • SSE ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ํ๋ฆ„ ๊ตฌ์ถ•
      • emitter ๋“ฑ๋ก, ์—ฐ๊ฒฐ ์œ ์ง€, ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋“ฑ ์„ธ๋ถ€ ํ๋ฆ„ ์„ค๊ณ„
      • ๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ์‹œ ์œ ์ €๋ณ„ ์•Œ๋ฆผ push ํ๋ฆ„ ๊ตฌํ˜„
  • 3D ์šฐ์ฃผ ์‹œ๊ฐํ™”

    • ์ผ๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ 3D ๋ณ„ ์ขŒํ‘œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„
    • ํด๋Ÿฌ์Šคํ„ฐ๋ง ๋ฐ ForceDirected ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž๋ณ„ ๋ณ„ ๋ฐฐ์น˜ ์œ„์น˜ ์ž๋™ ์ƒ์„ฑ
    • ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ณ ๋ คํ•œ ์ขŒํ‘œ ์žฌ๋ฐฐ์น˜ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

๐Ÿงฏ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์ฃผ์š” ์‚ฌ๋ก€

๐Ÿ”ธ Spring Security + Redis ์—ฐ๋™ ๋ฌธ์ œ

  • ํ† ํฐ ํ•ด์‹œ ์ฒ˜๋ฆฌ ํ›„ Redis key ํ™•์ธ ์‹œ ๋ธ”๋กœํ‚น ๋ฌธ์ œ ๋ฐœ์ƒ
    โ†’ Mono.fromCallable + Schedulers.boundedElastic()๋กœ ๋น„๋™๊ธฐ ์•ˆ์ „ ์ฒ˜๋ฆฌ

๐Ÿ”ธ ElasticSearch ๋ถ„์„๊ธฐ ๋™์ž‘ ์˜ค๋ฅ˜

  • ์กฐ๊ฑด์— ๋”ฐ๋ผ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ๋ˆ„๋ฝ๋˜๊ฑฐ๋‚˜ ๋ถ„์„๊ธฐ๊ฐ€ ๋ฌด์‹œ๋˜๋Š” ๋ฌธ์ œ โ†’ nori_tokenizer, ngram_filter, custom analyzer๋กœ ์ง์ ‘ ํ•ด๊ฒฐ

๐Ÿ”ธ RabbitMQ Exchange ์„ค์ • ๋ˆ„๋ฝ

  • ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€๊ฐ€ Queue์— ๋„๋‹ฌํ•˜์ง€ ์•Š์Œ โ†’ Exchange์™€ RoutingKey ๋ฐ”์ธ๋”ฉ ๋ˆ„๋ฝ ํ™•์ธ ํ›„ binding() ์ง์ ‘ ๊ตฌ์„ฑ

๐Ÿ”ธ SSE ์—ฐ๊ฒฐ ์ค‘๋‹จ & ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

  • ํด๋ผ์ด์–ธํŠธ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋Š๊ฒจ๋„ emitter๊ฐ€ ๊ณ„์† ์‚ด์•„์žˆ๋Š” ๋ฌธ์ œ โ†’ onCompletion, onTimeout, onError ํ†ตํ•ด emitter ์•ˆ์ „ ์ œ๊ฑฐ ๋กœ์ง ๊ตฌํ˜„

๐Ÿ”ธ DTO ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ ์‹คํŒจ

  • @ModelAttribute ์‚ฌ์šฉ ์‹œ DTO์— @Setter๊ฐ€ ์—†์–ด ๋ชจ๋“  ๊ฐ’์ด null๋กœ ๋“ค์–ด์˜ด โ†’ @Data ๋˜๋Š” @Setter ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ด๊ฒฐ

๐Ÿ–์ •ํ˜„์ˆ˜

  • Backend
    • MSA ์ธํ”„๋ผ ๊ตฌ์„ฑ
      โ†’ Eureka, Gateway ์„ค์ • ๋ฐ ์„œ๋น„์Šค ๋“ฑ๋ก/ํƒ์ƒ‰ ๊ตฌ์„ฑ
    • ๊ณตํ†ต ๋ชจ๋“ˆ ์„ค๊ณ„
      โ†’ ์‘๋‹ต ํฌ๋งท, ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋กœ์ง์„ common-module๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์ผ๊ด€์„ฑ ๋ฐ ์žฌ์‚ฌ์šฉ์„ฑ ํ™•๋ณด
    • WebClient ์ตœ์ ํ™”
      โ†’ ๋ฐฉ๋ช…๋ก ๊ธฐ๋Šฅ์—์„œ ๋ฐœ์ƒํ•œ N+1 ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด Bulk API ๋ฐฉ์‹ ๋„์ž…
    • ๋ฐฐ์น˜ ์Šค์ผ€์ค„๋Ÿฌ ๊ตฌํ˜„
      โ†’ Redis TTL ๊ธฐ๋ฐ˜ ์‚ญ์ œ ๋ฐฉ์‹์„ ์ œ๊ฑฐํ•˜๊ณ , Spring Batch + MySQL๋กœ ์ผ๊ด„ ์‚ญ์ œ ์ฒ˜๋ฆฌ
    • ์ฝ”๋“œ ํ’ˆ์งˆ ๊ฐœ์„ 
      โ†’ SonarQube ๋„์ž…์„ ํ†ตํ•ด ์ •์  ๋ถ„์„ ์ˆ˜ํ–‰ ๋ฐ ๋ฆฌํŒฉํ† ๋ง ๊ฐ€์ด๋“œ ์ ์šฉ

โœ… ๊ตฌํ˜„ ๋‚ด์šฉ ์ž์„ธํžˆ ๋ณด๊ธฐ

๐Ÿ”น MSA ๊ตฌ์ถ•

  • Eureka๋ฅผ ํ†ตํ•œ ์„œ๋น„์Šค ๋“ฑ๋ก ๋ฐ ๋ฐœ๊ฒฌ
  • Gateway์—์„œ JWT ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด ์ธ๊ฐ€ ์ฒ˜๋ฆฌ
  • User-service์—์„œ ์ธ์ฆ ์ฒ˜๋ฆฌ ๋‹ด๋‹น
  • ๊ณตํ†ต ์‘๋‹ต ๋ฐ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด common-module ๋„์ž…

๐Ÿ”น ๋ฐฉ๋ช…๋ก ์„œ๋น„์Šค

  • WebClient๋กœ ์ž‘์„ฑ์ž ์ •๋ณด(id, profileImg) ์š”์ฒญ ์‹œ N+1 ๋ฌธ์ œ ๋ฐœ์ƒ
    โ†’ writerSeq ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ์š”์ฒญํ•˜๋Š” Bulk API๋กœ ๋ฆฌํŒฉํ† ๋ง
  • ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ฒ˜๋ฆฌ๋กœ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ์กฐํšŒ ๊ตฌํ˜„

๐Ÿ”น ํ–‰์šด ์„œ๋น„์Šค

  • Redis TTL ๋ฐฉ์‹์˜ ๋ฐ์ดํ„ฐ ์‚ญ์ œ โ†’ ์Šค์ผ€์ค„๋Ÿฌ ๊ธฐ๋ฐ˜ MySQL + Spring Batch ์‚ญ์ œ ๋ฐฉ์‹์œผ๋กœ ๋ฆฌํŒฉํ† ๋ง
  • ๊ฟˆ ํ•ด๋ชฝ ๊ธฐ๋Šฅ์—์„œ diarySeq ๊ธฐ์ค€์œผ๋กœ ์กด์žฌ ์—ฌ๋ถ€ ์ฒดํฌ ํ›„
    โ†’ ๊ธฐ์กด ๋ฐ์ดํ„ฐ ์ˆ˜์ • ๋˜๋Š” ์‹ ๊ทœ ์ƒ์„ฑ ์ฒ˜๋ฆฌ

๐Ÿ”น ๊ตฌ๋… ์„œ๋น„์Šค

  • ๊ตฌ๋… ์ƒํƒœ ๋ณ€๊ฒฝ์„ PATCH ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๋กœ ํ†ต์ผ
  • ํšŒ์› ํƒˆํ‡ด ์‹œ RabbitMQ ์ด๋ฒคํŠธ๋ฅผ ํ†ตํ•ด ๊ตฌ๋… ์ž๋™ ํ•ด์ œ
    โ†’ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ๋กœ ์‹ ๋ขฐ์„ฑ ๊ฐ•ํ™”

๐Ÿ”น ์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ

  • SonarQube๋ฅผ ํ†ตํ•œ ์ฝ”๋“œ ์ •์  ๋ถ„์„ ๋ฐ ๋ณด์•ˆ ์ทจ์•ฝ์  ํƒ์ง€
  • ์˜ˆ: Collectors.toList() โ†’ toList()๋กœ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ
๐Ÿงฏ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๐Ÿ”ธ WebClient N+1 ๋ฌธ์ œ

  • ๋ฌธ์ œ: ๋ฐฉ๋ช…๋ก ์ž‘์„ฑ์ž ์ •๋ณด๋ฅผ ๋งค๋ฒˆ ๊ฐœ๋ณ„ ์กฐํšŒํ•˜๋ฉฐ N+1 ๋ฌธ์ œ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ: writerSeq๋ฅผ ํ•œ ๋ฒˆ์— ์ˆ˜์ง‘ํ•˜๊ณ  Bulk API๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด ํ•œ ๋ฒˆ์— ์กฐํšŒ

๐Ÿ”ธ Redis TTL์˜ ๋ถˆ์•ˆ์ •์„ฑ

  • ๋ฌธ์ œ: TTL ๋งŒ๋ฃŒ ์‹œ์ ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์•„ ์Šค์ผ€์ค„ ๊ด€๋ฆฌ ์–ด๋ ค์›€
  • ํ•ด๊ฒฐ: Spring Batch ๊ธฐ๋ฐ˜ ์ผ๊ด„ ์‚ญ์ œ ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜

๐Ÿ”ธ ๊ฟˆ ํ•ด๋ชฝ ์ค‘๋ณต ์ƒ์„ฑ

  • ๋ฌธ์ œ: ๋™์ผ diarySeq์— ๋Œ€ํ•ด ํ•ด๋ชฝ์ด ์ค‘๋ณต ์ƒ์„ฑ
  • ํ•ด๊ฒฐ: ์กด์žฌ ์‹œ ์ˆ˜์ •, ์—†์„ ๊ฒฝ์šฐ์—๋งŒ ์ƒˆ๋กœ ์ƒ์„ฑ

๐Ÿ”ธ ๊ตฌ๋… ๋™๊ธฐ ํ†ต์‹  ๋ฌธ์ œ

  • ๋ฌธ์ œ: ํƒˆํ‡ด์™€ ๊ตฌ๋… ํ•ด์ œ ํƒ€์ด๋ฐ์ด ๋งž์ง€ ์•Š์Œ
  • ํ•ด๊ฒฐ: RabbitMQ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ํ†ต์‹ ์œผ๋กœ ์‹ ๋ขฐ์„ฑ ํ™•๋ณด

๐Ÿถ๋ฐ•์ฃผ์ฐฌ

  • Infra

    • ๋ฐฐํฌ ์„œ๋ฒ„ ์ธํ”„๋ผ ๊ตฌ์ถ•
    • Prometheus์™€ Grafana๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ ๊ตฌ์„ฑ
    • Jenkins ๊ธฐ๋ฐ˜ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•
    • Docker Compose๋กœ ์„œ๋น„์Šค ์šด์˜ ํ™˜๊ฒฝ ์ •๋ฆฌ
  • Frontend

    • ํ–‰์šด์˜ ์ˆซ์ž ๊ธฐ๋Šฅ์—์„œ ๋ณ„์ž๋ฆฌ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌํ˜„
    • ๋งˆ์ดํŽ˜์ด์ง€ ํšŒ์›์ •๋ณด ์ˆ˜์ • ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    • ๋งˆ์ดํŽ˜์ด์ง€ ์•„์ด์ฝ˜ ๊ด€๋ จ ์ปค์Šคํ…€ ํ•จ์ˆ˜ ๊ฐœ๋ฐœ
      (์•„์ด์ฝ˜ ID ๋งคํ•‘, ๋žœ๋ค ์ƒ์„ฑ ๋กœ์ง, ํŠน๋ณ„ ์•„์ด์ฝ˜ ํ™•๋ฅ  ์ ์šฉ)
    • Redux๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋‹ฌ ์ƒํƒœ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ตฌํ˜„
      โ†’ props ์—†์ด๋„ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ถ€๋ชจ์˜ ๋ชจ๋‹ฌ ์ œ์–ด ๊ฐ€๋Šฅ
    • ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ ์ตœ์ ํ™”
    • ํžˆ์–ด๋กœ ํŽ˜์ด์ง€ ๋””์ž์ธ ๋ฐ ์ „์ฒด ๋ ˆ์ด์•„์›ƒ ๊ตฌํ˜„
    • ํŽ˜์ด์ง€ ์ด๋™ ์‹œ CSS ๊ธฐ๋ฐ˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ ์ ์šฉ
    • ๋กœ๋”ฉ ํ™”๋ฉด UI ๊ตฌํ˜„

๐Ÿงฏ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๐Ÿ”ธ Kubernetes โ†’ Docker Compose๋กœ ์ „ํ™˜

  • ๋ฌธ์ œ: ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํ™˜๊ฒฝ์—์„œ IP ์ถฉ๋Œ๋กœ ์ธํ•œ ๋ฐฐํฌ ๋ถˆ๊ฐ€ ๋ฌธ์ œ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ: Docker Compose๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์œผ๋กœ ์ธํ”„๋ผ ์žฌ๊ตฌ์ถ•

๐Ÿ”ธ Gateway ์„œ๋น„์Šค Excited ์ด์Šˆ

  • ๋ฌธ์ œ: Gateway ์„œ๋น„์Šค๊ฐ€ Docker์—์„œ ๋น„์ •์ƒ ์ข…๋ฃŒ๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ: Gateway ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰ ์‹œ sleep ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ฃผ์–ด ์ˆœ์ฐจ ์‹คํ–‰๋˜๋„๋ก ์ฒ˜๋ฆฌ

๐Ÿ”ธ ๊ณผ๋„ํ•œ Props ์ „๋‹ฌ

  • ๋ฌธ์ œ: ํ”„๋ก ํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ๋‹ค ๋ณด๋‹ˆ props ์ „๋‹ฌ์ด ๋ณต์žกํ•ด์ง
  • ํ•ด๊ฒฐ: ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ(Redux)๋กœ props ์‚ฌ์šฉ ์ตœ์†Œํ™” ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

๐Ÿ”ธ ๋ชจ๋‹ฌ ์ƒํƒœ ์ œ์–ด ์–ด๋ ค์›€

  • ๋ฌธ์ œ: ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋กœ ๋ถ€๋ชจ์—์„œ ๋ชจ๋‹ฌ ์ œ์–ด๊ฐ€ ์–ด๋ ค์›€
  • ํ•ด๊ฒฐ: Redux๋กœ ๋ชจ๋‹ฌ ์ƒํƒœ๋ฅผ ์ค‘์•™ ์ง‘์ค‘์‹์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์œ„์น˜์— ์ƒ๊ด€์—†์ด ๋ชจ๋‹ฌ ์ œ์–ด ๊ฐ€๋Šฅ

๐Ÿ”ธ ๊ฒ€์ƒ‰์ฐฝ ๊ตฌ๋… ๋ฆฌ๋ Œ๋”๋ง ์ด์Šˆ

  • ๋ฌธ์ œ: ๊ฒ€์ƒ‰์ฐฝ์—์„œ ์ƒํƒœ ๋ณ€ํ™” ํ›„์—๋„ ์ฆ‰๊ฐ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ
  • ํ•ด๊ฒฐ: useEffect์˜ ์˜์กด์„ฑ ๋ฐฐ์—ด์— ๊ฒ€์ƒ‰ ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ฒ€์ƒ‰์ฐฝ ๋‹ซ์„ ์‹œ ์ž๋™ reload๋˜๋„๋ก ์ˆ˜์ •

๐Ÿช์žฅํฌํ˜„

  • Frontend
    • ์ „์ฒด UI/UX ๋””์ž์ธ ๋ฐ ๋ชฉ์—… ์ œ์ž‘ (Figma)
    • ์ผ๊ธฐ ์ž‘์„ฑ ๊ธฐ๋Šฅ (CRUD) ๊ตฌํ˜„
    • Redux๋ฅผ ํ™œ์šฉํ•œ ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ ๋ฐ API ์—ฐ๋™
    • three.js ๊ธฐ๋ฐ˜ ์šฐ์ฃผ ์‹œ๊ฐํ™” ๊ตฌํ˜„
      โ†’ ์ž‘์„ฑํ•œ ์ผ๊ธฐ๊ฐ€ 3D ๋ณ„๋กœ ์‹œ๊ฐํ™”๋˜๋„๋ก ์—ฐ๋™ ๋ฐ ์‹œ๊ฐ ํšจ๊ณผ ๊ตฌํ˜„
    • ๋กœ๊ทธ์ธ / ๋ฐฉ๋ช…๋ก / ๊ฒ€์ƒ‰ ํŽ˜์ด์ง€ ๋ฐ ๋ชจ๋‹ฌ
      โ†’ ์ผ๊ด€๋œ ์Šคํƒ€์ผ ์œ ์ง€ ๋ฐ ์ปดํฌ๋„ŒํŠธ ์ •๋ฆฌ

๐Ÿงฏ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๐Ÿ”ธ ๋”๋ธ”ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฏธ์ž‘๋™ & ๋ณ„ ๊ฐ€๋ฆผ ํ˜„์ƒ

  • ๋ฌธ์ œ: mesh ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š” ์œ„์น˜์—์„œ ๋”๋ธ”ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ , ํŠน์ • ๊ฐ๋„์—์„œ ๋ณ„์ด ๋ณด์ด์ง€ ์•Š๋Š” ํ˜„์ƒ ๋ฐœ์ƒ
  • ์›์ธ: mesh๊ฐ€ 3D ๊ณต๊ฐ„ ์•ˆ์—์„œ ๋ณ„์„ ๊ฐ€๋ฆฌ๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ๊ฐ€๋กœ์ฑ„๊ณ  ์žˆ์—ˆ์Œ
  • ํ•ด๊ฒฐ
    • mesh ์š”์†Œ ์ œ๊ฑฐ
    • ๋”๋ธ”ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ HTML <div> ์š”์†Œ๋กœ ์œ„์ž„
    • ๋ณ„ ์œ„์น˜๋ฅผ ๋žœ๋ค ์ƒ์„ฑ ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ
    • ์ผ๊ธฐ ์ž‘์„ฑ ํ›„ ์นด๋ฉ”๋ผ๊ฐ€ ํ•ด๋‹น ์œ„์น˜๋กœ ์ž๋™ ์ด๋™ํ•˜๋„๋ก ๊ตฌํ˜„
    • ๋ฐ˜์ง์ž„ ๋“ฑ ์‹œ๊ฐ ํšจ๊ณผ๋กœ ์‚ฌ์šฉ์ž ์ธ์ง€์„ฑ ๊ฐ•ํ™”

๐Ÿ”ธ React Three Fiber์˜ ์•”์‹œ์  ์š”์†Œ ์‚ฌ์šฉ ์ดํ•ด

  • <points>, <bufferGeometry> ๋“ฑ์˜ ์š”์†Œ๋ฅผ import ์—†์ด JSX๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ์— ๋Œ€ํ•œ ์ดํ•ด ๋ถ€์กฑ
  • React Three Fiber์—์„œ๋Š” Three.js ์š”์†Œ๋ฅผ JSX๋กœ ์•”์‹œ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • <Canvas> ๋‚ด๋ถ€์—์„œ ์ž๋™์œผ๋กœ Three ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜๋จ์„ ํ•™์Šต

๐ŸŽ‚์ž„์ฑ„ํ˜„

  • AI

    • Text-to-Video WangchanBERT-Wan2.1 ๊ธฐ๋ฐ˜ ๋ชจ๋ธ์— ๋Œ€ํ•ด LoRA ํŒŒ์ธํŠœ๋‹ ์‹คํ—˜ ์ง„ํ–‰
    • FastAPI ๊ธฐ๋ฐ˜ AI ์„œ๋ฒ„ ์ดˆ๊ธฐ ๊ตฌ์„ฑ ๋ฐ ๋ผ์šฐํŒ… ์„ค์ •
  • Frontend

    • ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ React ๊ตฌ์กฐ ์„ธํŒ…
    • axios ์ธํ„ฐ์…‰ํ„ฐ ์„ค์ •์„ ํ†ตํ•œ ๊ณตํ†ต ์—๋Ÿฌ ์ฒ˜๋ฆฌ ๋ฐ ์ธ์ฆ ํ† ํฐ ์ ์šฉ
    • ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ API ์—ฐ๋™
    • ๋žœ๋ค ์œ ์ € ํƒ์ƒ‰ ํŽ˜์ด์ง€ API ์—ฐ๋™
    • ๋ณ„ CRUD ๊ธฐ๋ฐ˜ ๋ณ„์ž๋ฆฌ ์—ฐ๊ฒฐ ์ƒํƒœ ๊ด€๋ฆฌ
    • SSE ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ํŒ์—… ๊ตฌํ˜„
    • ์•Œ๋ฆผ ์ƒํƒœ์— ๋”ฐ๋ฅธ ๋ฐ”๋กœ๊ฐ€๊ธฐ ๊ธฐ๋Šฅ ๊ตฌํ˜„
    • redux-toolkit ๊ธฐ๋ฐ˜ ์ „์—ญ ์ƒํƒœ๊ด€๋ฆฌ ๊ตฌ์กฐ ๋„์ž… ๋ฐ ์ ์šฉ

๐Ÿงฏ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๐Ÿ”ธ RefreshToken์œผ๋กœ ํ† ํฐ ์žฌ๋ฐœ๊ธ‰ ๋ฌดํ•œ ํ˜ธ์ถœ ์ด์Šˆ

  • ๋ฌธ์ œ: ๊ธฐ์กด API ์š”์ฒญ์ด 401 ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ํ† ํฐ ๊ฐฑ์‹ ์„ ์œ„ํ•ด ์š”์ฒญ์„ ์žฌ์‹œ๋„ ํ•˜๋ฉด์„œ 401 ๋ฌดํ•œ ์—๋Ÿฌ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ: ํ† ํฐ ๊ฐฑ์‹ ์„ ์œ„ํ•ด ๋Œ€๊ธฐ ์š”์ฒญ ํ๋ฅผ ํ™œ์šฉํ•˜๊ณ  401, 403 ๋ถ„๊ธฐ๋ณ„๋กœ ๊ฐฑ์‹  ๋ฐ ์‹คํŒจ ๋กœ์ง ๊ตฌ์ƒ

๐Ÿ”ธ ๊ณผ๋„ํ•œ Props ์ „๋‹ฌ

  • ๋ฌธ์ œ: ํ”„๋ก ํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž˜๊ฒŒ ์ชผ๊ฐœ๋‹ค ๋ณด๋‹ˆ props ์ „๋‹ฌ์ด ๋ณต์žกํ•ด์ง
  • ํ•ด๊ฒฐ: ์ „์—ญ ์ƒํƒœ ๊ด€๋ฆฌ(Redux)๋กœ props ์‚ฌ์šฉ ์ตœ์†Œํ™” ๋ฐ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

๐Ÿ”ธ45์ดˆ๋งˆ๋‹ค ์—ฐ๊ฒฐ ๋Š๊น€ ์ด์Šˆ & heatbeat์™€ ping๊ณผ ์„œ๋กœ ์ถฉ๋Œ

  • ๋ฌธ์ œ: SSE ์—ฐ๊ฒฐ ์‹œ ํƒ€์ž„์•„์›ƒ์— ๋ฏผ๊ฐํ•˜๊ฒŒ ๋ฐ˜์‘ํ•˜์—ฌ ํŠ•๊น€ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ: ๋ฐฑ์—”๋“œ์™€ ํ•‘ํ…Œ์ŠคํŠธ, ํ•˜ํŠธ๋น„ํŠธ๋ฅผ ์„œ๋กœ์†Œ๋กœ interval ์ง€์ •ํ•˜์—ฌ ์‹ ํ˜ธ๋ฅผ ํ™•์ธ

๐Ÿš๊น€์„œ๋ฆฐ

  • AI + Frontend
    • ์‚ฌ์šฉ์ž ํ…์ŠคํŠธ ๊ธฐ๋ฐ˜ AI ๊ฐ์„ฑ ์˜์ƒ ์ƒ์„ฑ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    • FastAPI + LangChain ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ
      โ†’ ChatGPT ์š”์•ฝ/ํ‚ค์›Œ๋“œ ์ถ”์ถœ โ†’ Stable Diffusion ์ด๋ฏธ์ง€ ์ƒ์„ฑ โ†’ Gen-3 ์˜์ƒ ์ƒ์„ฑ
    • ๋ฐฉ๋ช…๋ก ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋ฐ ํ”„๋ก ํŠธ ์—ฐ๋™ (์ž์œ  ์ž‘์„ฑ + ํŽ˜์ด์ง€๋„ค์ด์…˜)
    • ๊ฟˆ ๋Œ€์‹œ๋ณด๋“œ UI ๋ฐ ๊ฐ์ • ๋ถ„์„ ๊ธฐ๋ฐ˜ ์‹œ๊ฐํ™” ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ
    • ๊ฐ์ • ๊ฒฐ๊ณผ ๊ธฐ๋ฐ˜ ๋ฐฐ๊ฒฝ์Œ์•… ์ถ”์ฒœ ๋ฐ ์žฌ์ƒ ๋กœ์ง ๊ตฌํ˜„

๐ŸŒŒ ํŽ˜์ด์ง€๋ณ„ ์ฃผ์š” ๊ธฐ๋Šฅ

โญ๏ธ ์ผ๊ธฐ(๋ณ„์ž๋ฆฌ) ๋ชจ๋‹ฌ - AI ์˜์ƒ ์ƒ์„ฑ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ผ๊ธฐ ํ…์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฐ์„ฑ ์˜์ƒ ์ƒ์„ฑ
  • FastAPI ์„œ๋ฒ„์—์„œ LangChain ๊ธฐ๋ฐ˜ AI ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ:
    • ChatGPT โ†’ ํ…์ŠคํŠธ ์š”์•ฝ + ํ‚ค์›Œ๋“œ ์ถ”์ถœ
    • Stable Diffusion 3.5 โ†’ ์ด๋ฏธ์ง€ ์ƒ์„ฑ
    • Gen-3 โ†’ ์˜์ƒ ์ƒ์„ฑ
  • ๊ฒฐ๊ณผ ์˜์ƒ์„ ๋ชจ๋‹ฌ์—์„œ ๋ฐ”๋กœ ์žฌ์ƒํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋ชฐ์ž…๊ฐ ๊ฐ•ํ™”

๐Ÿ“Š ๊ฟˆ ๋Œ€์‹œ๋ณด๋“œ

  • 2์ฃผ/1๊ฐœ์›”๊ฐ„ ์ž‘์„ฑํ•œ ์ผ๊ธฐ๋ฅผ ๊ฐ์ •๋ณ„๋กœ ๋ถ„๋ฅ˜ ๋ฐ ์‹œ๊ฐํ™”
  • ๊ฐ€์žฅ ๋†’์€ ๊ฐ์ • ๊ธฐ๋ฐ˜์œผ๋กœ ์Œ์•… ์ถ”์ฒœ
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฐ๊ฒฝ์Œ์•…์„ ์„ ํƒํ•˜๋ฉด ์ž๋™ ์žฌ์ƒ ๋กœ์ง ์ฒ˜๋ฆฌ

๐Ÿ’ฌ ๋ฐฉ๋ช…๋ก ๋ชจ๋‹ฌ

  • ์‚ฌ์šฉ์ž๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ช…๋ก ๊ธฐ๋Šฅ
  • ํŽ˜์ด์ง€๋„ค์ด์…˜ ์ ์šฉ์œผ๋กœ ๋งŽ์€ ๋ฉ”์‹œ์ง€์—๋„ ๊น”๋”ํ•œ UI ์œ ์ง€

6. ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ ๋ฐ ์ž‘์—… ๊ด€๋ฆฌ

๊ฐœ๋ฐœ ๊ธฐ๊ฐ„

  • ์ „์ฒด ๊ฐœ๋ฐœ ๊ธฐ๊ฐ„ : 2025-02-24 ~ 2025-04-11
  • ์•„์ด๋””์–ด ๊ธฐํš : 2025-02-24 ~ 2025-02-28
  • UI ๊ตฌํ˜„ : 2025-03-07 ~ 2025-03-21
  • ๊ธฐ๋Šฅ ๊ตฌํ˜„ : 2025-03-17 ~ 2025-04-11

์ž‘์—… ๊ด€๋ฆฌ

  • GitLab ๊ธฐ๋ฐ˜ Git Flow ๋ธŒ๋žœ์น˜ ์ „๋žต์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜‘์—…์„ ์ฒด๊ณ„์ ์œผ๋กœ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
    • dev ๋ธŒ๋žœ์น˜๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ฐ ๊ธฐ๋Šฅ์€ feature/๋„๋ฉ”์ธ-๊ธฐ๋Šฅ/์ด์Šˆ๋ฒˆํ˜ธ ํ˜•์‹์œผ๋กœ ๊ด€๋ฆฌ
    • ๊ณตํ†ต/๋ฐ˜๋ณต๋˜๋Š” ๋ธŒ๋žœ์น˜ ๋„ค์ด๋ฐ ๋ฃฐ์„ ํ†ตํ•ด ํ˜‘์—… ์‹œ ์ถฉ๋Œ์„ ์ตœ์†Œํ™”
  • Jira + Notion์„ ํ†ตํ•œ ์ด์Šˆ/๊ธฐ๋ก ๊ด€๋ฆฌ
    • Jira๋ฅผ ํ™œ์šฉํ•ด Sprint ๋‹จ์œ„๋กœ ํƒœ์Šคํฌ๋ฅผ ๋ถ„๋ฆฌํ•˜๊ณ  ์šฐ์„ ์ˆœ์œ„ ๊ธฐ๋ฐ˜ ํƒœ์Šคํฌ ๊ด€๋ฆฌ
    • Notion์— ์‹ค์‹œ๊ฐ„ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๋ณด๋“œ๋ฅผ ์šด์˜ํ•˜์—ฌ ํŒ€์› ์ „์ฒด๊ฐ€ ๊ธฐ์ˆ  ์ด์Šˆ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋น ๋ฅด๊ฒŒ ํ•ด๊ฒฐ
  • Daily Stand-up ๋ฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ
    • ๋งค์ผ ์•„์นจ ํšŒ์˜๋ฅผ ํ†ตํ•ด ์ง„ํ–‰ ์ƒํ™ฉ๊ณผ ๋ง‰ํžŒ ์  ๊ณต์œ 
    • PR๋งˆ๋‹ค ์ตœ์†Œ 1์ธ ์ด์ƒ์˜ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•„์ˆ˜๋กœ ์ง„ํ–‰ํ•˜์—ฌ ์ฝ”๋“œ ํ’ˆ์งˆ ์œ ์ง€
  • CI/CD ์ž๋™ํ™” ๋ฐ ๋ฐฐํฌ ํšจ์œจํ™”
    • Jenkins + Docker Compose + AWS EC2 ํ™˜๊ฒฝ์—์„œ ์ž๋™ํ™”๋œ ๋ฐฐํฌ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ
    • Mattermost ์—ฐ๋™์œผ๋กœ ๋นŒ๋“œ ๊ฒฐ๊ณผ ์‹ค์‹œ๊ฐ„ ๊ณต์œ 


7. ์‹ ๊ฒฝ ์“ด ๋ถ€๋ถ„

  • 3D ๋ณ„์ž๋ฆฌ UI/UX ๊ฒฝํ—˜

    • ์‚ฌ์šฉ์ž์˜ ๊ฟˆ๊ณผ ๊ฐ์ •์„ ๋ณ„๋กœ ํ‘œํ˜„ํ•˜๋Š” ์‹œ๊ฐํ™”์—์„œ ๋‹จ์ˆœํ•œ ๋žœ๋ค ๋ฐฐ์น˜๊ฐ€ ์•„๋‹Œ, ๊ฐ์ • ๊ธฐ๋ฐ˜ ์œ„์น˜ ๋ฐฐ์น˜, ๋ฐ˜์ง์ž„ ํšจ๊ณผ, ํ™•๋Œ€ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋“ฑ UX์  ๊ฐ์„ฑ์„ ๊ณ ๋ ค
    • three.js + react-three-fiber + drei ์กฐํ•ฉ์„ ํ†ตํ•ด ์ž์—ฐ์Šค๋Ÿฌ์šด 3D ์šฐ์ฃผ ๊ณต๊ฐ„ ๊ตฌ์„ฑ
    • ๋ณ„ ์ƒ์„ฑ ๋กœ์ง์€ ๋ฐฑ์—”๋“œ์—์„œ ์ขŒํ‘œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์ œ๊ณตํ•˜์—ฌ ์ผ๊ด€์„ฑ ์œ ์ง€
  • AI ๊ธฐ๋ฐ˜ ์˜์ƒ ์ƒ์„ฑ

    • ๊ฟˆ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ‚ค์›Œ๋“œ ์ถ”์ถœ โ†’ ์ด๋ฏธ์ง€ ์ƒ์„ฑ โ†’ ์˜์ƒ ์ƒ์„ฑ ์ˆœ์œผ๋กœ ํŒŒ์ดํ”„๋ผ์ธ ์„ค๊ณ„
    • ChatGPT, Stable Diffusion 3.5, Gen-3 ๋ชจ๋ธ์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ์ • ๊ธฐ๋ฐ˜ ๊ฟˆ ์˜์ƒ ์ƒ์„ฑ
    • LangChain ๊ธฐ๋ฐ˜ ํ”„๋กฌํ”„ํŠธ ์ฒด์ธ ๊ตฌ์„ฑ์œผ๋กœ ํ‚ค์›Œ๋“œ ํ’ˆ์งˆ ํ–ฅ์ƒ
    • ์˜์ƒ ๊ฒฐ๊ณผ๋Š” S3์— ์—…๋กœ๋“œ ํ›„ ๋ฐฑ์—”๋“œ์™€ ์—ฐ๊ฒฐ๋˜์–ด ํ”„๋ก ํŠธ์—์„œ ์žฌ์ƒ
  • ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์‹œ์Šคํ…œ

    • ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ ์„œ๋น„์Šค์™€ ์•Œ๋ฆผ ์ „์†ก ์„œ๋น„์Šค๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๋น„๋™๊ธฐ ๋ฉ”์‹œ์ง• ๊ตฌ์กฐ ์„ค๊ณ„
    • RabbitMQ๋ฅผ ํ†ตํ•ด ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ โ†’ SSE๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์ „๋‹ฌ
    • Emitter ์—ฐ๊ฒฐ ๋Š๊น€ ๋ฐฉ์ง€์™€ ์žฌ์—ฐ๊ฒฐ ํ•ธ๋“ค๋ง, ๋‹ค์ค‘ ํƒญ ๋Œ€์‘์„ ๊ณ ๋ คํ•œ ์•ˆ์ •์  ์„ค๊ณ„
  • ElasticSearch ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ

    • ์‚ฌ์šฉ์ž์™€ ์ผ๊ธฐ์— ๋Œ€ํ•ด Nori Tokenizer + Edge Ngram ๊ธฐ๋ฐ˜์˜ ๊ฒ€์ƒ‰ ์ธ๋ฑ์‹ฑ ๊ตฌ์„ฑ
    • ๊ฒ€์ƒ‰ ์กฐ๊ฑด(์ œ๋ชฉ/๋‚ด์šฉ/ํƒœ๊ทธ/์ž‘์„ฑ์ž)์— ๋”ฐ๋ผ ๋ถ€๋ถ„ ์ผ์น˜์™€ ํ‚ค์›Œ๋“œ ๋ถ„์„์ด ๋˜๋„๋ก Analyzer ์ปค์Šคํ„ฐ๋งˆ์ด์ง•
    • ์‹ค์‹œ๊ฐ„ ์ธ๋ฑ์Šค ์—…๋ฐ์ดํŠธ ๋กœ์ง์œผ๋กœ CRUD ๋™๊ธฐํ™” ๋ณด์žฅ
  • ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ณ ๋ คํ•œ MSA ์„ค๊ณ„

    • ์ด 9๊ฐœ ์ด์ƒ์˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋กœ ๊ตฌ์„ฑ๋œ ๊ตฌ์กฐ์—์„œ ๊ณตํ†ต ๋ชจ๋“ˆ(common-module), ํ†ตํ•ฉ gateway, Eureka ๋“ฑ๋ก, config-service ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ๊ด€๋ฆฌ ๊ตฌ์„ฑ
    • WebClient, FeignClient, RabbitMQ ๋“ฑ ์„œ๋น„์Šค๊ฐ„ ํ†ต์‹  ๋ฐฉ์‹์€ ๊ธฐ๋Šฅ์— ๋”ฐ๋ผ ์œ ์—ฐํ•˜๊ฒŒ ํ˜ผ์šฉ
    • ๊ฐ ์„œ๋น„์Šค๋Š” ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌ๋˜์–ด ์žฅ์•  ๊ฒฉ๋ฆฌ์™€ ๋…๋ฆฝ ๋ฐฐํฌ ๊ฐ€๋Šฅ
  • ํ”„๋ก ํŠธ์—”๋“œ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„ ๋ฐ ์ƒํƒœ ๊ด€๋ฆฌ

    • Zustand ๋Œ€์‹  Redux/Redux-toolkit์„ ์„ ํƒํ•˜์—ฌ ๋ณต์žกํ•œ ์ „์—ญ ์ƒํƒœ(๋ชจ๋‹ฌ, ์•Œ๋ฆผ ๋“ฑ) ์ฒ˜๋ฆฌ
    • ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๊ณ ๋ คํ•˜์—ฌ ๋„๋ฉ”์ธ ๊ธฐ๋ฐ˜ ๋””๋ ‰ํ† ๋ฆฌ ์„ค๊ณ„ ๋ฐ ๋ชจ๋“ˆํ™”
    • UX๋ฅผ ๊ณ ๋ คํ•œ ํžˆ์–ด๋กœ ํŽ˜์ด์ง€, ์šฐ์ฃผ์„  ํŽ˜์ด์ง€ ๋“ฑ ๊ตฌ์„ฑ
  • ์ธํ”„๋ผ ์ž๋™ํ™”์™€ ๋ชจ๋‹ˆํ„ฐ๋ง

    • Jenkins ๊ธฐ๋ฐ˜ CI/CD ๊ตฌ์ถ•์œผ๋กœ GitLab ๋ธŒ๋žœ์น˜ Merge ์‹œ ์ž๋™ ๋ฐฐํฌ
    • Prometheus + Grafana + Loki๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ ๋ชจ๋‹ˆํ„ฐ๋ง, ๋กœ๊ทธ ๋ถ„์„ ์‹œ์Šคํ…œ ๊ตฌ์ถ•
    • Nginx + Letโ€™s Encrypt๋ฅผ ํ™œ์šฉํ•œ HTTPS ์ ์šฉ ๋ฐ ๋ณด์•ˆ ์„ค์ • ์™„๋ฃŒ

7. ํŽ˜์ด์ง€๋ณ„ ๊ธฐ๋Šฅ

[ํžˆ์–ด๋กœ ํŽ˜์ด์ง€]

ํžˆ์–ด๋กœ ํŽ˜์ด์ง€
ํžˆ์–ด๋กœํŽ˜์ด์ง€

[๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€ ]

๋กœ๊ทธ์ธ/ ํšŒ์›๊ฐ€์ž… ํŽ˜์ด์ง€
consultant_main

[๋ฉ”์ธํŽ˜์ด์ง€]

๋ฉ”์ธ ๋ณ„์ž๋ฆฌ ํŽ˜์ด์ง€
consultant_children

[์ผ๊ธฐ(๋ณ„์ž๋ฆฌ) ๋ชจ๋‹ฌ]

์ผ๊ธฐ์ƒ์„ฑ์™„๋ฃŒ ์•Œ๋ฆผ
consultant_schdl
์ผ๊ธฐ AI์˜์ƒ, ๊ฟˆ์ผ๊ธฐ, ๊ฟˆ ํ•ด๋ชฝ ๋ณด๊ธฐ
consultant_schdl
์ผ๊ธฐ ์ž‘์„ฑํ•˜๊ธฐ
consultant_schdl

[์šฐ์ฃผ์„  ํŽ˜์ด์ง€]

์šฐ์ฃผ์„  ํŽ˜์ด์ง€ ์ด๋™
์šฐ์ฃผ์„  ์ง„์ž…

[๊ฟˆ ๋Œ€์‹œ๋ณด๋“œ]

๊ฟˆ ๋Œ€์‹œ๋ณด๋“œ ํŽ˜์ด์ง€
parent_schdl

[ํ–‰์šด๋ฒˆํ˜ธ ๋ฝ‘๊ธฐ ํŽ˜์ด์ง€]

ํ–‰์šด๋ฒˆํ˜ธ ๋ฝ‘๊ธฐ ํŽ˜์ด์ง€
parent_schdl

[์˜ค๋Š˜์˜ ์šด์„ธ ํŽ˜์ด์ง€]

์˜ค๋Š˜์˜ ์šด์„ธ ํŽ˜์ด์ง€
parent_schdl

[๋ฐฉ๋ช…๋ก ๋ชจ๋‹ฌ]

๋ฐฉ๋ช…๋ก ๋ชจ๋‹ฌ
parent_schdl

[๊ฒ€์ƒ‰ ๋ชจ๋‹ฌ]

์œ ์ €๊ฒ€์ƒ‰ ๋ชจ๋‹ฌ
parent_schdl
์ผ๊ธฐ๊ฒ€์ƒ‰ ๋ชจ๋‹ฌ
parent_schdl

[๋ธ”๋ž™ํ™€]

๋ธ”๋ž™ํ™€ ํŽ˜์ด์ง€
parent_schdl

ํŒ€์› ์†Œ๊ฐœ
main

Popular repositories Loading

  1. uggumda uggumda Public

  2. .github .github Public

Repositories

Showing 2 of 2 repositories

Top languages

Loadingโ€ฆ

Most used topics

Loadingโ€ฆ