λκ·λͺ¨ λͺ¨μμ μΈμκ΄λ¦¬, μΌμ μ‘°μ¨, μν΅μ ν¨μ¨μ μΌλ‘ λμμ£Όλ MSA κΈ°λ° λͺ¨μ ν΅ν© κ΄λ¦¬ μλΉμ€
κ°λ° κΈ°κ° : 2025.04 ~ 2025.05
|
|
|
|
|
|
|---|---|---|---|---|
| κΉνμ£Ό | λ°μ©ν | μ΅μ§μ | κΉλμ° | λ°κ·μ |
| κ²μκΈ, μΌμ | μλͺ¨μ, μΈμ | νμ | μλ¦Ό, λͺ¨μ | μ±ν , λκΈ |
| Lead | Tech Lead | BE | BE | BE |
- μλΉμ€ URL : https://moim.agong.store
- API : (wikiμ λ¬Έμνν μμ μ λλ€.)
π§© μλ² μν€ν μ²
νλ‘μ νΈ λͺ©μ
- λκ·λͺ¨ λͺ¨μ κ΄λ¦¬λ₯Ό λ³΄λ€ μ½κ³ νΈνκ² λμμ£Όλ μλΉμ€ μ λλ€.
νλ‘μ νΈ μ€λͺ
- λͺ¨λ μΈμμ΄ κ³΅μ§λ₯Ό νμΈν μ μλλ‘ μ£ΌκΈ°μ μΌλ‘ μλμ 보λ΄μ£Όκ³ , μ μ°©μ μΈμ , μ±ν , ν¬ν λ±μ λΆκ°μ μΈ κΈ°λ₯μ ν΅ν΄ λͺ¨μμ κ΄λ¦¬λ₯Ό μμνκ² ν μ μλλ‘ μ§μν΄μ€λλ€.
νλ‘μ νΈ κ΅¬μ±
- νμ, μΈμ , μλ¦Ό, μ±ν , λͺ¨μ, μλͺ¨μ, κ²μκΈ, λκΈ, μΌμ λλ©μΈμΌλ‘ μ΄λ£¨μ΄μ Έ μμΌλ©°, μλΉμ€ κ°μ ν΅μ μ FeignClientλ‘ μ΄λ£¨μ΄μ§λλ€. λν Kafkaλ₯Ό μ¬μ©νμ¬ μ΄λ²€νΈ κΈ°λ° μν€ν μ²λ₯Ό ꡬμ±νμμΌλ©°, OpenTelemetryλ₯Ό ν΅νμ¬ λͺ¨λ λ‘κ·Έλ€μ ν¨μ¨μ μΌλ‘ μμ§νμμΌλ©°, λΆμ°μΆμ μ μννμκ³ , Grafanaλ‘ μκ°νλ₯Ό μ§ννμ¬ μ§μμ μΈ λͺ¨λν°λ§μ μ§ννμ΅λλ€.
μν€ν μ³ μ€λͺ
- MSA κΈ°λ°μ΄λ©°, κ° μλΉμ€ μΈμ€ν΄μ€λ€μ AWS ECS μμ λμν©λλ€. μ ν¨μ€λ₯Ό ν΅ν CI/CD νμ΄νλΌμΈμ ꡬμΆνμμ΅λλ€. RDBλ MySQLμ μ¬μ©νμκ³ , AWS RDSμ DBμλ²λ₯Ό ꡬμΆνμμ΅λλ€. NoSQLμΈ Redisμ MongoDBλ AWS EC2μ ꡬμΆνμμ΅λλ€. Kafka/Zookeeper, Prometheus, Grafana, Grafana Tempo, Grafana Loki, OpenTelemetryλ AWS EC2μ λ°°ν¬νκ²½μ ꡬμΆνμμ΅λλ€.
-
νμ:
- νμκ°μ μ΄ κ°λ₯ν©λλ€.usernameμ μ λν¬νλ©°, passwordλ μΈμ½λ©λμ΄ μ μ₯λ©λλ€.
- λ‘κ·ΈμΈ/λ‘κ·Έμμμ΄ κ°λ₯ν©λλ€. λ‘κ·ΈμΈ μ JWTλ₯Ό μΏ ν€λ‘ λ°κΈνκ³ , λ‘κ·Έμμ μ μΏ ν€λ₯Ό λ§λ£μν΅λλ€.
- κ²μ΄νΈμ¨μ΄λ‘λΆν° μΈμ¦ μμ²μ΄ λ€μ΄μ€λ©΄, κ²μ¦μ μνν λ€ Passportλ₯Ό λ°κΈν©λλ€. Passportλ κ° μλΉμ€μμ νμ¬ μμ²μ μ μ μ λ³΄λ‘ νμ©λ©λλ€.
- νμ μ‘°ν, μμ , μμ κ° κ°λ₯ν©λλ€.
-
μΈμ :
- μΈμ μμ±/μμ μ΄ κ°λ₯ν©λλ€.
- μΈμ μ μ°Έμ¬/λκ°κΈ°κ° κ°λ₯νλλ‘ μ€κ³λμμ΅λλ€.
- μΈμ μμ±μ νκ² λλ©΄ λͺ¨μ - λ§€λμ κ° μΉμΈμ μμΌ μΈμ μ νμ±νκ° κ°λ₯ν©λλ€.
- λ€μμ μ¬μ©μκ° λμμ μ μ₯ν μ μλλ‘ λ£¨μμ€ν¬λ¦½νΈλ₯Ό ν΅ν΄ μμμ±μ μ μ΄νκ³ μμ΅λλ€.
-
μλ¦Ό:
- λ€μν μλΉμ€λ‘λΆν° λ°μν μ΄λ²€νΈλ₯Ό μμ νμ¬ μλ¦Όμ μμ±ν©λλ€. μλ₯Ό λ€μ΄, λͺ¨μ κ°μ μ μ², μΉμΈ λ±μ μ΄λ²€νΈλ₯Ό μ²λ¦¬ν©λλ€.
- μ΄λ²€νΈ νμ μ λ°λΌ μ¬μ μ μ μλ μλ¦Ό ν νλ¦Ώμ μ¬μ©νμ¬ μ¬μ©μμκ² μ λ¬ν μλ¦Ό λ©μμ§λ₯Ό μλμΌλ‘ μμ±ν©λλ€.
- μμ±λ μλ¦Όμ DBμ μ μ₯λλ©°, κ° μλ¦Όμ μ½μ/μμ½μ μνλ₯Ό ν΅ν΄ ꡬλΆλ©λλ€. μ΄λ₯Ό κΈ°λ°μΌλ‘ νν°λ§λ μλ¦Ό μ‘°νκ° κ°λ₯ν©λλ€.
- λ€μν μλ¦Ό μ νμ΄ μ λ΅ ν¨ν΄ κΈ°λ°μΌλ‘ ꡬνλμ΄ μμ΄ μλ‘μ΄ μλ¦Ό νμ μ΄ μ½κ² νμ₯ κ°λ₯ν©λλ€.
-
μ±ν :
- ws-stompλ₯Ό ν΅ν΄ μ€μκ° μ±ν μ΄ κ°λ₯ν©λλ€. (1λ1 μ±ν κ³Ό 1λN μ±ν μ΄ κ°λ₯ν©λλ€)
- Kafkaλ₯Ό μ±ν λΈλ‘μ»€λ‘ μ¬μ©νμ¬, λμ©λ μ±ν νΈλν½μ 견λ μ μλλ‘ μ€κ³λμμ΅λλ€.
- κΈ°νμμΌλ‘, λͺ¨μ 1κ°λΉ μ±ν λ°©μ 1κ°λ§ μμ±ν μ μλλ‘ μ€κ³λμμ§λ§, μΆν νμ₯μ΄ κ°λ₯ν©λλ€.
-
λͺ¨μ:
- μ¬μ©μλ μλ‘μ΄ λͺ¨μμ μμ±ν μ μμΌλ©°, λͺ¨μ μ΄λ¦, μ€λͺ , λͺ¨μ§ 쑰건 λ± λ€μν μ 보λ₯Ό μ λ ₯νμ¬ κ°μ€ν μ μμ΅λλ€.
- μ¬μ©μλ κ΄μ¬ μλ λͺ¨μμ μ μ²ν μ μκ³ , κ΄λ¦¬μλ μ μ²μλ₯Ό μΉμΈ λλ κ±°μ ν μ μμ΅λλ€. μ΄ κ³Όμ μ μλ¦Ό μμ€ν κ³Ό μ°λλ©λλ€.
- κ΄λ¦¬μλ λͺ¨μμ κ°μ λ λ©€λ²λ€μ Roleμ λΆμ¬νκ±°λ, λ©€λ²λ₯Ό μΆκ°/μμ ν μ μμ΅λλ€. Roleμ λ°λΌ μ κ·Ό κΆνμ΄ κ΅¬λΆλ©λλ€.
- λͺ¨μ λ©€λ² μ 보λ₯Ό μΊμ(Redis)μ μ μ₯νμ¬ μ‘°ν μ±λ₯μ ν₯μμμΌ°μ΅λλ€. μμ£Ό μ‘°νλλ λ©€λ² μ 보 μμ²μ λΉ λ₯Έ μλ΅μ΄ κ°λ₯ν©λλ€.
-
μλͺ¨μ:
- μλͺ¨μ μμ±/μμ μ΄ κ°λ₯ν©λλ€.
- μλͺ¨μμ μ°Έμ¬/λκ°κΈ°κ° κ°λ₯νλλ‘ μ€κ³λμμ΅λλ€.
-
κ²μκΈ
- λͺ¨μλ³ κ²μκΈ κ΄λ¦¬κ° κ°λ₯νλ©°, κ²μκΈμ νΌλ νΉμ ν¬νλ‘ μμ±ν μ μμ΅λλ€.
- κΆνμ λ°λΌ κ²μκΈ μμ λ° μμ κ° κ°λ₯ν©λλ€.
- μ‘°νκ° λΉλ²ν κ²μΌλ‘ νλ¨νμ¬, CQRSλ₯Ό νμ©νμ¬ μ½κΈ° DB(MongoDB)λ₯Ό λΆλ¦¬ν¨μΌλ‘μ¨ μ‘°ν μ±λ₯μ λμμ΅λλ€.
- DB μ¬μ΄μ λ°μ΄ν° μΌκ΄μ±μ μ΄λ²€νΈ μμ±μΌλ‘ ꡬμ±νμΌλ©°, μ νν νλ²μ 보μ₯νκΈ° μν΄ OutBoxν¨ν΄κ³Ό λ©±λ±μ μλΉμ ν¨ν΄μ νμ©νμμ΅λλ€.
- μΊμμ μΈλ±μ€λ₯Ό νμ©νμ¬ μ‘°ν μ±λ₯μ λμ± μ΅μ ν κ°λ₯ν©λλ€.
-
λκΈ
- κ²μκΈκ³Ό λκΈ λλ©μΈμ λΆλ¦¬λμ΄ μμ΅λλ€.
- λΆλͺ¨λκΈκ³Ό μμλκΈμ ꡬλΆνμ¬ λκΈκ³Ό λλκΈμ ꡬλΆμ§μμ΅λλ€.
- κ²μλμ§ μκ°μ΄ μ§λ κ²μκΈμ λκΈμ μμ μ΄ λΉλ²νκ² μΌμ΄λμ§ μλλ€κ³ νλ¨νμ¬, λκΈ μ‘°ν μ΅μ νλ₯Ό μν΄ μΊμ±μ λμ νμμ΅λλ€.
- κ²μκΈμ΄ μμ λλ©΄, λκΈλ λͺ¨λ μμ λλ νΈλμμ μ κ°κ³ μμ΅λλ€.
-
μΌμ
- λͺ¨μλ³ μΌμ κ΄λ¦¬κ° κ°λ₯ν©λλ€.
- λͺ¨μμ κΆνμ λ°λΌ μΌμ μ μμ νκ³ , μμ ν μ μμ΅λλ€.
- π§ μλ¦Ό μλΉμ€ μ¦μ INSERTλ‘ μΈν DB λΆν
- π§ taggedIds λ³κ²½μ, λ°μνλ 쿼리 μ μ΅μ ν
- π€ λκΈ°ν μ²λ¦¬ μλ κ°μ
- π€ Redisson κΈ°λ° μΈμ μ°Έκ° κΈ°λ₯ μ΅μ ν κ³Όμ
- π€ 쿼리νλ β μ°κΈ° μ΅μ ν
- π€ κ΄μΈ‘ νκ²½ κ΅¬μΆ Part#1
- π€ κ΄μΈ‘ νκ²½ κ΅¬μΆ Part#2


