λ΄κ° 2λ μ°¨?
2023λ
μ΄ μμν κ²μ΄ μκ·Έμ κ°μλ°, λ²μ¨ 2024λ
μ΄ λμμ΅λλ€.
λ무λλ λΉ λ₯΄κ² μ§λκ°λ²λ¦° 2023λ
μ κ°λ¨ν νκ³ ν΄λ³΄κ³ μ ν©λλ€.
μ΅λν 컀리μ΄μ μΈ λΆλΆμ κΈ°λ°μΌλ‘ νμ¬ μ£Όμ μ£Όμ λμ΄λμ λ³΄κ² μ΅λλ€.
첫 νμ¬μμμ κ²½ν
μ무λλ 2023λ μ 컀리μ΄μμ κ°μ₯ ν° μν₯μ μ€ κ²μ 2022λ 12μ 26μΌμ 첫 νμ¬μ μ μ¬ν κ² κ°μλ°μ. νμ¬μμμ κ²½νμ μ€μ¬μΌλ‘ λ¨Όμ νκ³ ν΄λ³΄κ² μ΅λλ€.
νμ
μ¬μ§νλ νμ¬ κ·λͺ¨μ λ³ν
첫 νμ¬μ μ κ·μ§μΌλ‘ μ μ¬νκΈ° μ κΉμ§ μ λ 2022λ 1νκΈ°μλ μΈν΄μΌλ‘, μΈν΄ μ’ λ£ μ΄ν 1λ¬μ΄ μ§λμλΆν°λ ν리λμλ‘ μ€ννΈμ μμ μΌνλ κ²½νμ νμ΅λλ€. μ무λλ νμ¬μ κ·λͺ¨κ° μλ€ λ³΄λ μ κΆνμ λ²μκ° μ»Έκ³ , μ΄ λλΆμ μμ νλ‘λνΈμμ§λ§ 리λμμ κ°μ§κ³ νμ μ νλ κ²μ μ΄μ μ λλ κ² κ°μ΅λλ€.
μ΄ν μ§κΈμ νμ¬μ μ μ¬ν μ΄νλ‘λ νμ¬μ κ·λͺ¨κ° 컀μ§λ©΄μ μ΄λ° νμ μ κ΄μ μ΄ λ§μ΄ λ³ν¨μ λκΌμ΅λλ€. κ°μμ λΆμΌμμ μ λ¬Έμ±μ λͺ νν κ°μ§κ³ μλ νμλ€μ΄ λͺ¨μ¬ μκ³ , κ°λ°μ λ²μμ νλ‘μ νΈμ μΌμ μ μ‘°μ¨ν μ μλ κΈ°νμ κ·Έλ¦¬κ³ κ°μΆμ΄μ Έ μλ λ¦΄λ¦¬μ¦ νλ‘μΈμ€λ₯Ό ν΅ν΄μ 체κ³μ μΌλ‘ μΌμ΄ μ§νλ¨μ λκΌμ΅λλ€.
λ°λκΈλΆλ‘ μ μν μ μλ² μ ν리μΌμ΄μ μ κ°λ°νλ λ°±μλ κ°λ°μλ‘ μ’νμ§λ κ² μμ λλ μ μμμ΅λλ€. μ΄ λΆλΆμ΄ μ²μμλ λ€μ μμνκ³ νΌλμ€λ½κΈ°λ νλλ°μ. μ²μ λͺ λ¬μ μ νμ¬μμμ λ²λ¦μ΄ λ¨μ μκΈ°λ νκ³ , μ‘°μ§μ νν μ체λ λμΌνκ² λͺ©μ μ‘°μ§μ΄κΈ°μ μ R&Rμ λν΄μ κ³ λ―Όμ λ§μ΄ νλ κ² κ°μ΅λλ€. μκ°μ΄ μ‘°κΈ μ§λμλ μ€μ€λ‘ νκ³ μΆμ λ§μ νλ λ°±μλ κ°λ°μλΌκ³ μκ°νκ³ μ 무μ μνλ κ² κ°μ΅λλ€. 보μλ νμ¬λΆλ€μ΄ κ³μμ§λ μκ² μ§λ§, μ΄ μ리λ₯Ό λΉμ΄ λ§€λ² λ€μ λλΌμ΄ λ¨μ΄ μ νμΌλ‘ λλμΌλλ¦° μ μ§μ¬μΌλ‘ μ¬κ³Όλ립λλ€.
λ νΉν μ‘°μ§, μλ§μ μ κ΄ λΆμ
2023λ μ κ° μΌν μ‘°μ§μ λ°±μλ κ°λ°μλ‘μ μΌνκΈ°μ κ΅μ₯ν λ νΉν μ‘°μ§μ΄μλ€κ³ μκ°νλλ°μ. μ‘°μ§μ νΉμ±μΌλ‘ μΈν΄ λ€μν μ κ΄ λΆμμ νμ ν΄μΌ νλ κΈ°νκ° λ§μμ΅λλ€. κ·Έλμ μ 무 μκ° μ€ κΈ°μ μ μΈ κ³ λ―Όμ νλ μκ° λͺ»μ§ μκ² νμ μ μν΄ μν΅μ νλ μκ°λ λ§μμ΅λλ€. μ΄λ©΄μ κ°μ₯ λ§μ μμ μ¬λ μ±λμ μ°Έμ¬ν ν ν΄κ° μλμλ μΆλ€μ.
μ΄λ° λ νΉν νΉμ± λλ¬Έμ μ€μ€λ‘ μ΄λ»κ² μν΅ν΄μΌ ν¨μ¨μ μΈμ§, μλλ©΄ μ κ΄ λΆμμ μ°λμ ν΄μΌ νλ κ²½μ°μλ μ΄λ»κ² νλ κ²μ΄ κ° μ‘°μ§μ R&R κ΄μ μμ, μλλ©΄ κΈ°μ μ μΈ λμ κ΄μ μμ λ μ³μ λ°©ν₯μΈμ§ λ§μ΄ κ³ λ―Όνλ κ² κ°μ΅λλ€. μ²μμλ νμμ λ€μ΄κ°μ μ κ° κ΅¬μν μλΉμ€ μ°λμ λν λ°©λ²λ‘ μ μ€λͺ νλ κ²μ΄ λ무 νλ€μλλ°μ, μ΄μ λ κ²½νμ΄ μ’ μμλ€κ³ ꡬμν λ°©λ²λ‘ μ λν μλμ λΉμμ±μ λν΄μ μ€λͺ ν μ μλ μ λλ λ κ² κ°μ΅λλ€.
λν μ¬ ν΄ μ 무λ₯Ό ν μ‘°μ§μ λͺ©μ μ‘°μ§μ ννλ₯Ό λκ³ μλλ°μ. ν μ‘°μ§ λ΄μ κΈ°νμ / λ°μ΄ν° λΆμκ° / λμμ΄λ / κ°λ°μλ€μ΄ ν¨κ» λͺ¨μ¬μλ ννμ λλ€. μ΄ λλΆμ κ°λ°μλ‘μμ κ΄μ μ΄μΈμλ λ€μν κ΄μ μμ νλ‘λνΈλ₯Ό λ°λΌλ³΄λ μκ°μ κΈ°λ₯Ό μ μλ ν ν΄ μλ κ² κ°μ΅λλ€. νΉν μ κ° λ€μ΄λ κΈ°μ μ 곡μκ° μ΄λ€ μ§νλ‘ λνλλμ§ λΉ λ₯΄κ² νΌλλ°± λ°μ μ μμλλ°μ. μ΄ λλΆμ κ³Όμ λ₯Ό μ μ ν λ λΉμ© λλΉ μν©νΈλΌλ, μ νμ¬μμλ λ¬κ΅¬λ¦ μ‘λ μ리λΌκ³ μκ°νλ κ°λ μ λν΄μ λͺΈμΌλ‘ λλΌκ³ μ΄ν΄ν μ μμμ΅λλ€.
κ°λ°
Spring, κ·Έλ¦¬κ³ Kotlin
μ무λλ μ¬ ν΄ μ κ°λ° 컀리μ΄μμ κ°μ₯ ν¬κ³ λͺ νν μ νμ΄λΌκ³ νλ©΄ μΈμ΄μ νλ μμν¬μ μ νμ λ€ μ μμ κ² κ°μ΅λλ€. 2022λ μλ μ£Όλ‘ TypeScript κΈ°λ°μΌλ‘ μ 무λ₯Ό μννμλλ°μ. μ μ¬ν νμ¬λ μ λ©΄μ μΌλ‘ JVM κΈ°λ°μΌλ‘ λμ΄ μλ€κ³ μκ³ μμκΈ°μ SpringμΌλ‘μ νλ μμν¬ μ νμ λΆκ°νΌν΄ 보μμ΅λλ€. Springκ³Ό Java κΈ°λ°μΌλ‘ κ°λ°μ ν κ²½νμ μμκΈ°μ μ¬μ€ ν¬κ² κ±±μ μ νκ³ μμ§λ μμμ΅λλ€. λ€λ§ JVM κΈ°λ° μνκ³μμλ OOP κ°λ μ λν νκ· μμ€μ΄ λ§μ΄ λλ€κ³ μκ³ μκ³ , μ체 ν΄λμ€μ μΈν°νμ΄μ€λ₯Ό λ§μ΄ μμ±νλ μ½λ μ€νμΌμ μ΅μνμ§ μμ λ€μ κ±±μ μ νκΈ°λ νμ΅λλ€.
κ·Έλ°λ° μ μ¬λ₯Ό νκ³ λμ μ ν¬ λΆμλ μ΄λ―Έ μ κ° μ μ¬ν μμ μ λͺ¨λ νλ‘μ νΈλ₯Ό Kotlin μΌλ‘ μ νν μνμλ€λ κ²μ μκ² λμμ΅λλ€. λΉμ₯ μ μ¬ ν루 μ λ κΉμ§ βKotlinμΌλ‘ Spring κ°λ°μ ν μλ μλλ°, λκ² νν μ€νμ΄λ€β λΌκ³ μκ³ μλ μ κ²λ κ½€ μ μ ν 좩격μ΄μμ΅λλ€.
μ μ¬ μ΄ν κ±°μ μΌμ£ΌμΌλμμ μ¨λ³΄λ© μκ°μ μ μΈνκ³ λ Springκ³Ό Kotlin νμ΅μ΄ μ£Όλ μ 무μμ΅λλ€. λ€νν Kotlinμ μ½λμ μ€νμΌμ΄ TypeScriptμ ν¬κ² λ€λ₯΄μ§ μμκ³ , νΉμ μ νΈμμ±κ³Ό κ°κ²°ν¨μ νμ μ΄ λΉ λ₯΄κ² Kotlin μ€νμΌμ μ μν μ μμμ΅λλ€. Spring μ μ κ° κ³΅λΆνλ μμ μ Spring Framework 6κ³Ό Spring Boot 3μ΄ λ¦΄λ¦¬μ¦ λ μμ μ΄μλλ°μ. μ± λ€μ λλΆλΆ Spring Boot 2 κΈ°μ€μΌλ‘ μμ±λμ΄ μμ΄, μ± μ μ€μ΅ λ΄μ©μ Spring Boot 3μΌλ‘ μ€μκ° ν¬ν ν΄κ°λ©° νμ΅μ νμ΅λλ€. μ΄ κ³Όμ μμ Spring Boot 3.0 Migration Guide κ·Έλ¦¬κ³ κ·Έ μ λͺ ν Baeldung μν°ν΄μ 보며 κ·Έ κΌΌκΌΌν¨κ³Ό μΉμ ν¨μ κ°ννλ κ² κ°μ΅λλ€.
κ°μΈμ μΌλ‘ λ‘μ§μ κ°μμ±μ΄ λ¨μ΄μ§λ€λ μ κ·Έλ¦¬κ³ λ·λ¨μμ μΌμ΄λλ λ§λ² κ°μ μΌμ΄ λ§λ€λ μ λλ¬Έμ Springμ ν¬κ² μ’μνμ§λ μμλλ°μ, ASP.NET κ³Ό λλΆμ΄ μν°νλΌμ΄μ¦ νκ²½μμ μ¬μ©νκΈ° νΈν νλ μμν¬μλ κ·Έ μ΄μ κ° μꡬλλΌκ³ λκΌμ΅λλ€.
Coroutine, R2DBC λκ°μ~ (λΆμ : ν루 λ€μ¬μ νμΆν μ μμΌλ©΄β¦)
μ κ· μ μ¬μ κ³Όμ λ₯Ό μ§ννλ©° κ°λ¨νκ² Kotlin κΈ°λ°μΌλ‘ Spring Web (MVC) κ·Έλ¦¬κ³ JPAμ λν΄ κ°μ μ΅ν λ€μ μ€μ νλ‘μ νΈμ ν¬μ λμλλ°μ. μ κ·λ‘ μλ² μ ν리μΌμ΄μ μ ꡬμ±νλ νλ‘μ νΈμμ΅λλ€. μ΄ κ³Όμ μμ κΈ°μ μ€ν μ νμ κ°λ¦ΌκΈΈμ λμ΄κ² λμλλ°, κ°μ΄ νλ‘μ νΈ κ°λ°μ μ§ννμ νμ λΆμ΄ λΉμμ Spring WebFlux κΈ°λ°μμ Kotlin Coroutines κ·Έλ¦¬κ³ R2DBCλ₯Ό νμ©νμ¬ λΉλκΈ° κΈ°λ°μ μλ²λ₯Ό ꡬμ±ν΄λ³΄μκ³ νμ ¨μ΅λλ€. μ κΈ°μ λ³μ΄ μλ (μμ§λ μ€μ¦μ λλ€) μ μλμ§λΌ λ°λ‘ κ³ κ°λ₯Ό 144hzλ‘ λλμ΄λ©° λμνκ³ , κ·Έλ κ² Spring WebFlux + Kotlin Coroutines + R2DBC κΈ°λ°μ μλ²λ₯Ό κ°λ°νκ² λ©λλ€.
Kotlin νκ²½μμ λΉλκΈ° κ΄λ ¨ κ²½νμ΄ μμλ ν°λΌ κ°λ°νλ κ³Όμ μ΄λ μ±λ₯ ν μ€νΈλ₯Ό νλ©΄μ κ³ μμ μ’ νμλλ°μ, μ²μμλ μ±λ₯μ΄ λ무 μλμμ λ³λͺ©μ μμΈ κ°μλ Coroutinesλ₯Ό κ±·μ΄λ΄κ³ WebFlux κΈ°λ°μΌλ‘ μ½λλ₯Ό λͺ¨λ μ¬μμ±ν κΉ νμ§λ§, Reactive κΈ°λ°μΌλ‘ μμ±νκΈ°μ λ‘μ§μ΄ λ무 λ§μμ κ²°κ΅ ν¬κΈ°νκ² λμμ΅λλ€.
λ¬Όλ‘ μ΄λ μ Coroutinesκ³Ό Kotlinμ λν μ΄ν΄λ λΆμ‘±μΌλ‘ μΈν λ¬Έμ μμ΅λλ€. λ€νν μ§κΈμ μ΄μ νκ²½μμ μΌλ¨μ μμ μ μΌλ‘ μ λμνλ μνκΉμ§λ νΌμ μ¬λ €λμ΄ μλΉμ€νκ³ μμ΅λλ€.
Hexagonal Architecture
μμμ μ§νν νλ‘μ νΈλ μ²μμ Layered Architecture κΈ°λ°μΌλ‘ κ°λ°νμ΅λλ€. μλΉμ€λ₯Ό κ΅μ₯ν λΉ λ₯΄κ² κ°λ°ν μ μμμ§λ§ μΆμ μ΄ν νλ‘μ νΈμ μμ‘΄μ±μ΄ μ¬κΈ°μ κΈ° κΌ¬μ¬ μλ€λ μκ°μ νμ΅λλ€.
μ΄ λΆλΆμ κ°μ νκΈ° μν΄ μ¬λ¬ μν°ν΄κ³Ό μμ λ₯Ό μ€ν°λν΄κ°λ©° Hexagonal Architecture κΈ°λ°μΌλ‘ μ½λλ₯Ό λͺ¨μ‘°λ¦¬ μ¬μμ±ν ν νμλ€μκ² κ³΅μ νκ³ μ μ©νλλ°μ. μμ§λ 400κ° μ΄μμ νμΌ λ³κ²½μ λ³΄κ³ λλΌμλ νμ λΆλ€μ νμ μ΄ μνμ§ μμ΅λλ€.
맀ν λ‘μ§μ λ§μμ‘μ§λ§, λλ©μΈ λ‘μ§μ μμν¨μ μ§μΌλΌ μ μμλ€λ μ κ·Έλ¦¬κ³ μ°λ μλΉμ€μ μλ΅μ΄ λ¬λΌμ§κ±°λ μ°λ λμ μλΉμ€ μμ²΄κ° λ³νλλΌλ μ΄λν°μ λ‘μ§λ§ λ³κ²½ν΄λ λλ μ μ΄ κ°μ₯ ν° μ₯μ μΌλ‘ λ€κ°μμ΅λλ€.
μ§κΈ μμ λ€μ 보면 μμ ν λΆλΆμ΄λ κ°λ μ μΌλ‘ μ¬λ°λ₯΄κ² μ΄ν΄νμ§ λͺ»νκ³ μμ±ν μ½λλ€μ΄ λ§μ΄ 보μ΄λλ°μ. μ½λ λ 벨 μν€ν μ²μμ μ΄ μ λλ‘ κΉκ² κ³ λ―Όμ νκ³ μμ μ ν κ²μ μ²μμ΄λΌ μλ―Έ μλ κ²½νμ΄μλ κ² κ°μ΅λλ€. μ½λλ₯Ό μ€λͺ νλ©° νμλ€μ μ€λν κ²λ κ½€ κΈ°λΆ μ’μ κ²½νμ΄μꡬμ.
IDC νκ²½μ λ§λλ€
μλ§ μμ¦ κ°λ°μμ κΈΈμ μ€λΉνμλ λΆλ€μ λλΆλΆ ν΄λΌμ°λ νκ²½μ κΈ°λ°μΌλ‘ μΈνλΌλ₯Ό ꡬμ±νμλ κ²½νμ ν κ²μ λλ€. μ μμλ κ·Έλ¬κ³ , μ£Όλ‘ AWS νκ²½μμ Terraform κΈ°λ°μΌλ‘ μΈνλΌλ₯Ό μμ½κ² ꡬμ±νμμ΅λλ€.
μ¬ ν΄ μ²μμΌλ‘ IDC νκ²½μ λ©μΈμΌλ‘ μ 무λ₯Ό νμλλ°μ, μ΄ λΆλΆμ΄ μκ° μΈλ‘ μ½μ§ μμμ΅λλ€. νΉν μ νμ μΈ μΈνλΌλ₯Ό ν¨μ¨μ μΌλ‘ μ¬μ©νκΈ° μν κ³ λ―Όμ λ§μ΄ νλ μ΅κ΄μ λ€μΌ μ μμμ΅λλ€. μλ₯Ό λ€μ΄ ν΄λΌμ°λ νκ²½μμλ ν¬κ² μ κ²½ μ¨λ³Έ μ μλ DB μ€ν λ¦¬μ§ μ©λμ λν΄μλ μ κ²½μ μ¨μΌ νμ΅λλ€. μ¬μ€ μ μ μ 1λͺ λΉ λ°μ΄ν° μ * μ μ μ λ§νΌμ λ°μ΄ν°κ° λ°μνκΈ° λλ¬Έμ, μ΄λ° λΆλΆμ κ³ λ €ν΄μΌ νμ΅λλ€. μ΄ λλ¬Έμ μμ κ°μμΌλ©΄ λ³ μκ° μμ΄ DBμ λ¨κ²Όμ λ‘κ·Έμ± μ μ νλ λ°μ΄ν° λ± μ¬λ¬ λ°μ΄ν°μ λν΄μλ λ€μ λ°λΌλ³΄κ² λμλ κ² κ°μ΅λλ€.
Kubernetesλ₯Ό λ§λλ€
2022λ μλ 컨ν μ΄λ κΈ°λ°μΌλ‘ κ°λ°μ ν΄μ λ°°ν¬λ₯Ό νκΈ΄ νμ§λ§, λͺ¨λλ¦¬μ€ ννλ‘ μλΉμ€λ₯Ό λ°°ν¬νκΈ° λλ¬Έμ Kubernetesμ λν μμκ° κ·Έλ¦¬ ν¬μ§ μμκ³ AWS ECS Fargate κΈ°λ°μΌλ‘ λ°°ν¬λ₯Ό νμμ΅λλ€. ννΈμΌλ‘λ κ·Έλμ Kubernetes νκ²½μμ μΌνλ©΄ λ°±μλ κ°λ°μλ‘μ μ΄λ€ λλμΌκΉ κΆκΈνκΈ°λ νμ΅λλ€. μ΄λ¦λ κ·Έλ κ³ λ§ν¬λ κ΅μ₯ν λ©μμ΄ λ³΄μκ±°λ μ.
μ€μ λ‘ μμ κ²½νν΄λ³΄λ DevOps, SRE μ§κ΅°λΆλ€μ΄ K8S νκ²½κ³Ό λ°°ν¬ νμ΄νλΌμΈμ λͺ¨λ ꡬμ±ν΄λμ ¨κΈ° λλ¬Έμ μ€μ λ°±μλ κ°λ°μλ μΈνλΌμ λν΄μ ν¬κ² μ κ²½μΈ μΌμ΄ μκΈ΄ νμ§λ§, κ·Έλλ λ Έλ, νλ, μλΉμ€, μΈκ·Έλ μ€, μλΉμ€ λ©μ, Helm μ°¨νΈ λ± κ΅μ₯ν μλ‘μ΄ λΆλΆλ€μ λ§μ΄ λ°°μΈ μ μμμ΅λλ€.
μ 체 μλΉμ€ μΈνλΌλ₯Ό μ§ν±νκΈ° μν΄μ μ΄λ κ² λ§μ κ°λ λ€κ³Ό κΈ°μ μ΄ μ¬μ©λκ³ μμμ μμΌ λλκ³ , μ΄λ° μΈνλΌλ₯Ό μ§ν±νλ DevOps μ§κ΅°μ λν΄μλ ν₯λ―Έλ₯Ό λλΌκ² λλ κ²½νμ΄μμ΅λλ€.
μ¬μ΄λ νλ‘μ νΈ
νμ¬μμ νλ μΌ μ΄μΈμλ νκ΅ λκΈ°λ€κ³Ό μ¬μ΄λ νλ‘μ νΈλ₯Ό νλ μ§ννμλλ°μ. νλ‘μ νΈλ₯Ό κΈΈκ² μ§ννλ©΄μ λλ μ λ€λ κ°λ¨ν μ 리ν΄λ³΄λ € ν©λλ€.
νμ§λΆμ§
4λ μ νλΆμ μνμ νλ©΄μ νλ‘μ νΈλ₯Ό μ§ννλ©΄ νμ μ£λΆλ¦¬ κ°κ°ν΄μ νλ‘μ νΈλ₯Ό 리λνλ μν μ λ§μ΄ νμλλ°μ. μ΄λ° μ μ±κ²© νμ λ€λ₯Έ νμλ€μ΄ νλ‘μ νΈμ μ κ·Ήμ μΌλ‘ μ°Έμ¬ν μ μλ κΈ°νλ₯Ό λ§μ΄ λΉΌμμ κ²μ΄ μλκ° μΆμ μκ°μ νκ³€ νμ΅λλ€. κ·Έλμ μ΄λ² νλ‘μ νΈμμ μ 컨μ μ κΈ°νμ΄λ μλΉμ€ κ°λ°μ μ΅λν μ κ² μ°Έμ¬νκ³ , μμ¨μ μΌλ‘ νλ‘μ νΈλ₯Ό μ§νν μ μκ² μΈνλΌλ κ³΅ν΅ Gateway μλ²λ₯Ό ꡬμΆν΄μ£Όλλ‘ νμ μμ΅λλ€.
νμ§λ§ μ¬λ¬ νκ³μ λ€μ΄ 볡ν©μ μΌλ‘ μμ©νλ©΄μ ν΄λΉ νλ‘μ νΈλ νμ§λΆμ§ λλκ² λμκ³ λ§μ§λ§κΉμ§ FEμ BEκ° μ°λλμ΄ λμνλ λͺ¨μ΅μ λ³΄μ§ λͺ»νμ΅λλ€. νλ‘μ νΈκ° μ΄λ κ² μμ½κ² λλ μ΄μ λ₯Ό κ°λ¨ν μ§μ΄λ³΄λ €κ³ ν©λλ€.
κΈ°νλ ₯μ΄ ν¬κ² νμν μ΄λ €μ΄ μ£Όμ
μ ν¬μ μ£Όμ λ μ€ν°λλ₯Ό λͺ¨μ§νκ³ μ§νν μ μλ νλ«νΌμ΄μμ΅λλ€. μ΄ν ν΄λΉ μ€ν°λμ λ΄μ©μ κΈ°λ°μΌλ‘ λΈλ‘κΉ κΉμ§ μ§μν μ μλλ‘ νλ€λ μΌμ¬μ°¬ κΏμ μΈμ μ§μ.
λ¬Έμ λ μ΄λ° νλ«νΌμ μμ±νκΈ° μν΄μ κΈ°νλ ₯μ ν¬κ² μνλ€λ κ²μ΄μμ΅λλ€. λ€λ€ κ°λ°μλ‘ κ΅¬μ±λμ΄ μμκΈ° λλ¬Έμ κΈ°νμ μ΄λμ΄ λκ°κΈ°μ νμν 곡μκ° λ무λλ μ»Έμ΅λλ€. κ±°κΈ°λ€ μ£Όμ μ체λ μ΄λ―Έ μ‘΄μ¬νλ μ λͺ ν μλΉμ€κ° μμ§λ, μ ννλ ννκ° μμ§λ μλ€ λ³΄λ νλ‘λνΈλ₯Ό μ€κ³νλ κ² μμ²΄κ° μ½μ§ μμμ΅λλ€.
μ μ΄λ μ λͺ ν μλΉμ€κ° μλ€λ©΄ λ€λ€ βμ κ·Έλ°κ±°!βλΌλ μμΌλ‘ μ§κ΄μ μΈ μ μΆλ₯Ό ν΄κ°λ©° 곡κ°μ νκ³ λμκ° μ μμμν λ°, κ·Έλ° λΆλΆμ΄ μ ν μμκΈ°μ κΈ°νλ λμμΈλ κ°λ°λ λͺ¨λ μ΄λ €μ λ κ² κ°μ΅λλ€.
루μ¦ν μΌμ κ΄λ¦¬
맀 μ£Όλ§λ€ λΉλλ©΄μΌλ‘ μ§μ²λλ₯Ό 체ν¬νκΈ°λ νμ§λ§, κ·Έ λꡬλ μΌμ μ λν μλ°μ νμ§ μμμ΅λλ€. μ κ° νμλ€μ λͺ¨μ λ ν μ΄μΌκΈ°λ βλΆλ΄ μμ΄ μ²μ²ν ν¨κ» μ±μ₯νλ νλ‘μ νΈβλΌκ³ νμκΈ°μ μΌμ μ λν΄μλ λΆλ΄μ λλΌμ§ μμμΌλ©΄ νλ μκ°λ μ»Έμ΅λλ€.
μ무λλ μ΄λ² μ¬λ‘λ₯Ό ν΅ν΄μ λΆλ΄ μμ΄ μ²μ²ν ν¨κ» μ±μ₯νλ νλ‘μ νΈλΌλ λͺ¨λΈμ μ 무 μ΄μΈμ μ§ννλ μ¬μ΄λ νλ‘μ νΈμλ μ μ©νκΈ° μ΄λ ΅λ€ κ²°λ‘ μ§κ² λ κ² κ°μ΅λλ€. λ€λ€ ν΄κ·Ό μ΄ν νλ μνλ‘ μΆκ°μ μΈ λ¬΄μΈκ°λ₯Ό ν΄μΌ νκΈ° λλ¬Έμ ν° μκΈ° λκΈ°κ° μμ§ μμΌλ©΄ μ ν΄μ§ μΌμ μ λν κ΄λ¦¬ μμ΄ νλ‘μ νΈλ₯Ό μ§ννλκ² μ½μ§ μλ€κ³ μκ°νκ² λμ΅λλ€.
λμ μΈνλΌ λ¬λ컀λΈ
μ΄λ² νλ‘μ νΈλ₯Ό μμμΌλ‘ μ΄ νμμ μ¬λ¬κ°μ§ μλΉμ€λ₯Ό μμΌλ‘ ν¨κ» κ°λ°νκ² λ€λ μμ¬μ κ°μ§κ³ μμμ΅λλ€.
μ¬λ¬κ°μ§ μλΉμ€λ₯Ό νλμ κ³μ μΌλ‘ μ¬μ©ν μ μκ² νκΈ° μν΄μ ν΅ν© μΈμ¦ μλ²λ₯Ό ꡬμ±νκ³ , μ¬λ¬κ°μ§ μλΉμ€μ λν μΈμ¦μ κ·Έ μλ² νλμμ μ²λ¦¬ν λ€μ κ³μ μ IDλ₯Ό ν€λμ μ¬μ΄μ λ·λ¨ μλΉμ€λ‘ μ λ¬νλλ‘ κ²μ΄νΈμ¨μ΄λ₯Ό ꡬμ±νμ΅λλ€. λ§λ‘λ§ λκ³ λ³΄λ©΄ μ΄λ μ λ μμ°μ€λ¬μ΄ μΈνλΌ κ΅¬μ±μ΄μμ§λ§, νμλ€μ TypeScript κΈ°λ°μΌλ‘ NestJsλ₯Ό μ²μ μ€ν°λνλ©° λ°±μλ μλ²λ₯Ό ꡬμ±νλ μ μ₯μ΄μκΈ° λλ¬Έμ μ΄ λΆλΆμ΄ λμ λ¬λ 컀λΈλ‘ λ€κ°μ¨ κ² κ°μ΅λλ€.
κ±°κΈ°λ€ λ μ μ μΌλ‘ μΈνλΌμ κ²μ΄νΈμ¨μ΄ μν€ν μ²λ₯Ό ꡬμνκ³ κ°λ°νκΈ° λλ¬Έμ νμλ€μ 곡κ°λ ν¬κ² μ»μ§ λͺ»ν κ² κ°μ΅λλ€. μμ½κ²λ λμ€μλ νμλ€μ μΌμ μ΄μκ° κ²Ήμ³ λ§μ§λ§κΉμ§ κ²μ΄νΈμ¨μ΄μ μλΉμ€ μλ²λ₯Ό μ°λνμ§ λͺ»νκ³ νλ‘μ νΈλ₯Ό λ§λ¬΄λ¦¬νκ² λμμ΅λλ€.
κ°λ°, μΈνλΌ
νλ‘μ νΈκ° μμ½κ² νμ§λΆμ§ λλκ² λμμ§λ§, κ·Έλλ μΈνλΌμ μ λ° μν€ν μ²λ₯Ό ꡬμ±νλ©΄μ μλ‘μ΄ κΈ°μ λ λ§μ΄ μ¨λ³΄κ³ λ°°μΈ μ μμμ΅λλ€.
μΈνλΌ νκ²½ μ¬νκΈ°
μ₯κΈ° μ¬μ΄λ νλ‘μ νΈ νμ ꡬμν λ κ°λ°μλΌλ©΄ λ¬΄λ¦ μΈνλΌ λΉμ©μ ν¨κ» μκ°νκ² λ©λλ€. κ³μν΄μ μλΉμ€κ° λμ΄λκ² λ ν λ λΆλ΄ν΄μΌ νλ λΉμ©λ λμ΄λ κ²μΌλ‘ μμν΄μ, κ·Έλ₯ μ ν¬ μ§μ μ¨νλ νκ²½μΌλ‘ μμ μλ²λ₯Ό ꡬμ±ν΄λκ³ κ±°κΈ°μ μλ λ°°ν¬κ° κ°λ₯νλλ‘ μλΉμ€λ₯Ό ꡬμ±νμ΅λλ€.
μ²μμ μλΉμ€λ€μ λ°°ν¬νκΈ° μν΄ λ§₯ λ―Έλλ₯Ό μ²μ ꡬ맀ν΄μ docker compose κΈ°λ°μΌλ‘ μλΉμ€λ₯Ό λ°°ν¬νμμ΅λλ€. μ΄ νκ²½μμ λ°°ν¬λ₯Ό μννκΈ° μν΄ GitHub Actionsμμ Ansibleμ νμ©νμ¬ ssh λͺ λ Ήμ μ€ννλ μμΌλ‘ μ²μ μΈνλΌλ₯Ό ꡬμ±νμμ΅λλ€.
μ΄ν λ§₯ λ―Έλ νλλ‘λ λΆμ‘±νκ² λ€λ νλ¨μ΄ λ€μ΄ λ―Έλ PCλ₯Ό 3λ ꡬ맀νμ΅λλ€. μ΄ PC 3λλ₯Ό λ¬Άμ΄μ Kubernetesλ₯Ό ꡬμ±ν΄λ³΄λ €κ³ νμ΅λλ€λ§, μλ§μ κ°λ μλλΉν΄ κ²°κ΅ κ΅¬μ±νμ§ λͺ»νκ³ ν¨μ¬ μ μ©νκΈ° μ¬μ΄ Docker Swarm ννλ‘ ν΄λ¬μ€ν°λ₯Ό ꡬμ±νμ΅λλ€. κ·Έλ¦¬κ³ μ΄ νκ²½ μμμ Nginxλ‘ API Gatewayλ ꡬμ±νκ³ , μΈμ¦μ λ΄λΉνλ μΈμ¦ μλ²λ κ°λ°ν΄ λ·λ¨ μλΉμ€λ₯Ό κ° λ λ°λμ μΈμ¦ μλ²λ₯Ό κ±°μ³μ κ°λλ‘ νλ νλ¦λ ꡬμ±νμ΅λλ€. λ°°ν¬λ μ¬μ ν Ansibleμ ν΅ν΄μ ssh λͺ λ Ήμ μ€ννλ μμΌλ‘ λμ΄ μμμ΅λλ€. κ²°κ΅ Kubernetesλ₯Ό νλ²μ μ¬μ©ν΄λ³΄κ³ μΆλ€λ μκ°μ K3S κΈ°λ°μΌλ‘ ν΄λ¬μ€ν°λ₯Ό μ΄μ νκ³ , Helm Chartλ ArgoCD λ±μ μ μ©νμ¬ GitHub Actions μμλ Ansibleμ κ±·μ΄λ΄κ³ μ‘°κΈ λ λμ λ°©λ²μΌλ‘ λ°°ν¬ νλ‘μΈμ€λ₯Ό ꡬμ±νμ΅λλ€.
μκ³ κ·μ½μ§λ§ μ¨νλ νκ²½μμ K8S λ Έλ 3κ°λ₯Ό κ΅΄λ €μ ν΄λ¬μ€ν°λ₯Ό ꡬμ±ν΄λ³΄κ³ λ°°ν¬ νμ΄νλΌμΈκΉμ§ μ§μ ꡬμΆν΄λ³΄λ κ·μ€ν κ²½νμ ν κ² κ°μ΅λλ€.
Ktor
νμ¬μμ Kotlinμ μ¬μ©νλ€ λ³΄λ μ΄ μΈμ΄κ° κ΅μ₯ν μλ¬Όλ‘ λκ»΄μ‘μ΅λλ€. κ·Έλμ Spring μ΄μΈμ νμ©ν μ μλ νλ μμν¬λ₯Ό μ°Ύμλ³΄λ€ Ktorλ₯Ό λ§λκ² λμμ΅λλ€. Coroutines κΈ°λ°μΌλ‘ λ‘μ§μ μμ±ν μ μλ κ²½λ νλ μμν¬μΈλ°, Springμ΄ NestJs λΌλ©΄ Ktorλ express κ°μ λλμ΄μμ΅λλ€. μ¬μ΄λ νλ‘μ νΈμμ νμ©ν μΈμ¦ μλ²λ Ktor κΈ°λ°μΌλ‘ ꡬμ±νλλ°μ, λ‘μ§μ΄ ν¬λͺ νκ² λͺ¨λ λλ¬λμλ¨ μ μμ μ·¨ν₯μ λ°λΌ μ νν μ μλ νλ μμν¬λΌλ μκ°μ΄ λ€μμ΅λλ€.
μ΄μΈμλ
Goλ‘λ μ€λλ§μ κΊΌλ΄μ μλ²λ νλ² μμ±ν΄λ³΄κ³ νμλλ°μ, λ무 λ μΉκΈ°λ‘ 곡λΆνκ³ λ‘μ§μ μμ±νμ΄μ.. μμ½μ΅λλ€. λ©λͺ¨λ¦¬ Footprintκ° μ λ§ λλλ§νΌ μμμ, λμ€μ λ€μ νλ² κΌ νμ©ν΄λ³΄κ³ μΆμ΅λλ€.
μμΌλ‘λ?
λ€μ μ£Όλμ μΌλ‘ νλ‘μ νΈλ₯Ό 리λνλ λ°©ν₯μΌλ‘ κ°λ³΄λ €κ³ ν©λλ€. μ΄λ¬λμ λ¬λ λλ μ λ€μ΄ λ§κΈ°λ νμ§λ§ κ·Έλ₯ μ μ±κ²©μ΄ μ΄λ κ² μ겨먹μ κ² κ°λ€λ μκ°λ λλ€μ. νλ‘μ νΈλ₯Ό μ 리λνλ©΄μ, νμλ€μ μ‘΄μ€ν μ μλ νλλ₯Ό κ°μΆλ κ²μ΄ μ€νλ € ν¨κ» μμν μ μλ λ°©ν₯μ΄ μλκΉ μΆμ μκ°μ λλ€.
κΈ°μ μ μΌλ‘λ λ무 λμ λ¬λ컀λΈλ₯Ό κ°μ Έκ°μ§ μμΌλ €κ³ ν©λλ€. λ°±μλλ§ λκ³ λ³΄λ©΄ λͺ¨λ리μ κ΅¬μ‘°λ‘ μλΉμ€λ₯Ό λͺ¨λ ꡬνν λ€μ, μ΄κ²μ λλ μΌ ν μ§, λλλ€λ©΄ μ΄λ»κ² λλ μΌ ν μ§ λ±μ λΆλΆμ λ Όμν΄μ νμλ€μ 곡κ°μ κΈ°λ°μΌλ‘ νλ‘μ νΈλ₯Ό μ§ννλ κ²μ΄ λ§μ κ² κ°μ΅λλ€.
κ°μΈ
λ§μ§λ§μΌλ‘ κ°μΈμΌλ‘μμ ν ν΄λ₯Ό λμλ³΄λ € ν©λλ€. μ΄ λΆλΆμ λΆμ λ₯Ό λλμ§ μκ³ κ°λ¨ν ν΄λ³΄λ €κ³ νλλ°μ.
μΈμ λ κ·Έλ λ―μ΄ λ§μ΄ μμ¬μμ λλ κ² κ°μ΅λλ€. ν΄λ³΄κ³ μΆμ νλ‘μ νΈλ, νκ³ μΆμ 곡λΆλ λ§μμ§λ§ κ³ν λ¨κ³ κΉμ§λ κ°μ§ λͺ»νκ³ μ’μ λ κ²λ€μ΄ λ§μλ κ² κ°μ΅λλ€.
μ¬λ¬ κΈ°μ μμ μ ꡬ맀νμ§λ§, μ§μ§ κ²μΌλ‘ νμ΄λ³΄κΈ°λ§ νκ³ λ΄μ©μ΄ νλλ κΈ°μ΅λμ§ μλ μ± λ€λ λ§μ μ λμ΄λ νμ¬λ μ¬μ΄λ νλ‘μ νΈμ λμμ λ°μ§ μκ³ μ€μ€λ‘ μ΄λ€λΈ μ±μ₯μ΄ μ°Έ λͺ¨μλΌλ€λ μκ°μ΄ λλ€μ.
μ¬ ν΄λ 곡λΆλ κ·Έλ¦¬κ³ λ©λͺ¨λ λ§μ΄ νκ³ , μ€μ€λ‘ μλ―Έ μλ μ 보λ λ§μ΄ μ΅λνκ³ λ μ λ§μ μΈμ΄λ‘ νμ΄λ΄λ³΄λ μκ°μ λ§μ΄ κ°μ Έλ³΄κ³ μΆμ΅λλ€.
λ§λ¬΄λ¦¬
λ§μ΄ λ°°μ°κ³ , λ§μ΄ μμ¬μ λ 2023λ μ΄μμ΅λλ€.
μ΄μ νμ¬μ CTO λμ΄ κ°λ°ν λ¬Ένλ₯Ό μ€λͺ νλ λ Έμ μ μ μ΄λμ ¨λ, μ κ° μ λ§ μ’μνλ λ¬Έκ΅¬κ° μλλ°μ.
3κ°μ μ μ λμ λΉκ΅νμ λ λ΄κ° μ§κΈ μ±μ₯νκ³ μλ λ°©ν₯μ μ€λͺ ν μ μμ΄μΌ νκ³
6κ°μ μ μ λμ λΉκ΅νμ λ λ΄κ° μ§κΈ μ±μ₯νκ³ μλ μλλ₯Ό 보μ¬μ€ μ μμ΄μΌ νκ³
1λ μ μ λμ λΉκ΅νμ λ λ΄κ° μ§κΈ μΌλ§νΌ μ±μ₯νλμ§λ₯Ό μ¦λͺ ν μ μμ΄μΌ ν©λλ€.
νλλΌλ ν΄λΉνμ§ μλλ€λ©΄ μκΈ°μμμ κ°μ ΈμΌ ν©λλ€.
μ΄λ€ λ°©ν₯μΌλ‘ λμκ°μ§, μ΄λ€ μλλ‘ μ±μ₯ν μ§, μ΄λ€ λμ μ±μ₯μ μ¦λͺ ν μ μμμ§ μ§κΈμ μ ν μμΈ‘ν μ μμ§λ§ μ΄ 3κ°μ, 6κ°μ, 1λ μ΄ μ§λ λ 문ꡬλ₯Ό λ§μ‘±ν μ μλ ν ν΄κ° λμμΌλ©΄ ν©λλ€.
λμ μλ λλ리 μ½μ΄μ£Όμ λΆλ€ κ°μ¬ν©λλ€. λ€λ€ μν΄ λ³΅ λ§μ΄ λ°μΌμΈμ!
λ.