- ๋ฐฐํฌ URL : https://j12c202.p.ssafy.io/
- ๊ฟ์ ์ฐ์ฃผ์ ๋ณ๋ก ๊ธฐ๋กํ๊ณ , ๊ฟ ๋ด์ฉ์ ๋ฐํ์ผ๋ก AI์์์ ์์ฑํ์ฌ ์ฆ๊ฑฐ์์ ์ฃผ๋ ์๋น์ค์ ๋๋ค.
-
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 ๋ณ์๋ฆฌ ๊ฐ์ ํํ ์๊ฐํ ์ค์ฌ ๋์์ธ
- React ๊ธฐ๋ฐ์ SPA ๊ตฌ์กฐ๋ก ์ ์ฒด UI ๊ตฌํ
- React Router๋ฅผ ํตํด ํ์ด์ง ์ ํ ์์ด ๋ถ๋๋ฌ์ด UX ์ ๊ณต
- ์ํ ๊ด๋ฆฌ๋ Redux / Redux-toolkit์ ์ฑํํ์ฌ ์ ์ญ ์ํ(๋ชจ๋ฌ, ์๋ฆผ, ๋ก๊ทธ์ธ ๋ฑ) ์ผ๊ด๋๊ฒ ๊ด๋ฆฌ
- 3D ๋ณ์๋ฆฌ ๊ตฌํ์ ์ํด three.js + react-three-fiber ์กฐํฉ ํ์ฉ
- Drei ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด
OrbitControls,Stars,useGLTF๋ฑ 3D ์๊ฐํ ๋ณด์กฐ ๊ธฐ๋ฅ ๊ฐํธํ๊ฒ ๊ตฌํ - ๋ณ ์์ฑ, ํ๋, ๋ฐ์ง์ ๋ฑ์ ํจ๊ณผ๋ฅผ ํตํด ์ฌ์ฉ์์ ๊ฐ์ ์ ์๊ฐํํ ์ฐ์ฃผ ๊ณต๊ฐ ๊ตฌ์ฑ
- Spring Boot ๊ธฐ๋ฐ์ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ(MSA) ๊ตฌ์ฑ
- ๊ฐ ์๋น์ค๋ Spring Web(MVC or WebFlux), Spring Security, Spring Data JPA ๊ธฐ๋ฐ์ผ๋ก ๊ตฌ์ถ
- ์ธ์ฆ/์ธ๊ฐ: JWT + Redis ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์ ์ธ์ฆ ํ ํฐ ๊ด๋ฆฌ
- ๋น๋๊ธฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ: RabbitMQ๋ฅผ ์ด์ฉํ ์๋ฆผ/๊ฒ์ ์ธ๋ฑ์ฑ ๋ฉ์์ง ์ฒ๋ฆฌ
- ๊ฒ์ ๊ธฐ๋ฅ: ElasticSearch ์ฐ๋, ํ๊ตญ์ด ์์ฐ์ด ์ฒ๋ฆฌ๋ฅผ ์ํ ์ปค์คํ analyzer ๊ตฌ์ฑ
- ๊ณตํต ๋ชจ๋ํ: ๊ณตํต ์์ธ ์ฒ๋ฆฌ, ์๋ต ํฌ๋งท, ์ ํธ์ ๊ณต์ฉ ๋ชจ๋๋ก ๋ถ๋ฆฌํด ์ผ๊ด์ฑ ์ ์ง
- ์ค์๊ฐ ์๋ฆผ ๊ตฌํ์ ์ํด SSE ๊ธฐ๋ฐ์ ๋จ๋ฐฉํฅ ํธ์ ์์คํ ๊ตฌํ
- ์ฌ์ฉ์์ ์๋ฆผ ๊ตฌ๋ ์์ฒญ ์ SseEmitter๋ฅผ ํตํด ์ฐ๊ฒฐ ์ ์ง
notification-service๋ RabbitMQ๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ์์ ํ ๋ค, ํด๋น ์ ์ ์๊ฒ SSE๋ก ์๋ฆผ ์ ์ก- ์ฐ๊ฒฐ ๋๊น, ์ฌ์ฐ๊ฒฐ, ๋ค์ค ํญ ๋ฑ ๋ค์ํ ์ํฉ์ ๊ณ ๋ คํ ์์ ์ ์ฐ๊ฒฐ ๊ด๋ฆฌ ๋ก์ง ๊ตฌ์ฑ
- 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
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
...
-
Backend
- JWT + Redis ๊ธฐ๋ฐ ์ธ์ฆ ์ธํ๋ผ ๊ตฌ์ถ
โ Gateway์์ ์ธ์ฆ ํํฐ ์ฒ๋ฆฌ,Access/Refreshํ ํฐ ๊ตฌ์กฐ ๊ตฌํ, Redis ๋ธ๋๋ฆฌ์คํธ ํฌํจ - ElasticSearch ์ฐ๋ ๋ฐ Nori/NGram ๊ธฐ๋ฐ ๊ฒ์ ๋ก์ง ๊ตฌํ
- ์ผ๊ธฐ/์ ์ ๊ฒ์ ์ธ๋ฑ์ฑ ์๋ํ
Analyzer,Tokenizer,Transactional๊ด๋ จ ํธ๋ฌ๋ธ ๋ค์ ํด๊ฒฐ
- RabbitMQ ๊ธฐ๋ฐ ๋น๋๊ธฐ ๋ฉ์์ง ์์คํ
์ค๊ณ
- ์๋น์ค ๊ฐ ๋์จํ ๊ฒฐํฉ์ ์ํ ์ด๋ฒคํธ ๋ฐํ ๊ตฌ์กฐ ๊ตฌ์ฑ
AlarmMessage๊ตฌ์กฐ ์ ์ ๋ฐ ์๋ฆผ ์์คํ ์ฐ๋
- SSE ๊ธฐ๋ฐ ์ค์๊ฐ ์๋ฆผ ํ๋ฆ ๊ตฌ์ถ
- emitter ๋ฑ๋ก, ์ฐ๊ฒฐ ์ ์ง, ์ค๋ฅ ์ฒ๋ฆฌ ๋ฑ ์ธ๋ถ ํ๋ฆ ์ค๊ณ
- ๋ฉ์์ง ์์ ์ ์ ์ ๋ณ ์๋ฆผ push ํ๋ฆ ๊ตฌํ
- JWT + Redis ๊ธฐ๋ฐ ์ธ์ฆ ์ธํ๋ผ ๊ตฌ์ถ
-
3D ์ฐ์ฃผ ์๊ฐํ
- ์ผ๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ 3D ๋ณ ์ขํ ์๊ณ ๋ฆฌ์ฆ ๊ตฌํ
- ํด๋ฌ์คํฐ๋ง ๋ฐ ForceDirected ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์๋ณ ๋ณ ๋ฐฐ์น ์์น ์๋ ์์ฑ
- ์ฌ์ฉ์ ๊ฒฝํ์ ๊ณ ๋ คํ ์ขํ ์ฌ๋ฐฐ์น ๊ธฐ๋ฅ ์ถ๊ฐ
๐งฏ ํธ๋ฌ๋ธ์ํ ์ฃผ์ ์ฌ๋ก
- ํ ํฐ ํด์ ์ฒ๋ฆฌ ํ Redis key ํ์ธ ์ ๋ธ๋กํน ๋ฌธ์ ๋ฐ์
โMono.fromCallable+Schedulers.boundedElastic()๋ก ๋น๋๊ธฐ ์์ ์ฒ๋ฆฌ
- ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋๋ฝ๋๊ฑฐ๋ ๋ถ์๊ธฐ๊ฐ ๋ฌด์๋๋ ๋ฌธ์
โ
nori_tokenizer,ngram_filter,custom analyzer๋ก ์ง์ ํด๊ฒฐ
- ์๋ฆผ ๋ฉ์์ง๊ฐ Queue์ ๋๋ฌํ์ง ์์
โ Exchange์ RoutingKey ๋ฐ์ธ๋ฉ ๋๋ฝ ํ์ธ ํ
binding()์ง์ ๊ตฌ์ฑ
- ํด๋ผ์ด์ธํธ ๋ธ๋ผ์ฐ์ ๊ฐ ๋๊ฒจ๋ emitter๊ฐ ๊ณ์ ์ด์์๋ ๋ฌธ์
โ
onCompletion,onTimeout,onErrorํตํด emitter ์์ ์ ๊ฑฐ ๋ก์ง ๊ตฌํ
@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()๋ก ๋ฆฌํฉํ ๋งํ์ฌ ๊ฐ๋ ์ฑ ํฅ์
๐งฏ ํธ๋ฌ๋ธ์ํ
- ๋ฌธ์ : ๋ฐฉ๋ช ๋ก ์์ฑ์ ์ ๋ณด๋ฅผ ๋งค๋ฒ ๊ฐ๋ณ ์กฐํํ๋ฉฐ N+1 ๋ฌธ์ ๋ฐ์
- ํด๊ฒฐ:
writerSeq๋ฅผ ํ ๋ฒ์ ์์งํ๊ณ Bulk API๋ก ์ฌ์ฉ์ ์ ๋ณด ํ ๋ฒ์ ์กฐํ
- ๋ฌธ์ : TTL ๋ง๋ฃ ์์ ์ด ๋ช ํํ์ง ์์ ์ค์ผ์ค ๊ด๋ฆฌ ์ด๋ ค์
- ํด๊ฒฐ:
Spring Batch๊ธฐ๋ฐ ์ผ๊ด ์ญ์ ๋ฐฉ์์ผ๋ก ์ ํ
- ๋ฌธ์ : ๋์ผ
diarySeq์ ๋ํด ํด๋ชฝ์ด ์ค๋ณต ์์ฑ - ํด๊ฒฐ: ์กด์ฌ ์ ์์ , ์์ ๊ฒฝ์ฐ์๋ง ์๋ก ์์ฑ
- ๋ฌธ์ : ํํด์ ๊ตฌ๋ ํด์ ํ์ด๋ฐ์ด ๋ง์ง ์์
- ํด๊ฒฐ:
RabbitMQ์ด๋ฒคํธ ๊ธฐ๋ฐ ๋น๋๊ธฐ ํต์ ์ผ๋ก ์ ๋ขฐ์ฑ ํ๋ณด
-
Infra
- ๋ฐฐํฌ ์๋ฒ ์ธํ๋ผ ๊ตฌ์ถ
Prometheus์Grafana๋ฅผ ํ์ฉํ ๋ชจ๋ํฐ๋ง ์์คํ ๊ตฌ์ฑJenkins๊ธฐ๋ฐ CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ถDocker Compose๋ก ์๋น์ค ์ด์ ํ๊ฒฝ ์ ๋ฆฌ
-
Frontend
- ํ์ด์ ์ซ์ ๊ธฐ๋ฅ์์ ๋ณ์๋ฆฌ ์ ๋๋ฉ์ด์ ๊ตฌํ
- ๋ง์ดํ์ด์ง ํ์์ ๋ณด ์์ ๊ธฐ๋ฅ ๊ฐ๋ฐ
- ๋ง์ดํ์ด์ง ์์ด์ฝ ๊ด๋ จ ์ปค์คํ
ํจ์ ๊ฐ๋ฐ
(์์ด์ฝ ID ๋งคํ, ๋๋ค ์์ฑ ๋ก์ง, ํน๋ณ ์์ด์ฝ ํ๋ฅ ์ ์ฉ) - Redux๋ฅผ ํ์ฉํ ๋ชจ๋ฌ ์ํ ๊ด๋ฆฌ ์์คํ
๊ตฌํ
โ props ์์ด๋ ์์ ์ปดํฌ๋ํธ์์ ๋ถ๋ชจ์ ๋ชจ๋ฌ ์ ์ด ๊ฐ๋ฅ - ๊ฒ์ ๊ธฐ๋ฅ ๊ตฌํ ๋ฐ ๊ฒ์ ๊ฒฐ๊ณผ ์ํ ๊ด๋ฆฌ ์ต์ ํ
- ํ์ด๋ก ํ์ด์ง ๋์์ธ ๋ฐ ์ ์ฒด ๋ ์ด์์ ๊ตฌํ
- ํ์ด์ง ์ด๋ ์ CSS ๊ธฐ๋ฐ ์ ๋๋ฉ์ด์ ํจ๊ณผ ์ ์ฉ
- ๋ก๋ฉ ํ๋ฉด UI ๊ตฌํ
๐งฏ ํธ๋ฌ๋ธ์ํ
- ๋ฌธ์ : ์ฟ ๋ฒ๋คํฐ์ค ํ๊ฒฝ์์ IP ์ถฉ๋๋ก ์ธํ ๋ฐฐํฌ ๋ถ๊ฐ ๋ฌธ์ ๋ฐ์
- ํด๊ฒฐ:
Docker Compose๋ฅผ ์ฌ์ฉํ์ฌ ๋ก์ปฌ ๋คํธ์ํฌ ๊ธฐ๋ฐ์ผ๋ก ์ธํ๋ผ ์ฌ๊ตฌ์ถ
- ๋ฌธ์ : Gateway ์๋น์ค๊ฐ Docker์์ ๋น์ ์ ์ข ๋ฃ๋๋ ๋ฌธ์ ๋ฐ์
- ํด๊ฒฐ: Gateway ์ปจํ
์ด๋ ์คํ ์
sleep๋๊ธฐ ์๊ฐ์ ์ฃผ์ด ์์ฐจ ์คํ๋๋๋ก ์ฒ๋ฆฌ
- ๋ฌธ์ : ํ๋ก ํธ ์ปดํฌ๋ํธ๋ฅผ ์๊ฒ ์ชผ๊ฐ๋ค ๋ณด๋ props ์ ๋ฌ์ด ๋ณต์กํด์ง
- ํด๊ฒฐ: ์ ์ญ ์ํ ๊ด๋ฆฌ(Redux)๋ก props ์ฌ์ฉ ์ต์ํ ๋ฐ ์ ์ง๋ณด์์ฑ ํฅ์
- ๋ฌธ์ : ์์ ์ปดํฌ๋ํธ์์ ๋ฐ์ํ ์ด๋ฒคํธ๋ก ๋ถ๋ชจ์์ ๋ชจ๋ฌ ์ ์ด๊ฐ ์ด๋ ค์
- ํด๊ฒฐ: Redux๋ก ๋ชจ๋ฌ ์ํ๋ฅผ ์ค์ ์ง์ค์์ผ๋ก ๊ด๋ฆฌํ์ฌ ์์น์ ์๊ด์์ด ๋ชจ๋ฌ ์ ์ด ๊ฐ๋ฅ
- ๋ฌธ์ : ๊ฒ์์ฐฝ์์ ์ํ ๋ณํ ํ์๋ ์ฆ๊ฐ ๋ฐ์๋์ง ์์
- ํด๊ฒฐ:
useEffect์ ์์กด์ฑ ๋ฐฐ์ด์ ๊ฒ์ ์ํ๋ฅผ ์ถ๊ฐํ์ฌ ๊ฒ์์ฐฝ ๋ซ์ ์ ์๋ reload๋๋๋ก ์์
- Frontend
- ์ ์ฒด UI/UX ๋์์ธ ๋ฐ ๋ชฉ์ ์ ์ (Figma)
- ์ผ๊ธฐ ์์ฑ ๊ธฐ๋ฅ (CRUD) ๊ตฌํ
- Redux๋ฅผ ํ์ฉํ ์ ์ญ ์ํ ๊ด๋ฆฌ ๋ฐ API ์ฐ๋
- three.js ๊ธฐ๋ฐ ์ฐ์ฃผ ์๊ฐํ ๊ตฌํ
โ ์์ฑํ ์ผ๊ธฐ๊ฐ 3D ๋ณ๋ก ์๊ฐํ๋๋๋ก ์ฐ๋ ๋ฐ ์๊ฐ ํจ๊ณผ ๊ตฌํ - ๋ก๊ทธ์ธ / ๋ฐฉ๋ช
๋ก / ๊ฒ์ ํ์ด์ง ๋ฐ ๋ชจ๋ฌ
โ ์ผ๊ด๋ ์คํ์ผ ์ ์ง ๋ฐ ์ปดํฌ๋ํธ ์ ๋ฆฌ
๐งฏ ํธ๋ฌ๋ธ์ํ
- ๋ฌธ์ : mesh ์์๊ฐ ์กด์ฌํ๋ ์์น์์ ๋๋ธํด๋ฆญ ์ด๋ฒคํธ๊ฐ ์๋ํ์ง ์๊ณ , ํน์ ๊ฐ๋์์ ๋ณ์ด ๋ณด์ด์ง ์๋ ํ์ ๋ฐ์
- ์์ธ: mesh๊ฐ 3D ๊ณต๊ฐ ์์์ ๋ณ์ ๊ฐ๋ฆฌ๊ฑฐ๋ ์ด๋ฒคํธ๋ฅผ ๊ฐ๋ก์ฑ๊ณ ์์์
- ํด๊ฒฐ
- mesh ์์ ์ ๊ฑฐ
- ๋๋ธํด๋ฆญ ์ด๋ฒคํธ๋ฅผ HTML
<div>์์๋ก ์์ - ๋ณ ์์น๋ฅผ ๋๋ค ์์ฑ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝ
- ์ผ๊ธฐ ์์ฑ ํ ์นด๋ฉ๋ผ๊ฐ ํด๋น ์์น๋ก ์๋ ์ด๋ํ๋๋ก ๊ตฌํ
- ๋ฐ์ง์ ๋ฑ ์๊ฐ ํจ๊ณผ๋ก ์ฌ์ฉ์ ์ธ์ง์ฑ ๊ฐํ
<points>,<bufferGeometry>๋ฑ์ ์์๋ฅผ import ์์ด JSX๋ก ์ฌ์ฉํ๋ ๊ตฌ์กฐ์ ๋ํ ์ดํด ๋ถ์กฑ- React Three Fiber์์๋ Three.js ์์๋ฅผ JSX๋ก ์์์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
<Canvas>๋ด๋ถ์์ ์๋์ผ๋ก Three ๊ฐ์ฒด๋ก ๋ณํ๋จ์ ํ์ต
-
AI
- Text-to-Video
WangchanBERT-Wan2.1๊ธฐ๋ฐ ๋ชจ๋ธ์ ๋ํดLoRAํ์ธํ๋ ์คํ ์งํ FastAPI๊ธฐ๋ฐ AI ์๋ฒ ์ด๊ธฐ ๊ตฌ์ฑ ๋ฐ ๋ผ์ฐํ ์ค์
- Text-to-Video
-
Frontend
- ํ๋ก์ ํธ ์ด๊ธฐ
React๊ตฌ์กฐ ์ธํ axios์ธํฐ์ ํฐ ์ค์ ์ ํตํ ๊ณตํต ์๋ฌ ์ฒ๋ฆฌ ๋ฐ ์ธ์ฆ ํ ํฐ ์ ์ฉ- ํ์๊ฐ์ /๋ก๊ทธ์ธ API ์ฐ๋
- ๋๋ค ์ ์ ํ์ ํ์ด์ง API ์ฐ๋
- ๋ณ CRUD ๊ธฐ๋ฐ ๋ณ์๋ฆฌ ์ฐ๊ฒฐ ์ํ ๊ด๋ฆฌ
SSE๊ธฐ๋ฐ ์ค์๊ฐ ์๋ฆผ ํ์ ๊ตฌํ- ์๋ฆผ ์ํ์ ๋ฐ๋ฅธ ๋ฐ๋ก๊ฐ๊ธฐ ๊ธฐ๋ฅ ๊ตฌํ
redux-toolkit๊ธฐ๋ฐ ์ ์ญ ์ํ๊ด๋ฆฌ ๊ตฌ์กฐ ๋์ ๋ฐ ์ ์ฉ
- ํ๋ก์ ํธ ์ด๊ธฐ
๐งฏ ํธ๋ฌ๋ธ์ํ
- ๋ฌธ์ : ๊ธฐ์กด API ์์ฒญ์ด 401 ์๋ฌ ๋ฐ์ ์ ํ ํฐ ๊ฐฑ์ ์ ์ํด ์์ฒญ์ ์ฌ์๋ ํ๋ฉด์ 401 ๋ฌดํ ์๋ฌ ๋ฐ์
- ํด๊ฒฐ: ํ ํฐ ๊ฐฑ์ ์ ์ํด ๋๊ธฐ ์์ฒญ ํ๋ฅผ ํ์ฉํ๊ณ 401, 403 ๋ถ๊ธฐ๋ณ๋ก ๊ฐฑ์ ๋ฐ ์คํจ ๋ก์ง ๊ตฌ์
- ๋ฌธ์ : ํ๋ก ํธ ์ปดํฌ๋ํธ๋ฅผ ์๊ฒ ์ชผ๊ฐ๋ค ๋ณด๋ props ์ ๋ฌ์ด ๋ณต์กํด์ง
- ํด๊ฒฐ: ์ ์ญ ์ํ ๊ด๋ฆฌ(Redux)๋ก props ์ฌ์ฉ ์ต์ํ ๋ฐ ์ ์ง๋ณด์์ฑ ํฅ์
- ๋ฌธ์ : SSE ์ฐ๊ฒฐ ์ ํ์์์์ ๋ฏผ๊ฐํ๊ฒ ๋ฐ์ํ์ฌ ํ๊น ๋ฐ์
- ํด๊ฒฐ: ๋ฐฑ์๋์ ํํ ์คํธ, ํํธ๋นํธ๋ฅผ ์๋ก์๋ก interval ์ง์ ํ์ฌ ์ ํธ๋ฅผ ํ์ธ
- AI + Frontend
- ์ฌ์ฉ์ ํ ์คํธ ๊ธฐ๋ฐ AI ๊ฐ์ฑ ์์ ์์ฑ ๊ธฐ๋ฅ ๊ฐ๋ฐ
- FastAPI + LangChain ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ
โ ChatGPT ์์ฝ/ํค์๋ ์ถ์ถ โ Stable Diffusion ์ด๋ฏธ์ง ์์ฑ โ Gen-3 ์์ ์์ฑ - ๋ฐฉ๋ช ๋ก ๊ธฐ๋ฅ ๊ตฌํ ๋ฐ ํ๋ก ํธ ์ฐ๋ (์์ ์์ฑ + ํ์ด์ง๋ค์ด์ )
- ๊ฟ ๋์๋ณด๋ UI ๋ฐ ๊ฐ์ ๋ถ์ ๊ธฐ๋ฐ ์๊ฐํ ๊ธฐ๋ฅ ๊ฐ๋ฐ
- ๊ฐ์ ๊ฒฐ๊ณผ ๊ธฐ๋ฐ ๋ฐฐ๊ฒฝ์์ ์ถ์ฒ ๋ฐ ์ฌ์ ๋ก์ง ๊ตฌํ
๐ ํ์ด์ง๋ณ ์ฃผ์ ๊ธฐ๋ฅ
- ์ฌ์ฉ์๊ฐ ์์ฑํ ์ผ๊ธฐ ํ ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ฑ ์์ ์์ฑ
- FastAPI ์๋ฒ์์ LangChain ๊ธฐ๋ฐ AI ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ:
ChatGPTโ ํ ์คํธ ์์ฝ + ํค์๋ ์ถ์ถStable Diffusion 3.5โ ์ด๋ฏธ์ง ์์ฑGen-3โ ์์ ์์ฑ
- ๊ฒฐ๊ณผ ์์์ ๋ชจ๋ฌ์์ ๋ฐ๋ก ์ฌ์ํ์ฌ ์ฌ์ฉ์ ๋ชฐ์ ๊ฐ ๊ฐํ
- 2์ฃผ/1๊ฐ์๊ฐ ์์ฑํ ์ผ๊ธฐ๋ฅผ ๊ฐ์ ๋ณ๋ก ๋ถ๋ฅ ๋ฐ ์๊ฐํ
- ๊ฐ์ฅ ๋์ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ์ถ์ฒ
- ์ฌ์ฉ์๊ฐ ๋ฐฐ๊ฒฝ์์ ์ ์ ํํ๋ฉด ์๋ ์ฌ์ ๋ก์ง ์ฒ๋ฆฌ
- ์ฌ์ฉ์๊ฐ ์์ ๋กญ๊ฒ ๋ฉ์์ง๋ฅผ ๋จ๊ธธ ์ ์๋ ๋ฐฉ๋ช ๋ก ๊ธฐ๋ฅ
- ํ์ด์ง๋ค์ด์ ์ ์ฉ์ผ๋ก ๋ง์ ๋ฉ์์ง์๋ ๊น๋ํ UI ์ ์ง
- ์ ์ฒด ๊ฐ๋ฐ ๊ธฐ๊ฐ : 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 ์ฐ๋์ผ๋ก ๋น๋ ๊ฒฐ๊ณผ ์ค์๊ฐ ๊ณต์
-
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 ์ ์ฉ ๋ฐ ๋ณด์ ์ค์ ์๋ฃ
| ํ์ด๋ก ํ์ด์ง |
|---|
![]() |
| ๋ก๊ทธ์ธ/ ํ์๊ฐ์ ํ์ด์ง |
|---|
![]() |
| ๋ฉ์ธ ๋ณ์๋ฆฌ ํ์ด์ง |
|---|
![]() |
| ์ผ๊ธฐ์์ฑ์๋ฃ ์๋ฆผ |
|---|
![]() |
| ์ผ๊ธฐ AI์์, ๊ฟ์ผ๊ธฐ, ๊ฟ ํด๋ชฝ ๋ณด๊ธฐ |
|---|
![]() |
| ์ผ๊ธฐ ์์ฑํ๊ธฐ |
|---|
![]() |
| ์ฐ์ฃผ์ ํ์ด์ง ์ด๋ |
|---|
![]() |
| ๊ฟ ๋์๋ณด๋ ํ์ด์ง |
|---|
![]() |
| ํ์ด๋ฒํธ ๋ฝ๊ธฐ ํ์ด์ง |
|---|
![]() |
| ์ค๋์ ์ด์ธ ํ์ด์ง |
|---|
![]() |
| ๋ฐฉ๋ช ๋ก ๋ชจ๋ฌ |
|---|
![]() |
| ์ ์ ๊ฒ์ ๋ชจ๋ฌ |
|---|
![]() |
| ์ผ๊ธฐ๊ฒ์ ๋ชจ๋ฌ |
|---|
![]() |
| ๋ธ๋ํ ํ์ด์ง |
|---|
![]() |
| ํ์ ์๊ฐ |
|---|
![]() |
















