๐ ๋ฐฐํฌ ์ฃผ์ : ahwlsqja.store
๐ฅ ์์ ๋ก๊ทธ : Notion
๐ ํ ๋ธ๋ก์ : Brochure
๋ชฉ์ฐจ
2. ๐ERD
- ํ๋ก์ ํธ๋ช : ๊ตญ๋ฏผ ์ฐธ์ฌ ์ฌํ
- ๊ธฐ๊ฐ : 2024๋ 3์ 25์ผ ~ 2024๋ 5์ 1์ผ
- ์ฃผ์ : ๊ทน์ ๋ฌด๋ํ ๋ฒ์ฃ์๋ค์ ํ๊ฒฐ์ ์ค์๊ฐ ํฌํ๋ก ์ ํ๊ณ , Ai๋ฅผ ํตํด ํ๋ก๋ฅผ ๊ฐ์ ธ์์ ์ฃ์ง์ ๋ํ ํ๋์ ๊ตญ๋ฏผ๋ผ๋ฆฌ ํฌํํด๋ณด๊ณ , ์ ๋จธ ํน์ ์ ์น์ ์ด์ผ๊ธฐ๋ฅผ ์ฌ๋ฏธ์๊ฒ ํ ๋ก ํ๋ ์น์ฌ์ดํธ์ ๋๋ค. (๋งฅ๊ทธ๋ฆฌ๊ฑฐ vs ํ ๋จธ๋ 500๋ช ๋งจ์์ผ๋ก ์ผ์ด์ง์์) , (์ ์๋ฏผ vs ๊น์ฌ์ฐ ์ฝ๋ฉ ๋๊ฒฐํ๋ฉด ๋๊ฐ ์ด๊ธฐ๋ )
- ์ฃผ์๊ธฐ๋ฅ :
Web-Socket์ ํตํ ์ค์๊ฐ ์ฐฌ๋ฐํฌํ
https://drawsql.app/teams/kim-14/diagrams/3-erd
๊ธฐ์ ์ ์์ฌ ๊ฒฐ์
์๊ตฌ์ฌํญ | ๊ณ ๋ฏผ ๊ธฐ์ | ์ฌ์ฉ ์ด์ |
---|---|---|
๋์์ฑ ์ฒ๋ฆฌ | ์ ํํ ๊ธฐ์ : Bull Queue ์ ํ์ง : Pessimistic Lock Bull Queue Apache Kafka |
Bull Queue ๋น๋๊ธฐ์ ์ผ๋ก ์์
๋ค์ Queue์ ์ถ๊ฐํ์ฌ ์์ปค๋ฅผ ํตํด ๋์์ฑ์ ์ ์ด ํ ์ ์์. ํฌํ ์๋ฅผ ์ ๋ฐ์ดํธํ ๋ ๋น๊ด์ ๋ฝ์ ์ฌ์ฉํ์ฌ ๋์์ฑ์ ๊ด๋ฆฌํ๊ฒ ๋จ, ์ผ๊ด์ฑ์ ํ์คํ๊ฒ ๋ณด์ฅ ๋๋, ๋ถํ๊ฐ ๋์ ์ํ์ผ ๊ฒฝ์ฐ Race Condition์ด๋ DeadLock์ด ์ฝ๊ฒ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ, ๋น๋๊ธฐ์ ์ผ๋ก ์์ ์ ์ถ๊ฐํ๊ณ ์์ฒญ์ FIFO๋ก ์ฒ๋ฆฌํ๋ Bull Queue๋ฅผ ์ ํํ๊ฒ ๋จ. MSA์ ๊ฒฝ์ฐ Kafka๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ผ๋, ํ์ฌ ํ๋ก์ ํธ์ ๋จ๊ณ์์๋ ๋น์ฅ ํฌํ ์ ๊ด๋ฆฌ์ ์์ด, ๋ฉ์์ง ๋ธ๋ก์ปค๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ Bull Queue๋ฅผ ์ ํ |
์ฑ๋ฅ ํ ์คํธ | ์ ํํ ๊ธฐ์ : Artillery ์ ํ์ง : Artillery Apache JMeter K6 |
์คํฌ๋ฆฝํธ ์์ฑ ๋ฐ ๊ด๋ฆฌ๋ฅผ ํ
์คํธ ์คํฌ๋ฆฝํธ๋ฅผ yaml ํ์ผ์ ์ฌ์ฉํด์ ๊ฐ๋จํ๊ฒ ์์ฑํ ์ ์์ผ๋ฉฐ, socket.io ์์ง ํ ์คํธ ๊ฐ๋ฅ. CICD ์๋ํ ๊ฐ๋ฅ. ๋น ๋ฅด๊ณ ๊ฐ๋ฒผ์. (์ ์ฒด์ ์ผ๋ก ํ๋ก์ ํธ๊ฐ ๋ฌด๊ฑฐ์) cloud๋ฅผ ํตํด ๋ณด๊ณ ์๋ฅผ ๊ทธ๋ํ ๋ฑ ์๊ฐ์ ์ผ๋ก ํ์ธ ๊ฐ๋ฅ. |
๋ก๊น
๋ชจ๋ํฐ๋ง |
์ ํํ ๊ธฐ์ : Filebeat + ELK ์ ํ์ง Filebeat + ELK EFK (Elasticsearch + Fluentd + Kibana) PLG (Promtail + Loki + Grafana) |
์ปค์คํฐ๋ง์ด์ง์ด ์์ ๋ก์ด ๋ก๊น
๋ผ์ด๋ธ๋ฌ๋ฆฌ winston์ ์ฌ์ฉํ์ฌ ์ ์ฅ๋ ๋ก๊ทธ๋ฅผ Filebeat๊ฐ ์ ๋ดํจ์ผ๋ก์จ logstash์ ๋ถํ๋ฅผ ์ต์ํํ๊ณ , ์์ง๋ Log๋ฅผ ์๊ฐํํจ์ผ๋ก์จ ๊ฐ๋ฐ์๊ฐ ํจ๊ณผ์ ์ผ๋ก ์น์ฌ์ดํธ๋ฅผ ์ง๋จํ๊ณ ํ๋จํ๋๋ฐ ์ฉ์ดํจ Kibana์ ๊ฐ๋ ฅํ ๋ก๊ทธ ๋ถ์ ๊ธฐ๋ฅ์ ํตํด ๊ด๋ฆฌ์๊ฐ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฅผ ์๊ฐํํ๊ณ ๋ก๊ทธ๋ฅผ ๋ถ์ํ ์ ์๊ฒ๋ ํจ ๋น๊ต์ ๊ฐ๋ฒผ์ด PLG๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ์ผ๋, ๊ฒ์ ๊ธฐ๋ฅ ๋ํ Elasticsearch์ ์ธ๋ฑ์ฑ ๊ธฐ๋ฅ์ ์ฌ์ฉํจ์ผ๋ก์จ ์ฐ๋ํ์ฌ ์ฌ์ฉํ ์ ์๋ ELK๋ฅผ ์ ํ |
DB | ์ ํํ ๊ธฐ์ : PostgreSQL MongoDB ์ ํ์ง: MySQL PostgreSQL MongoDB |
PostgreSQL ์๋์ ์ผ๋ก ์ฐ๊ธฐ ์์ ์์ ๋์ ์ฑ๋ฅ์ ๋ณด์ด๋ PostgreSQL๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ํฌํ, ์กฐํ์, ์ข์์ ๊ธฐ๋ฅ์ ์ ๋ฐ์ดํธ๋ฅผ ์ข ๋ ํจ์จ์ ์ผ๋ก ์์ ํ๊ธฐ ์ฉ์ดํจ ๋ณต์ ์ ์์ด์ ์๋๊ฐ ์ข ๋ ๋น ๋ฅธ ๋น๋๊ธฐ์ ๋ณต์ ๋ฅผ ํตํ์ฌ ๊ณ ๊ฐ์ฉ์ฑ์ ๋ํ๊ณ , ๊ฒ์ํ์ด ๋ง์ ์น์ฌ์ดํธ ํน์ฑ์ ๊ด๊ณํ DBMS๊ฐ ์ ํฉํ๋ค๊ณ ํ๋จ ์ฐจํ NoSQL๊ณผ ๊ฐ์ ํค-๊ฐ ํํ์ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ MySQL๋์ PostgreSQL์ ํตํ ๋ฐ์ดํฐ ์ ์ฅ์ด ์ํํ ๊ฐ๋ฅํ ๊ฑฐ๋ผ๊ณ ํ๋จ๋จ MongoDB ๋ํ์ ์ธ Nosql๋ก์จ ์ ๊ทผํ๊ธฐ๊ฐ ์ฝ๊ณ ์ฑํ ์ ์ ์ฅํจ์ ์์ด์ Postgresql๋ณด๋ค ๋น ๋ฅผ๊ฑฐ๋ผ๊ณ ํ๋จํ๊ณ ์ฌ์ฉํ๊ฒ ๋จ |
ChatBot | ์ ํํ ๊ธฐ์ : SentenceTransformer ์ ํ์ง: gpt 3.5 api lamma2 ko |
GPT 3.5 API์ Google Gemma๋ฅผ ํตํ fine-tuning ์์
์ ์งํํ์์๋ ๋ถ๊ตฌํ๊ณ , ๋ฒ๋ฅ ๋ถ์ผ์ ๋๋ฉ์ธ ์ง์์ด ๋ถ์ฌํ ์ํ์์ ํ๋ก ๋ฐ์ดํฐ์ ์ค์์ฑ์ ํ์ ํ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช์์ต๋๋ค. ์ฆ, ๋ฒ๋ฅ ๋๋ฉ์ธ ํน์ฑ์ ๋ฒ๋ฅ ์ฉ์ด๊ฐ ๊ฐ๋ ๋ฒ์ ํด์์ ์ธ์ด ๋ชจ๋ธ์ด ์ํํ๋ ๋ฐ ํ๊ณ๊ฐ ์์์ ์๋ฏธํฉ๋๋ค. ๋ํ, ์ฌ์ฉ์๋ก์ ์ง์ ํ๋กฌํํธ๋ฅผ ์ค์ ํ์ฌ ๋ฒ๋ฅ ํด์์ ์๊ตฌํ๋ ๊ฒ ์ญ์ ํจ๊ณผ์ ์ด์ง ์๋ค๋ ๋ฌธ์ ์ ์ ์ง๋ฉดํ์ต๋๋ค. ์ด๋ฌํ ์ํฉ์ ๋ฒ๋ฅ ๋จ์ด์ ๋ฌธ๊ตฌ๊ฐ ๊ฐ๋ ๋ณต์ก์ฑ๊ณผ ํน์์ฑ ๋๋ฌธ์, ์ ๋ฌธ์ ์ธ ๋ฒ๋ฅ ์ง์ ์์ด๋ ์ธ์ด ๋ชจ๋ธ์ ํตํ ์ ํํ ๋ฒ๋ฅ ํด์์ด๋ ํ๋ก ๋ถ์์ ํ๊ณ๊ฐ ์์์ ๋งํฉ๋๋ค. |
์ฑํ ์ํคํ ์ณ | ์ ํํ ๊ธฐ์ : Redis ์ ํ์ง: Apache Kafka Redis |
๊ตฌํ์ ๋ณต์ก์ฑ์ด ๋ฎ๊ณ ์ด๋ฏธ ๋ค์ํ๊ฒ ๋ ๋์ค์ ์ฌ์ฉ์ ๊ตฌ์ํ ์ํ์์ ์ ์ฉํ๊ธฐ ๊ฐ ์ข์๊ณ , Pub/Sub์ ์ด์ฉํด์ ์ค์๊ฐ ์๋ฆผ๊ณผ ๋ฉ์์ง์ ์ ๊ทผ์ด ์ข์์ ์ ํํ๊ฒ ๋์์ต๋๋ค. Redis ๋ฉ๋ชจ๋ฆฌ ๋ด ๋ฐ์ดํฐ ์ ์ฅ์์ ๋๋ค. ๋น ๋ฅธ ๋ฐ์ดํฐ ์ก์ธ์ค์ ๊ฐ๋จํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ณตํฉ๋๋ค. Redis์ ํผ๋ธ๋ฆฌ์/์๋ธ์คํฌ๋ผ์ด๋ธ(pub/sub) ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ์ค์๊ฐ์ผ๋ก ๋ฉ์์ง๋ฅผ ๊ตํํ๊ณ ๊ฐ ์ฑํ ๋ฃธ์ ์ฑ๋๋ก ๊ตฌ์ฑํ๊ณ , ์ฌ์ฉ์๋ค์ด ํด๋น ์ฑ๋์ ๊ตฌ๋ ํ๊ฒ ํจ์ผ๋ก์จ ์๋ฆผ๊ณผ ๋ฉ์์ง๋ฅผ ์ค์๊ฐ์ผ๋ก ๋ฐ์๋ณผ ์ ์์ต๋๋ค. |
์ฑํ | ์ ํํ ๊ธฐ์ : Socket.io ์ ํ์ง: Socket.io WebSocket |
์ฌ๋ฌ ๊ณณ์์ ํ ๋ก ์ ํ ์ ์๋๋ก ์น์ฌ์ดํธ๋ฅผ ๊ณํํ์๊ณ , ํนํ ๋ฃธ(room) ๊ธฐ๋ฅ์ ํตํ ๊ณ ๋ํ๋ฅผ ์ผ๋์ ๋์์ต๋๋ค. ๊ณ ๊ฐ์ฉ์ฑ์ ํจ๊ป ๊ณ ๋ คํ๋ฉด์ Socket.io๋ฅผ ์ ํํ์์ต๋๋ค. Socket.io ์น ์์ผ ๊ธฐ์ ์ ํ์ฉํ๋ Node.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์๋ฐฉํฅ ํต์ ์ ์ง์ํฉ๋๋ค. ์ฐ๊ฒฐ์ด ๋๊ธธ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ฌ์ฐ๊ฒฐ์ ์๋ํ๊ธฐ ๋๋ฌธ์ ๊ณ ๊ฐ์ฉ์ฑ ์ธก๋ฉด์์ ์ ๋ฆฌํฉ๋๋ค. ๋ฃธ ๊ธฐ๋ฅ์ ๊ตฌํ ๋ณต์ก์ฑ์ด ๋ฎ์, ์ฑํ ๊ธฐ๋ฅ ํ์ฅ์ ์์ด ์ ๋ฆฌํ ์ ์ด ๋ง์ต๋๋ค. ๋ชจ๋ ์น ๋ธ๋ผ์ฐ์ ์์ ํธํ์ฑ์ด ์ข์, ์ค๋๋ ๋ธ๋ผ์ฐ์ ์์๋ ๋ฌธ์ ์์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ HTML5 ์ด์ ๋ฒ์ ์์๋ ์น์์ผ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋๋ค. |
ํฌํ | ์ ํํ ๊ธฐ์ : Socket.io ์ ํ์ง: Socket.io Polling |
์ ํฌ๊ฐ ๊ตฌํํ๊ณ ์ ํ๋ ํฌํ ์์คํ
์ ์ค์๊ฐ์ผ๋ก ๋ณํํ๋ ํฌํ ํํฉ์ ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค์ผํจ. ์ด๋ฅผ ์ํด ์ผ์ ์๊ฐ๋ง๋ค ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๋ Polling ๋ฐฉ์์ ์ ํฉํ์ง ์๋ค๊ณ ํ๋จ๋์์ต๋๋ค. ๋ํ, ์ฌ๋ฌ ๊ณณ์์ ํฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ๋ง์ Polling ์์ฒญ์ด ์๋ฒ์ ๊ณผ๋ถํ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ๊ณ ์ฑ๋ฅ ์ค์๊ฐ ํต์ ์ ์ ๊ณตํ๋ Socket.io๋ฅผ ์ ํํ๊ฒ ๋์์ต๋๋ค. Socket.io ์น ์์ผ ๊ธฐ์ ์ ํ์ฉํ๋ Node.js ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์๋ฐฉํฅ ํต์ ์ ์ง์ํฉ๋๋ค. ์ฐ๊ฒฐ์ด ๋๊ธธ ๊ฒฝ์ฐ ์๋์ผ๋ก ์ฌ์ฐ๊ฒฐ์ ์๋ํ๊ธฐ ๋๋ฌธ์ ๊ณ ๊ฐ์ฉ์ฑ ์ธก๋ฉด์์ ์ ๋ฆฌ ๋ฃธ ๊ธฐ๋ฅ์ ๊ตฌํ ๋ณต์ก์ฑ์ด ๋ฎ์, ์ฑํ ๊ธฐ๋ฅ ํ์ฅ์ ์์ด ์ ๋ฆฌํ ์ ์ด ๋ง์ต๋๋ค. ๋ชจ๋ ์น ๋ธ๋ผ์ฐ์ ์์ ํธํ์ฑ์ด ์ข์, ์ค๋๋ ๋ธ๋ผ์ฐ์ ์์๋ ๋ฌธ์ ์์ด ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ HTML5 ์ด์ ๋ฒ์ ์์๋ ์น์์ผ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๋๋ค. |
์๋ฆผ | ์ ํํ ๊ธฐ์ : FCM ์ ํํ ์ด์ : Socket.io+Redis FCM WebPush |
์ค์๊ฐ์ผ๋ก ํซํ ํฌํ๋ฅผ ์๋ ค์ค์ผ ํ๊ธฐ์ ์ค์๊ฐ ํฌํ์ ์ ํฉํ ๊ธฐ์ ๋ค์ ์ฐพ์๋ณด์๊ณ ๊ทธ ์ค ์ต์ ํ๊ฐ ์ ์ผ ์ ๋๊ณ , ์ค์๊ฐ๊ณผ ๊ทผ์ ํ FCM์ ์ ํํจ |
๋ถ๋ฅ | ๊ธฐ์ | ๋ถ๋ฅ | ๊ธฐ์ |
---|---|---|---|
Runtime | Node.js | Language | TypeScript |
Framework | Nest.js | DB | PostgreSQL(AWS RDS), Redis,MongoDB |
Deployment | Aws Ecs | Test | Jest, Supertest, Artillery |
์ฑํ ,ํฌํ | socket.io | ๋ก๊น | Filebeat + ELK |
์๋ฆผ | FCM | ChatBot | SentenceTransformer |
Position | Name | Github | Tech Blog |
---|---|---|---|
Backend | ๊น์ฌ์ฐ | APD-Kim | https://velog.io/@lol0620/posts |
Backend | ๊น์ฑ๋ฏผ | kimsungmin2 | https://velog.io/@anrl8913/posts |
Backend | ๋ชจ์ง์ | ahwlsqja | https://velog.io/@bubblegum95 |
Backend | ํฉ์ธ๋ฏผ | bubblegum95 | https://velog.io/@bubblegum95 |
Backend | ๋ฐ์ฌํ | jaecoder222 | https://dev-jacoder222.tistory.com/ |
Commit Convention ํผ์ณ๋ณด๊ธฐ
โ ์ ๋ชฉ์ ์ต๋ 30๊ธ์์ดํ๋ก ์์ฑ: ex) feat: Add Key mapping
โ ๋ณธ๋ฌธ์ ์๋์ ์์ฑ
--- <ํ์ > ๋ฆฌ์คํธ ---
feat : ๊ธฐ๋ฅ (์๋ก์ด ๊ธฐ๋ฅ)
fix : ๋ฒ๊ทธ (๋ฒ๊ทธ ์์ )
refactor : ๋ฆฌํฉํ ๋ง
design : CSS ๋ฑ ์ฌ์ฉ์ UI ๋์์ธ ๋ณ๊ฒฝ
comment : ํ์ํ ์ฃผ์ ์ถ๊ฐ ๋ฐ ๋ณ๊ฒฝ
style : ์คํ์ผ (์ฝ๋ ํ์, ์ธ๋ฏธ์ฝ๋ก ์ถ๊ฐ: ๋น์ฆ๋์ค ๋ก์ง์ ๋ณ๊ฒฝ ์์)
docs : ๋ฌธ์ ์์ (๋ฌธ์ ์ถ๊ฐ, ์์ , ์ญ์ , README)
test : ํ
์คํธ (ํ
์คํธ ์ฝ๋ ์ถ๊ฐ, ์์ , ์ญ์ : ๋น์ฆ๋์ค ๋ก์ง์ ๋ณ๊ฒฝ ์์)
chore : ๊ธฐํ ๋ณ๊ฒฝ์ฌํญ (๋น๋ ์คํฌ๋ฆฝํธ ์์ , assets, ํจํค์ง ๋งค๋์ ๋ฑ)
init : ์ด๊ธฐ ์์ฑ
rename : ํ์ผ ํน์ ํด๋๋ช
์ ์์ ํ๊ฑฐ๋ ์ฎ๊ธฐ๋ ์์
๋ง ํ ๊ฒฝ์ฐ
remove : ํ์ผ์ ์ญ์ ํ๋ ์์
๋ง ์ํํ ๊ฒฝ์ฐ
--- <๊ผฌ๋ฆฌ๋ง> ํ์์๋ ์ต์ ---
Fixes : ์ด์ ์์ ์ค (์์ง ํด๊ฒฐ๋์ง ์์ ๊ฒฝ์ฐ)
Resolves : ์ด์ ํด๊ฒฐํ์ ๋ ์ฌ์ฉ
Ref : ์ฐธ๊ณ ํ ์ด์๊ฐ ์์ ๋ ์ฌ์ฉ
Related to : ํด๋น ์ปค๋ฐ์ ๊ด๋ จ๋ ์ด์๋ฒํธ (์์ง ํด๊ฒฐ๋์ง ์์ ๊ฒฝ์ฐ)
ex) Fixes: #47 Related to: #32, #21
Code Convention ํผ์ณ๋ณด๊ธฐ
--- Prettier & Eslint ์๋ ์ ์ฉ ---
singleQuote: true โ ์์ ๋ฐ์ดํ(') ์ฌ์ฉ
trailingComma: "all" โ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ ๋ง์ง๋ง ์์ ๋ค์ ํญ์ ์ผํ(,) ์ถ๊ฐ
tabWidth: 2 โ ๋ค์ฌ์ฐ๊ธฐ ํญ์ ๋๋น 2
semi: true โ ๋ฌธ์ฅ์ ๋์ ํญ์ ์ธ๋ฏธ์ฝ๋ก (;) ์ถ๊ฐ
arrowParens: "always" โ ํ์ดํ ํจ์ ๋งค๊ฐ๋ณ์์ ํญ์ ๊ดํธ(ex, (param)=>expression) ์ถ๊ฐ
endOfLine: "auto" โ ์๋์ผ๋ก ํ ์ข
๊ฒฐ ๋ฌธ์๋ฅผ ์ ํํ๋๋ก ์ค์ (์ค ๋ฐ๊ฟ ๋ฌธ์(\n)โ์ค ๋ฐ๊ฟ ๋ฌธ์(\r\n))
Nest is MIT licensed.