ν°λ(Tikkle) μ μκ°μ΄λΌλ μ¬νλ₯Ό νμ©νμ¬ λ¨μ²΄λ νμ¬ κ΅¬μ±μλ€μ΄ μνΈ κ°μ λμμ μ£Όκ³ λ°μ μ μλ νλ«νΌμ λλ€. μ΄ νλ«νΌμ ν΅ν΄ μ¬μ©μλ μμ μ μκ°μ ν¬μνμ¬ λ€λ₯Έ μ¬λμκ² λμμ μ£Όκ³ , κ·Έμ λν 보μμΌλ‘ μκ°μ μ»μ΄ λ€μ νμν λμμ λ°μ μ μμ΅λλ€.
- λ°°ν¬ URL : https://j11a501.p.ssafy.io
- Test ID :
test1_a501
/test2_a501
- Test PW :
HY2Pq2oZlZ2w6ZcSdBLVCkWu
μ£Όμ κΈ°λ₯
- μκ°(μ¬ν)μ κΈ°λ°ν΄ κ²μκΈλ‘ νΉμ λμμ μμ²νκ³ κ±°λ
- λνΉ μμ€ν λ° λνΉμ κΈ°λ°ν 리μλ μ€μ κΈ°λ₯ μ 곡
- μκ°(μ¬ν)-λνΉ ν¬μΈνΈ κ° νμ¨ κΈ°λ₯
κΉμ±μ€ (FE, BE) | μμμ€ (νμ₯, BE, Infra) | μ μν (FE) | μ΄κ·λΉ (BE) | νλ€μ (FE, Design) | νλλ―Ό (BE) |
---|---|---|---|---|---|
@seongY0-0n | @glenn-syj | @clare-u | @Lee9Bin | @celestedayoung | @hurdong |
- Front-end : Next.js, Tailwind, Typescript, Tanstack Query, Zustand
- Back-end : Spring Boot, MariaDB, Redis, Kafka, MongoDB
- λ²μ λ° μ΄μκ΄λ¦¬ : Gitlab, Jira
- νμ ν΄ : Notion, Mattermost
- μλΉμ€ λ°°ν¬ νκ²½ : AWS EC2, Docker, Jenkins, NginX
- λμμΈ : Figma
- κ°λ°κΈ°κ° : 24.08.26 ~24.10.11 (7μ£Ό)
- Next.js
- λλΆλΆμ νμ΄μ§λ₯Ό static pageλ‘ κ΅¬μ±νμ¬ CSRμ΄ μλ SSRμ νμ©ν΄ μ¬μ©μμκ² λΉ λ₯΄κ² μ 보 μ λ¬
- Tailwind
- CSS νμΌμ λ³λλ‘ μμ±νμ§ μκ³ μ¦κ°μ μΌλ‘ μ€νμΌλ§μ΄ κ°λ₯
tailwind.config.ts
νμΌμ ν΅ν΄ 컀μ€ν μ€νμΌμ μ€μ νμ¬ νμ κ° μΌκ΄λ UI/UX ꡬν
- Typescript
- μμ νκ³ μ νν API ν΅μ μ μν Type μ§μ λ° μ»€μ€ν API handlerλ‘ ν¨μ¨μ μΈ HTTP ν΅μ
- Tanstack Query
- λΉλκΈ° λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ μΊμ±, λκΈ°ν, κ°±μ ν μ μλλ‘ μ¬μ©
- 리μ‘νΈ ν μ ν΅ν΄ μν κ΄λ¦¬κ° μμ°μ€λ½κ² ν΅ν©λλ©°, λΉλκΈ° λ°μ΄ν°μ κ΄λ ¨λ 볡μ‘ν λ‘μ§μ κ°κ²°νκ² μμ± κ°λ₯
- Zustand
- λΆνμν props drillingμ νΌνκ³ , νμν μ»΄ν¬λνΈ λ΄λΆμμλ§ μν κ°μ κ°μ Έλ€ μ¬μ©νκΈ° μν΄ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬ μ¬μ©
- Reduxμ λΉν΄ μν κ΄λ¦¬μ νμν 보μΌλ¬νλ μ΄νΈ μ½λκ° μ κ³ , λ¨μν μ€μ λ§μΌλ‘λ μ ν리μΌμ΄μ μ μν κ΄λ¦¬λ₯Ό μ½κ² ꡬν κ°λ₯
- Spring Boot
- MariaDB
- Redis
- Kafka
- MongoDB
- AWS EC2
- Docker
- Jenkins
- NginX
- Github Flow: 7μ£Ό κΈ°κ°μ νΈν‘μΌλ‘ μμ νλ©° μΌμ μ λ§μ§λ§ μ£Όμ°¨μ λ°°ν¬κ° μ΄λ£¨μ΄μ§κΈ° λλ¬Έμ μ±ν
FE
- κ³΅κ³ νμ΄μ§: κ³΅κ³ κ²μκΈ°λ₯, κ³΅κ³ μΉ΄ν κ³ λ¦¬ λΆλ₯, νμ΄μ§λ€μ΄μ , κ³΅κ³ μμ± νμ΄μ§, κ³΅κ³ μμ λ° μμ κΈ°λ₯
- λ‘κ·ΈμΈ νμ΄μ§: mattermost λ‘κ·ΈμΈ, λ‘κ·Έμμ κΈ°λ₯, zustandλ‘ λ©€λ² μ 보 μνκ΄λ¦¬
- λ©μΈ νμ΄μ§: λ μ΄μμ λ§ν¬μ
BE
- κ³΅κ³ : κ³΅κ³ CRUD RESTapi
BE
- Spring Security: JWT + mattermost OAuth2 νμ κ΄λ¦¬
- Redisλ₯Ό νμ©ν Refresh Token Rotation ꡬν
- μ±ν / νμ / 리뷰 / μ½μ κΈ°λ₯ λλ²κΉ λ° κ°μ μ°Έμ¬
- κ³΅ν΅ μμΈ ν΄λμ€, μλ¬ μ½λ λ° νΈλ€λ¬ μμ±
Infra
- Jenkins CI/CDλ₯Ό ν΅ν ν΅ν© λ° λ°°ν¬ μλν (Jenkins Pipeline)
- Gitlab-Jenkins μ°λ
- Docker-compose νμΌ λ° spring boot application νμΌ μμ±
- NginX λ± EC2 μΈμ€ν΄μ€ λ΄ λ³΄μ μ²λ¦¬
- λ΄λΉ νμ΄μ§: ν€λ(λ€λΉκ²μ΄μ ), μ±ν , λνΉ, νμ
- μ±ν κΈ°λ₯, μ½μ κΈ°λ₯, 리뷰 κΈ°λ₯, λνΉ κΈ°λ₯, νμ κΈ°λ₯ μ°λ
- κ²μκΈμ λν΄ λ§ν¬λ€μ΄ μ μ©μ΄ κ°λ₯ν μλν°μ λ·°μ΄ μ μ©, νμ¨ μ°¨νΈ d3 λΌμ΄λΈλ¬λ¦¬λ₯Ό ν΅ν΄ μ μ©
- Redis μΊμλ₯Ό νμ©ν λνΉ κ΅¬ν
- μ체 νμ¨ λ° μ€μΌμ€λ¬ ꡬν
- νμ κΈ°λ₯ ꡬν
- λ°μ΄ν°λ² μ΄μ€ νλ‘μμ ꡬν
- λμμΈ λ° λμμΈ μμ€ν μ€κ³
- TypeScript & Axios 컀μ€ν Handler μμ±
- λ΄λΉ νμ΄μ§: λ©μΈ, λ§μ΄νμ΄μ§
- Kafkaμ STOMPλ₯Ό νμ©ν μ€μκ° 1λ1 μ±ν λ°© μλ² κ΅¬ν
- MongoDB λ₯Ό νμ©νμ¬ μ±ν λ΄μμ μ μ₯ κ΄λ¦¬
- μ±ν λ°© λλ©μΈ κΈ°λ₯ / μ½μ λλ©μΈ κΈ°λ₯ / κ²μκΈ μΌλΆ κΈ°λ₯ / 리뷰 μΌλΆ κΈ°λ₯ ꡬν
/
λλ© νμ΄μ§
μλ λ‘κ³ μ νλ«νΌμ λν κ°λ¨ν μ€λͺ μ΄ ν¬ν¨λμ΄ μμ΅λλ€.- λ‘κ·ΈμΈ κΈ°λ₯: μ¬μ©μλ
Mattermost OAuth
λ₯Ό ν΅ν΄ λ‘κ·ΈμΈ ν μ μμ΅λλ€. - μλΉμ€ μκ°: μ€ν¬λ‘€μ λ΄λ¦¬λ©΄ μλΉμ€μ λν μκ° μ΄λ―Έμ§μ μλ΄ λ¬Έκ΅¬κ° μμ΅λλ€.
/home
- λ‘κ·ΈμΈ μ΄ν
λμ보λ
ννμ/home
μΌλ‘ 리λ€μ΄λ νΈ λ©λλ€. - λ€λΉκ²μ΄μ
: μλ¨μ κ³ μ λ
λ€λΉκ²μ΄μ
μ ν΅ν΄ κ²μν, λνΉ, νμ , μ±ν νμ΄μ§λ‘ μ΄λμ΄ κ°λ₯ν©λλ€.- λ‘κ·ΈμΈ λ μ¬μ©μμ κ²½μ°
νλ‘ν μ¬μ§
μ λλ¬λ§μ΄νμ΄μ§
λ‘ μ΄λ κ°λ₯ν©λλ€. - λ‘κ·ΈμΈ λμ§ μμ μ¬μ©μμ κ²½μ°
login
λ²νΌμ΄ νμλ©λλ€.
- λ‘κ·ΈμΈ λ μ¬μ©μμ κ²½μ°
- SSAFYμ ν°λ: κ²μνμ μ΅μ κΈλ€μ΄
μ¬λΌμ΄λ νμ
μΌλ‘ 보μ¬μ§λλ€. - λνΉ:
λνΉ
μ μμ 10μκΉμ§ μ‘°ν κ°λ₯ν©λλ€. - νμ¨:
νμ¨
λ³λμ μ°¨νΈ ννλ‘ μ‘°ν κ°λ₯ν©λλ€. - λμ μκ° & ν°λ : μμ μ
κ³μ’
(μκ°, ν°λ) μ 보λ₯Ό μ‘°ν κ°λ₯ν©λλ€.μκ°
: λμμ λΆνν λ μ°μ΄λ μ¬νμ λλ€. μ΅μ΄ κ³μ μμ± μ10μκ°
μ 보μ νκ² λλ©°, λμμ μ€ λ μμ΄λ©° λμμ λ°μ λ μ°¨κ°λ©λλ€. λ§€μμ¦
(λΆκΈ°)λ§λ€ 리μ λ©λλ€.ν°λ
:λνΉ
μ°μ μ μ΄μ©λλ μ¬νμ λλ€. 보μ νμκ°
μνμ¨
μ λ°λΌνμ
νμ¬ν°λ
μ μ»μ μ μμ΅λλ€. λ§€μμ¦
(λΆκΈ°)λ§λ€ 리μ λ©λλ€.
- λ΄κ° λ§‘μ μΌ : μμ μ
μ½μ
μ 리μ€νΈ ννλ‘ μ‘°ν κ°λ₯ν©λλ€. ν΄λ¦ μ ν΄λΉνλμ±ν
μΌλ‘ μ΄λν©λλ€.
/board
- μΉ΄ν
κ³ λ¦¬: μ 체 κΈ, μ
무 κΈ, λΉμ
무 κΈλ‘
μΉ΄ν κ³ λ¦¬
λ₯Ό ꡬλΆνμμ΅λλ€. κ° μΉ΄ν κ³ λ¦¬λ³λ‘ κ²μκΈμ μ‘°ν κ°λ₯ν©λλ€. - κ²μ: μ λͺ©κ³Ό λ΄μ©μΌλ‘
κ²μ
κ°λ₯ν©λλ€. - κ²μκΈ λͺ©λ‘: κ²μκΈμ
μΉ΄λ νν
λ‘ μ‘°ν κ°λ₯ν©λλ€. κ° κ²μκΈμ μ λͺ©, μμ±μΌ, μ§ν μν, μμ μκ°, λ΄μ©μ μΌλΆλ₯Ό μ‘°ν κ°λ₯ν©λλ€.- μ§ν μνμ κ²½μ°
μ§νμ
,μ§νμ€
,μλ£λ¨
μ 3κ°μ§ μνλ‘ κ΅¬λΆλμ΄ μμ΅λλ€.
- μ§ν μνμ κ²½μ°
- νμ΄μ§λ€μ΄μ : κ²μκΈμ 8κ° λ¨μλ‘ νμ΄μ§λ€μ΄μ μ μ μ©νμμ΅λλ€.
- κ²μκΈ μμ±:
κ²μκΈ μμ±
λ²νΌμ λλ¬ κΈ μμ±μ΄ κ°λ₯ν©λλ€.
/board/write
- λ±λ‘νκΈ°: κ²μκΈμ μ λͺ©, μΉ΄ν
κ³ λ¦¬, μμ μκ°, λ΄μ©μ μ
λ ₯νμ¬ κ²μκΈμ
λ±λ‘
ν μ μμ΅λλ€.- μ²μ λ±λ‘ν κ²μκΈμ κ²½μ° μ§ν μνλ
μ§νμ
μΌλ‘ λ±λ‘λ©λλ€. - λ΄μ©μ κ²½μ°
λ§ν¬λ€μ΄ μλν°
μ미리보기
κ° μ 곡λ©λλ€.
- μ²μ λ±λ‘ν κ²μκΈμ κ²½μ° μ§ν μνλ
/board/{boardId}
- κ²μκΈ μμΈ: κ²μκΈμ μμΈ μ‘°ν κ°λ₯ν©λλ€. κ²μκΈμ μ λͺ©, μμ±μ, μμ±μΌ, μ§ν μν, μμ μκ°, μΉ΄ν
κ³ λ¦¬, λ΄μ©μ μ‘°ν κ°λ₯ν©λλ€.
- λ΄μ©μ κ²½μ°
λ§ν¬λ€μ΄ λ·°μ΄
κ° μ μ©λμ΄ μμ΅λλ€.
- λ΄μ©μ κ²½μ°
- μ±ν
νκΈ°:
μ±ν νκΈ°
λ₯Ό λλ¬ κ²μκΈ μμ±μμμ±ν
μ΄ κ°λ₯ν©λλ€. - μμ νκΈ°, μμ νκΈ°: κ²μκΈ μμ±μμ κ²½μ° μμ μ κΈμ
μμ
λλμμ
ν μ μμ΅λλ€.
/board/write?id={boardId}
- μμ νκΈ°: κ²μκΈμ μ λͺ©, μΉ΄ν
κ³ λ¦¬, μμ μκ°, λ΄μ©μ μ
λ ₯νμ¬ κ²μκΈμ
μμ
ν μ μμ΅λλ€.- λ΄μ©μ κ²½μ°
λ§ν¬λ€μ΄ μλν°
μ미리보기
κ° μ 곡λ©λλ€.
- λ΄μ©μ κ²½μ°
/chat
- μμ μ
μ±ν λͺ©λ‘
μ μ‘°ννκ³ ν΄λΉνλ μ±ν μ λλ¬ μ±ν λ°©μΌλ‘ μ μ₯ κ°λ₯ν©λλ€. - μ νν μ±ν μ΄ μμ κ²½μ° βμ νλ μ±ν μ΄ μμ΅λλ€.β λΌλ μλ΄ λ¬Έκ΅¬λ₯Ό νμΈ κ°λ₯ν©λλ€.
μ±ν λͺ©λ‘
μμλ μλλ°©μ μ΄λ¦, νλ‘ν μ¬μ§, λ§μ§λ§ λ©μμ§λ₯Ό νμΈ κ°λ₯ν©λλ€.
/chat/{chatroomId}
-
μ±ν νλ©΄
μμλ μλλ°©μ μ΄λ¦, νλ‘ν μ¬μ§, μ½μ μ 보, μ§ν μν, κ²μκΈ μ λͺ©, μ±ν λ΄μμ νμΈ κ°λ₯ν©λλ€.- κ²μκΈ μ λͺ©μ ν΄λ¦ μ ν΄λΉνλ κ²μκΈλ‘ μ΄λλ©λλ€.
- μ±ν λ΄μμ΄ μμ κ²½μ° βμμ§ λ©μμ§κ° μμ΅λλ€.β λΌλ μλ΄ λ¬Έκ΅¬λ₯Ό νμΈ κ°λ₯ν©λλ€.
-
μ±ν λ΄μ©μ μ λ ₯ ν
enter
λ₯Ό λλ¬ μλλ°©κ³Ό μ±ν μ΄ κ°λ₯ν©λλ€. -
μ½μ
- μ½μμ‘κΈ°: κ²μκΈ μμ±μμ κ²½μ°
μ½μμ‘κΈ°
λ²νΌμ λλ¬ μμλ μκ°κ³Ό μ½μ μκ°μ μ λ ₯νκ³νμΈ
μ λλ¬ μ½μμ μ‘μ μ μμ΅λλ€. μ½μμ μ‘μ κ²½μ° κ²μκΈμ μ§ν μνκ°μ§νμ€
μΌλ‘ λ³κ²½λλ©° μμλ μκ°λ§νΌλ³΄μ¦κΈ
μ΄ κ³μ’(μκ°
)μμ μ°¨κ°λ©λλ€. - μ½μ μ 보: μ±ν
μ°Έμ¬μλ€μ μμ±λ
μ½μ
μ λν μ 보(μμλ μκ°, μ½μ μκ°)λ₯Ό νμΈ κ°λ₯ν©λλ€. - μ½μμ·¨μ: κ²μκΈ μμ±μμ κ²½μ°
μ½μμ·¨μ
λ²νΌμ λλ¬ μ½μμ μ·¨μν μ μμ΅λλ€. μ½μμ·¨μ μ κ²μκΈμ μ§ν μνκ°μ§νμ
μΌλ‘ λλμκ°λλ€. - κ±°λ μλ£νκΈ°: κ²μκΈ μμ±μμ κ²½μ°
κ±°λ μλ£νκΈ°
λ²νΌμ λλ¬ λ¦¬λ·°λ₯Ό μμ±νκ³λ¦¬λ·° 보λ΄κΈ°
λ²νΌμ λλ¬ κ±°λλ₯Ό μλ£ν μ μμ΅λλ€. κ±°λλ₯Ό μλ£ν κ²½μ° κ²μκΈμ μ§ν μνκ°μλ£λ¨
μΌλ‘ λ³κ²½λ©λλ€.- 리뷰:
리뷰
λ λ²νΌ ν κΈ νμμΌλ‘ μνλ νλͺ©μ μ ννμ¬ μμ± κ°λ₯ν©λλ€.
- 리뷰:
- μ½μμ‘κΈ°: κ²μκΈ μμ±μμ κ²½μ°
/ranking
- 20λͺ
λ¨μλ‘
νμ΄μ§λ€μ΄μ
μ΄ μ μ©λλνΉ νμ΄μ§
μ λλ€. - λνΉ μ 보λ λ§€ μ κ°μ μλ κ°±μ λλ©° λ§€ μμ¦(λΆκΈ°)λ§λ€ 리μ λ©λλ€.
- κ°κ°μ μμ, μ΄λ¦, 보μ ν°λ, κ±°λνμλ₯Ό νμΈ κ°λ₯ν©λλ€.
- κ²μ:
μ¬μ©μλͺ
(μ΄λ¦)μ μ λ ₯νμ¬λνΉ κ²μ
μ΄ κ°λ₯ν©λλ€. - λμ λνΉ:
λμ λνΉ μ 보
λ νλ¨μ κ³ μ λ ννλ‘ μ‘°νκ° κ°λ₯ν©λλ€.
/exchange
- μμ μ΄ λ³΄μ ν μ¬νμΈ
μκ°
μν°λ
λ‘,ν°λ
μμκ°
μΌλ‘ νμ¨μ λ°λΌ νμ μ΄ κ°λ₯ννμ νμ΄μ§
μ λλ€. - νμ¬ νμ¨, νμ¨ λ³λ λ΄μ μ°¨νΈ, λμ 보μ μκ°, λμ 보μ ν°λ, μ΅λ νμ κ°λ₯ν μ¬νλμ νμΈ κ°λ₯ν©λλ€.
- νμ : νμ μ μνλ λ§νΌ
μκ°
λ¨μλ‘ μ λ ₯ νꡬ맀
λ²νΌμ λλ¬νμ
μ΄ κ°λ₯ν©λλ€.- μ
λ ₯ν
μκ°
μ λ°λΌνμ λ μ¬νλ
μ΄ νμ¬ νμ¨λ‘ κ³μ°λμ΄ νμλ©λλ€.
- μ
λ ₯ν
- μμ μ νλ‘ν μ¬μ§, μ΄λ¦, μ΄λ©μΌμ νμΈ κ°λ₯ν©λλ€.
- λ‘κ·Έμμ:
λ‘κ·Έμμ
λ²νΌμ λλ¬ λ‘κ·Έμμμ΄ κ°λ₯ν©λλ€.
/mypage/activity
- λμ κ²μκΈ: μμ μ΄ μμ±ν
κ²μκΈ
μμ§ν μν
μ λ°λΌ λΆλ₯νμ¬μΉ΄λ νν
λ‘ μ‘°ν κ°λ₯ν©λλ€.
/mypage/trade
- λμ 보μ μκ°: μμ μ κ³μ’ μ 보 μ€ λ³΄μ
μκ°
μ νμΈ κ°λ₯ν©λλ€. - λμ κ±°λ λ΄μ: μμ μ
κ±°λ λ΄μ
μ 리μ€νΈ ννλ‘ μ‘°ν κ°λ₯ν©λλ€. κ° κ±°λλ΄μμμλ μλλ°©μ νλ‘ν μ¬μ§κ³Ό μ΄λ¦, μ§ν μν, κ²μκΈ μ λͺ©, κ±°λ μΌμ, κ±°λνμκ°(μ¬ν)
μ νμΈ κ°λ₯ν©λλ€.- κ²μκΈ μ λͺ©μ ν΄λ¦ μ ν΄λΉνλ κ²μκΈλ‘ μ΄λν©λλ€.
- μΉ΄ν
κ³ λ¦¬:
μ 체
,μ§νμ
,μ§νμ€
,μλ£λ¨
λ²νΌμ λλ¬ μ§ν μνμ λ°λΌ λΆλ₯νμ¬ μ‘°ν κ°λ₯ν©λλ€. - κ²μ: κ²μκΈ μ λͺ©μ ν΅ν΄ κ±°λ λ΄μ λ΄μμ
κ²μ
μ΄ κ°λ₯ν©λλ€.
/mypage/exchange
- λμ νμ λ΄μ: μμ μ
νμ λ΄μ
μμκ°μ ν°λλ‘ λ°κΎΌ λ΄μ
,ν°λμ μκ°μΌλ‘ λ°κΎΌ λ΄μ
μ 2κ°μ§ 리μ€νΈ ννλ‘ μ‘°ν κ°λ₯ν©λλ€.- κ° νμ λ΄μμμλ κ±°λν
μκ°
,ν°λ
μ μκ³Ό νμ μΌμλ₯Ό νμΈ κ°λ₯ν©λλ€.
- κ° νμ λ΄μμμλ κ±°λν
- Next.jsλ₯Ό μ²μ μ¬μ©ν΄ 보며 SSR(Server-Side Rendering)κ³Ό CSR(Client-Side Rendering)μ λ λλ§ λͺ©μ μ λ°λΌ ꡬλΆνμ¬ νμ΄μ§λ₯Ό κ°λ°νλ κ²½νμ νμ΅λλ€. SSRμ ν΅ν΄ μ΄κΈ° λ‘λ© μλλ₯Ό κ°μ νκ³ , SEOλ₯Ό κ°νν μ μμμΌλ©°, CSRμ μ μ ν νμ©νμ¬ μ¬μ©μ μΈν°λμ μ΄ μ€μν νμ΄μ§μμλ λ³΄λ€ λΉ λ₯Έ νλ©΄ μ νμ ꡬνν μ μμμ΅λλ€. μ΄ κ³Όμ μμ κ° λ λλ§ λ°©μμ μ₯λ¨μ μ μ€λ¬΄μ μ μ©νλ©° νμ΅ν μ μμμ΅λλ€.
- Zustandλ₯Ό μ¬μ©ν΄ μν κ΄λ¦¬λ₯Ό μ μ©ν΄ 보μλλ°, μ¬μ© λ°©λ²μ΄ κ°λ¨νλ©΄μλ λΆνμν 리λ λλ§μ μ€μΌ μ μμ΄μ μ±λ₯ μ΅μ νμ ν° λμμ΄ λμμ΅λλ€. νΉν, νλ‘μ νΈ κ·λͺ¨κ° 컀μ§μ λ°λΌ μ¬λ¬ μ»΄ν¬λνΈμμ μνλ₯Ό 곡μ ν λ λ§€μ° μ§κ΄μ μΌλ‘ κ΄λ¦¬ν μ μμλ μ μ΄ μΈμμ μ΄μμ΅λλ€. λ€λ₯Έ μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬μ λΉκ΅νμ λ, Zustandλ κ°λ²Όμ°λ©΄μλ νμ₯μ±μ΄ μμ΄ νΈλ¦¬νμ΅λλ€.
- λ°±μλ REST APIκΉμ§ μ§μ κ°λ°ν΄ 보μκ³ , μ΄λ₯Ό ν΅ν΄ νλ‘ νΈμλμ λ°±μλ κ°μ λ°μ΄ν° ν΅μ μ μ€κ³νκ³ κ΅¬ννλ κ³Όμ μ κ²½ννμ΅λλ€. API μ€κ³λΆν° ꡬν, ν μ€νΈκΉμ§ μ§ννλ©°, κ°μ’ λΉλκΈ° μ²λ¦¬μ μλ¬ νΈλ€λ§μ μ€μμ±μ λ€μκΈ κΉ¨λ¬μμ΅λλ€. ν΄λΌμ΄μΈνΈμμ μλ²λ‘ λ°μ΄ν°λ₯Ό μμ²νκ³ μ²λ¦¬νλ λ‘μ§μ μ§μ λ€λ£¨λ©°, API ꡬ쑰λ₯Ό μ μ€κ³νλ κ²μ΄ μΌλ§λ μ€μνμ§ κΉ¨λ¬μμ΅λλ€.
- μν κ΄λ¦¬ λΆλΆμμλ TanStack Queryμ 컀μ€ν ν μ μ¬μ©νλλ°, νΉν TanStack Queryλ μλ² μν κ΄λ¦¬μ μ΅μ νλ κΈ°λ₯μ μ κ³΅ν΄ λΉλκΈ° λ°μ΄ν° μ²λ¦¬μ μΊμ±, 리νμΉ λ±μ 볡μ‘ν μμ μ μμ½κ² ν΄κ²°ν μ μμμ΅λλ€. 컀μ€ν ν μ νμ©ν΄ λ°λ³΅λλ λ‘μ§μ μ¬μ¬μ© κ°λ₯ν ννλ‘ μΆμΆνλ©΄μ μ½λμ κ°λ μ±κ³Ό μ μ§ λ³΄μμ±μ ν¬κ² ν₯μμν¬ μ μμμ΅λλ€.
Tailwind CSS
μTanstack Query
λ₯Ό μλ‘κ² λ°°μ μ μ©νλ©°, κ° λΌμ΄λΈλ¬λ¦¬λ€μ μ₯μ μ μ μ΄λ¦¬κΈ° μν΄ κ³΅λΆνλ©° μ±μ₯ν μ μμμ΅λλ€. μ°μTailwind CSS
μ κ²½μ° μ²μμλ ν΄λμ€κ° λ무 λ§μ 볡μ‘ν΄ λ³΄μμ§λ§, μ μ°¨ Tailwindμ μ νΈλ¦¬ν° κΈ°λ° μ κ·Ό λ°©μ λλΆμ λΉ λ₯΄κ³ μΌκ΄λ μ€νμΌλ§μ΄ κ°λ₯νλ€λ κ²μ κΉ¨λ¬μμ΅λλ€. νΉν λ°λ³΅μ μΈ μ€νμΌλ§ μμ μ μ€μ¬ μμ°μ±μ λμΌ μ μμμΌλ©°, μ μ§λ³΄μλ ν¨μ¬ κ°νΈνμ΅λλ€. λμ§Έλ‘ μλ² μνμ ν΄λΌμ΄μΈνΈ μνλ₯Ό κ΄λ¦¬νλ λ° μμ΄TanStack Query
μ μΊμ± λ° λ¦¬νμΉ κΈ°λ₯μ λ§€μ° μ μ©νμ΅λλ€. νΉν, λ°μ΄ν°λ₯Ό ν¨μ¨μ μΌλ‘ κ°μ Έμ€κ³ μνλ₯Ό κ΄λ¦¬ν μ μμ΄μ 볡μ‘ν λΉλκΈ° ν΅μ λ‘μ§μ λ¨μνν μ μμμ΅λλ€. API μμ²κ³Ό κ΄λ ¨λ μλ¬ μ²λ¦¬μ μ¬μλ κΈ°λ₯λ μ½κ² κ΄λ¦¬ν μ μμμ΅λλ€.- νλ‘μ νΈμμ κ°μ₯ ν₯λ―Έλ‘μ λ λΆλΆμ μ€μκ° μ±ν
κΈ°λ₯μ΄μμ΅λλ€. μ΄λ₯Ό μν΄
SockJS
μSTOMP
νλ‘ν μ½μ λμ νμ¬, μ¬μ©μ κ° μ€μκ° λ©μμ§ κ΅νμ ꡬνν μ μμμ΅λλ€. μ²μμλWebSocket
κΈ°λ°μ μ€μκ° ν΅μ λ‘μ§μ΄ λ―μ€μμΌλ, μ μ°¨ μ΄ν΄νλ©΄μSTOMP
ν΄λΌμ΄μΈνΈλ₯Ό νμ©ν λ©μμ§ μ μ‘ λ° μμ νλ¦μ μ΅νκ² λμμ΅λλ€. λλΆμ μ€μκ°μΌλ‘ μ±ν λ΄μ©μ νλ©΄μ νμνκ³ , μ€ν¬λ‘€μ κ΄λ¦¬νλ λ±μ κΈ°λ₯μ μμ°μ€λ½κ² ꡬνν μ μμμ΅λλ€. - νλ‘μ νΈ λμ€ κ°μ₯ μ΄λ €μ λ λΆλΆμ
μ½μ κ΄λ¦¬ μμ€ν
μ΄μμ΅λλ€. μ±ν λ°© λ΄μμ μ½μμ μ‘κ³ , μμ νκ±°λ μλ£νλ λ‘μ§μ μ€κ³νλ λ° λ§μ κ³ λ―Όμ΄ νμνμ΅λλ€. νΉν λΉλκΈ° λ°μ΄ν° μ²λ¦¬λ₯Ό ν λ, μ½μ λ°μ΄ν°μ μ±ν λ°μ΄ν° κ°μ μνΈμμ©μ κ΄λ¦¬νλ κ²μ΄ μ½μ§ μμμ΅λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μλμν κ΄λ¦¬
μAPI 리νμΉ λ‘μ§
μ λͺ νν λλλ ꡬ쑰 μ€κ³λ₯Ό νμ¬ λ¬Έμ κ° λ°μνμ§ μλλ‘ μ²λ¦¬νμ΅λλ€.
- νλ‘μ νΈλ₯Ό μ§ννλ©° μμμ 곡κΈμ κ³ λ €ν μ체 νμ¨ κ³μ° λ‘μ§μ μ€κ³νμ΅λλ€. νΉν λΆλ μμμ κ³μ°μμ μ νμ±μ΄ μ€μνλ€λ μ μ κ²½ννκ³ , μΆν λ μ νν κ³μ°μ μν΄ BigDecimal ν΄λμ€λ₯Ό λμ ν κ³νμ λλ€.
- λνΉκ³Ό κ°μ λ°μ΄ν°λ₯Ό μ‘°νν λ μλ μ΅μ νκ° νμν¨μ λλΌκ³ , μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ Redis μΊμλ₯Ό λμ νμ΅λλ€. Redisλ₯Ό νμ©ν μΊμ± κ³Όμ μ ν΅ν΄ λ°μ΄ν° μ‘°ν μ±λ₯μ ν₯μμν€κ³ , κ΄λ ¨ κΈ°μ μ νμ΅ν μ μμμ΅λλ€.
- νμλ€κ³Ό ν¨κ» νμ¨ μκ³ λ¦¬μ¦κ³Ό κ°μ μ²μ μ νλ λλ©μΈμ λν΄ κ³ λ―Όνκ³ ν΄κ²°νλ κ³Όμ μμ, μλ‘μ΄ κ°λ κ³Ό λ¬Έμ λ₯Ό μ΄ν΄νκ³ μ μ©νλ λ₯λ ₯μ ν€μΈ μ μμμ΅λλ€.
- μ λ°μ μΈ νλ©΄ λμμΈμ λ΄λΉνλ©΄μ UI/UXλ₯Ό κ³ λ €ν¨κ³Ό λμμ νμλ€μ λ§ν¬μ ν¨μ¨μ±μ λμ΄κΈ° μν λ°©λ²μ κ³ λ―Όνλ κΈ°νκ° λμμ΅λλ€.
- λμμΈ ν ν°μ λΆλ¦¬νμ¬ λ³μλ‘ μ€μ νκ³ tailwind configλ₯Ό ν΅ν΄ 컀μ€ν λμμΈ μμ€ν μ ꡬννλ©΄μ tailwindμ λν μ΄ν΄μ 컀μ€ν νλ λ°©λ²μ λν΄ λ°°μΈ μ μμμ΅λλ€. λν μ²μμ emotionμ μ¬μ©νλ € νμΌλ server component μ§μμ΄ μλλ€λ μ΄μ λ‘ next.jsμμ tailwindλ₯Ό μΆμ²νλ μ΄μ μ λν΄ κ³΅λΆνμμΌλ©°, μ΄λ₯Ό ν΅ν΄ μλ² λ λλ§ μ λΉλ νμμ μ€νμΌμ΄ μμ±λλ tailwindμ λμ μ리μ λν΄ κΉμ μ΄ν΄λ₯Ό ν μ μμμ΅λλ€.
- TypeScriptμ Axiosλ₯Ό νμ©ν΄ 컀μ€ν API Handlerλ₯Ό μμ±νμ¬ μμ νκ³ ν¨μ¨μ μΈ API μν΅μ ν μ μμμΌλ©°, μ κ° λ§λ μ½λλ₯Ό λ€λ₯Έ νμλ€μ΄ νμ©ν μ μλλ‘ νμ¬ ν΅μΌλ 컨벀μ μ λ§μΆ μ μμμ΅λλ€.
- ν΄λΌμ΄μΈνΈ μνκ΄λ¦¬λ zustand, μλ² μνκ΄λ¦¬λ tanstack queryλ₯Ό νμ©νμ¬ λΆλ¦¬νμ¬ μνμ νΉμ±μ λ§κ² κ΄λ¦¬νμμ΅λλ€. μ΄λ₯Ό ν΅ν΄ μνμ νμ€ν λΆλ¦¬μ νΉν tansktack queryμ μΊμ±, refresh κΈ°λ₯ λ±μ λν μ΄ν΄λ₯Ό λμμ΅λλ€.
- κΈ°λ³Έμ μΌλ‘ SSRλ‘ λμνλ Next.jsμμ λ°μνλ Hydration μλ¬λ₯Ό useEffect ν μ μ΄μ©ν΄ ν΄κ²°νλ©΄μ SSRμ λμ λ°©μκ³Ό μλ¬ ν΄κ²°μ λν μ΄ν΄λ₯Ό μ»μ μ μμμ΅λλ€.
- μ²μ μ¬μ©ν΄λ³΄λ κΈ°μ μ€νμΈ λκ·λͺ¨ μ΄λ²€νΈ λΈλ‘컀 Kafkaμ NoSQL MongoDBλ₯Ό νμ΅ λ° μ μ©ν΄λ³΄λ©° μλ‘μ΄ μΈμ¬μ΄νΈλ₯Ό μ»μ μ μμμ΅λλ€.
- Kafka Topic μ λ΅μ μκ°ν΄λ³΄κ³ MongoDB λΉμ ν λ°μ΄ν° μ μ₯ λ°©μμ μ€μ ν΄λ³΄λ©° λ¨μ κ°λ°μ λμ΄ ν¨μ¨μ μΈ νΈλν½ λ° λ°μ΄ν° κ΄λ¦¬λ₯Ό κ²½νν μ μμμ΅λλ€.
- νμλ€κ³Ό νμ νλ©° μ€λ₯λ₯Ό ν΄κ²°νλ κ³Όμ μ ν΅ν΄ νμμκ² λ§μ κ²μ λ°°μΈ μ μμκ³ νΈλ¬λΈμν ν΄κ²° λ₯λ ₯μ κΈ°λ₯Ό μ μμμ΅λλ€.