
SOLID μμΉμ΄λ?
SOLIDλ κ°μ²΄μ§ν₯ νλ‘κ·Έλλ°(OOP)μμ μ μ§λ³΄μμ±κ³Ό νμ₯μ±μ λμ΄κΈ° μν΄ μ μλ 5κ°μ§ μ€κ³ μμΉμ λ§ν©λλ€.
λ‘λ²νΈ C. λ§ν΄(Robert C. Martin, νν 'ν΄λ¦° μ½λ'μ μ μ)μ΄ μ 리ν κ°λ
μ
λλ€.
μλμμλ μμ½ → μμΈ μ€λͺ → μμ κ΅¬μ‘°λ‘ κΉλνκ² μ λ¦¬ν΄ λ릴κ²μ.
π SOLID 5λ μμΉ μμ½
| S | λ¨μΌ μ± μ μμΉ (Single Responsibility Principle) | ν΄λμ€λ νλμ μ± μλ§ κ°μ ΈμΌ νλ€ |
| O | κ°λ°©-νμ μμΉ (Open/Closed Principle) | κΈ°λ₯μ νμ₯μλ μ΄λ € μκ³ , λ³κ²½μλ λ«ν μμ΄μΌ νλ€ |
| L | 리μ€μ½ν μΉν μμΉ (Liskov Substitution Principle) | μμ ν΄λμ€λ λΆλͺ¨ νμ μ λ체ν μ μμ΄μΌ νλ€ |
| I | μΈν°νμ΄μ€ λΆλ¦¬ μμΉ (Interface Segregation Principle) | λΆνμν κΈ°λ₯μ΄ ν¬ν¨λ ν¬κ³ λ±λ±ν μΈν°νμ΄μ€λ₯Ό λλ λΌ |
| D | μμ‘΄ μμ μμΉ (Dependency Inversion Principle) | μμ λͺ¨λμ νμ λͺ¨λμ μμ‘΄νλ©΄ μ λκ³ , μΆμνμ μμ‘΄ν΄μΌ νλ€ |
S: λ¨μΌ μ± μ μμΉ (SRP - Single Responsibility Principle)
μ΄ μμΉμ "νλμ ν΄λμ€λ νλμ, μ€μ§ νλμ μ± μλ§ κ°μ ΈμΌ νλ€"κ³ μ΄μΌκΈ°ν΄μ. μ¦, ν΄λμ€λ₯Ό λ³κ²½ν΄μΌ νλ μ΄μ λ λ¨ νλλΏμ΄μ΄μΌ νλ€λ λ»μ λλ€. λ§μ½ ν ν΄λμ€κ° λ무 λ§μ μ± μμ μ§κ² λλ©΄, ν κΈ°λ₯μ μμ νμ λ μλμΉ μκ² λ€λ₯Έ κΈ°λ₯μκΉμ§ μν₯μ μ€ μ μμ΄μ μ μ§λ³΄μκ° λ§€μ° μ΄λ €μμ§ μ μμ΄μ. λ°λΌμ μ± μλ€μ μκ² μͺΌκ°μ΄ λΆλ¦¬νλ κ²μ΄ μ€μνλ΅λλ€. μλ₯Ό λ€μ΄, μνμ κΈλ¦¬ κ³μ° ν΄λμ€κ° μμ (μκΈ) κΈλ¦¬ κ³μ°κ³Ό μ¬μ (λμΆ) κΈλ¦¬ κ³μ°μ λμμ λ΄λΉνλ λμ , κ°κ°μ μ± μμ λΆλ¦¬νμ¬ κ°λ³ ν΄λμ€λ‘ λ§λλ κ²μ΄ SRPλ₯Ό μ λ°λ₯΄λ λ°©λ²μ΄ λ μ μμ΄μ.
O: κ°λ°©-νμ μμΉ (OCP - Open-Closed Principle)
"νμ₯μλ μ΄λ € μμ΄μΌ νκ³ , λ³κ²½μλ λ«ν μμ΄μΌ νλ€"λ μμΉμ λλ€. μ΄ λ§μ κΈ°μ‘΄ μ½λλ₯Ό μμ νμ§ μκ³ λ μλ‘μ΄ κΈ°λ₯μ μΆκ°νκ±°λ λ³κ²½ν μ μλλ‘ μ€κ³ν΄μΌ νλ€λ μλ―Έμμ. μλ‘μ΄ μꡬμ¬νμ΄ λ°μνμ λ κΈ°μ‘΄ μ½λλ₯Ό 건λλ¦¬μ§ μκ³ μλ‘μ΄ μ½λλ₯Ό μΆκ°νλ λ°©μμΌλ‘ κΈ°λ₯μ νμ₯ν μ μλλ‘ μ€κ³νλ κ²μ΄ λͺ©νμ λλ€.
L: 리μ€μ½ν μΉν μμΉ (LSP - Liskov Substitution Principle)
"μμ ν΄λμ€λ μΈμ λ λΆλͺ¨ ν΄λμ€λ₯Ό λ체ν μ μμ΄μΌ νλ€"λ μμΉμ΄μμ. μ¦, λΆλͺ¨ ν΄λμ€μ κ°μ²΄κ° λ€μ΄κ° μ리μ μ΄λ€ μμ ν΄λμ€μ κ°μ²΄λ₯Ό λ£μ΄λ νλ‘κ·Έλ¨μ λμμ΄ μλ μλλλ‘ λ¬Έμ μμ΄ μλν΄μΌ νλ€λ λ»μ΄λλλ€. λ€νμ±μ μ¬λ°λ₯΄κ² νμ©νκΈ° μν μ€μν μ§μΉ¨μ΄μ£ .
I: μΈν°νμ΄μ€ λΆλ¦¬ μμΉ (ISP - Interface Segregation Principle)
"ν΄λΌμ΄μΈνΈλ μμ μ΄ μ¬μ©νμ§ μλ λ©μλμ μμ‘΄ν΄μλ μ λλ€"λ μμΉμ λλ€. λ€μ λ§ν΄, μΈν°νμ΄μ€λ₯Ό λ무 ν¬κ³ λ²μ©μ μΈ κ²μΌλ‘ λ§λ€κΈ°λ³΄λ€λ, ν΄λΌμ΄μΈνΈμ μ©λμ λ§κ² μκ³ κ΅¬μ²΄μ μΈ μ¬λ¬ μΈν°νμ΄μ€λ‘ λΆλ¦¬νλ κ²μ΄ μ’μ΅λλ€. ν΄λΌμ΄μΈνΈκ° λΆνμν κΈ°λ₯κΉμ§ νκΊΌλ²μ ν¬ν¨λ μΈν°νμ΄μ€λ₯Ό ꡬννλλ‘ κ°μ νμ§ μκΈ° μν¨μ΄μμ.
D: μμ‘΄κ΄κ³ μμ μμΉ (DIP - Dependency Inversion Principle)
μ΄ μμΉμ "κ³ μμ€ λͺ¨λμ μ μμ€ λͺ¨λμ μμ‘΄ν΄μλ μ λλ©°, μ΄λ€ λͺ¨λ μΆμνμ μμ‘΄ν΄μΌ νλ€. λν μΆμνλ μΈλΆ μ¬νμ μμ‘΄ν΄μλ μ λλ©°, μΈλΆ μ¬νμ μΆμνμ μμ‘΄ν΄μΌ νλ€"κ³ μ€λͺ ν©λλ€. μ½κ² λ§ν΄, ꡬ체μ μΈ κ΅¬ν체(μ μμ€ λͺ¨λ)보λ€λ μΆμμ μΈ κ°λ (μΈν°νμ΄μ€λ μΆμ ν΄λμ€)μ μμ‘΄νμ¬ μ€κ³ν΄μΌ νλ€λ λ»μ΄μμ. μλ₯Ό λ€μ΄, 컀νΌλ₯Ό μ μ‘°νλ κ³ μμ€ ν΄λμ€κ° νΉμ λΈλλμ μ»€νΌ λ¨Έμ μ΄λΌλ μ μμ€ κ΅¬ν체μ μ§μ μμ‘΄ν기보λ€λ, 'μ»€νΌ μΆμΆ μΈν°νμ΄μ€'μ κ°μ μΆμνλ κ°λ μ μμ‘΄νλ©΄ λμ€μ λ€λ₯Έ μ’ λ₯μ μ»€νΌ λ¨Έμ μΌλ‘ κ΅μ²΄ν΄λ κ³ μμ€ ν΄λμ€λ λ³κ²½ μμ΄ μ¬μ©ν μ μμ΅λλ€.
μ΄ SOLID μμΉλ€μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ κΈ°λ°μ΄ λλ μ€μν κ°λ λ€
π μμΉλ³ μμΈν μ€λͺ
1) λ¨μΌ μ± μ μμΉ (SRP)
ν΄λμ€κ° μ¬λ¬ μΌμ νλ©΄ κ²°ν©λκ° λμμ§κ³ μμ μ λ€λ₯Έ κΈ°λ₯κΉμ§ μν₯μ λ°μ΅λλ€.
→ ν ν΄λμ€λ ν κ°μ§ μν λ§!
μμ:
Order ν΄λμ€κ° μ£Όλ¬Έ μμ± + κ²°μ μ²λ¦¬ + μμμ¦ μΆλ ₯κΉμ§ λ΄λΉνλ©΄ X
→ Order, PaymentService, ReceiptPrinter λ±μΌλ‘ λΆλ¦¬νλ κ²μ΄ λ°λμ§
2) κ°λ°©-νμ μμΉ (OCP)
κΈ°λ₯μ νμ₯ν΄μΌ νλ©΄ κΈ°μ‘΄ μ½λλ₯Ό λ―μ΄κ³ μΉλ λμ , μ ν΄λμ€λ₯Ό μΆκ°ν΄μ νμ₯νλ λ°©μμΌλ‘ μ€κ³ν΄μΌ νλ€λ μλ―Έμ λλ€.
μμ:
μλ‘μ΄ ν μΈ μ μ±
μΆκ° μ κΈ°μ‘΄ DiscountServiceλ₯Ό μμ νλ λμ
DiscountPolicy μΈν°νμ΄μ€λ₯Ό λ§λ€κ³ NewYearDiscount, VIPDiscount λ±μ μΆκ°
3) 리μ€μ½ν μΉν μμΉ (LSP)
λΆλͺ¨ ν΄λμ€λ₯Ό μ¬μ©νλ μ½λκ° μμ ν΄λμ€λ‘ λ°κΏλ μ μ μλν΄μΌ νλ€λ μμΉμ λλ€.
μμ:
Bird ν΄λμ€μ fly()κ° μλλ°, λ μ§ λͺ»νλ Penguinμ΄ Birdλ₯Ό μμνλ©΄? → LSP μλ°
→ μΈν°νμ΄μ€ λΆλ¦¬ νμ
4) μΈν°νμ΄μ€ λΆλ¦¬ μμΉ (ISP)
"νμ μλ κΈ°λ₯κΉμ§ μ΅μ§λ‘ ꡬννκ² νμ§ λ§λΌ."
μ¦, ν° μΈν°νμ΄μ€λ₯Ό μ¬λ¬ κ°μ μμ μΈν°νμ΄μ€λ‘ λλλΌλ μμΉμ
λλ€.
μμ:
Animal μΈν°νμ΄μ€ μμ run(), fly(), swim()μ΄ λͺ¨λ μμΌλ©΄
λλΆλΆμ λλ¬Όμ λΆνμν κΈ°λ₯μ ꡬννκ² λ©λλ€.
→ Runnable, Flyable, Swimmableλ‘ λΆλ¦¬νλ κ²μ΄ μ΄μμ
5) μμ‘΄ μμ μμΉ (DIP)
μμ λͺ¨λ(λΉμ¦λμ€ λ‘μ§)μ΄ νμ λͺ¨λ(ꡬν μΈλΆμ¬ν)μ μμ‘΄νλ©΄ λ³κ²½μ μ·¨μ½ν΄μ§.
→ κ³ μμ€μ μ μμ€μ μμ‘΄νμ§ μκ³ λ λ€ μΆμνμ μμ‘΄ν΄μΌ νλ€λ μμΉμ
λλ€.
μμ:
PaymentServiceκ° KakaoPay ν΄λμ€μ μ§μ μμ‘΄νλ©΄ λ€λ₯Έ κ²°μ μλ¨ μΆκ°κ° μ΄λ €μ
→ PaymentGateway μΈν°νμ΄μ€λ₯Ό λ§λ€κ³ ,
KakaoPay, NaverPay, CreditCard λ±μ΄ μ΄λ₯Ό ꡬννλλ‘ μ€κ³
π¬ ν μ€λ‘ μ 리νλ©΄?
SOLIDλ μ½λκ° μ»€μ Έλ μ μ§λ³΄μνκΈ° μ½κ² λ§λλ κ°μ²΄μ§ν₯ μ€κ³μ κΈ°λ³Έ μ² νμ λλ€.
λ―Έλ€μ¨μ΄(Middleware)λ?
λ―Έλ€μ¨μ΄λ μ΄λ¦μμ μ μ μλ―μ΄ 'μ€κ°(Middle)'κ³Ό 'μννΈμ¨μ΄(Software)'μ ν©μ±μ΄μ λλ€. μ΄μ 체μ μ μ ν리μΌμ΄μ μ¬μ΄μ μ‘΄μ¬νλ©°, λΆμ° μ»΄ν¨ν νκ²½μμ μ¬λ¬ μ»΄ν¨ν°λ μμ€ν μ΄ μλ‘ μννκ² μ°κ²°λκ³ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ μ μλλ‘ λμμ£Όλ λ§€κ°μ²΄ μν μ νλ μννΈμ¨μ΄μμ.
μ½κ² λΉμ νμλ©΄, μλ‘ λ€λ₯Έ μΈμ΄λ₯Ό μ¬μ©νλ λ μ¬λμ΄ λνν λ ν΅μμ¬λ λ²μκΈ°κ° νμν κ²κ³Ό λΉμ·ν΄μ. κ°κΈ° λ€λ₯Έ κΈ°λ₯μ νλ μννΈμ¨μ΄ μ»΄ν¬λνΈλ μμ€ν μ΄ λ³΅μ‘ν κ³Όμ μμ΄ μν΅ν μ μλλ‘ μ€κ°μμ λ²μ, λ³ν, μ€κ° λ±μ μν μ μννλ κ²μ΄μ£ .
λ―Έλ€μ¨μ΄μ μ£Όμ μν
λ―Έλ€μ¨μ΄λ λ¨μ§ μ°κ²°λ§ νλ κ²μ΄ μλλΌ, μμ€ν μ μμ μ±κ³Ό ν¨μ¨μ±μ λμ΄λ λ€μν κΈ°λ₯μ μ 곡ν©λλ€.
- λ°μ΄ν° κ΅ν λ° ν΅ν©: μλ‘ λ€λ₯Έ μμ€ν μ΄λ μ ν리μΌμ΄μ μ΄ λ°μ΄ν°λ₯Ό μ½κ² μ£Όκ³ λ°κ³ ν΅ν©ν μ μλλ‘ λμ΅λλ€.
- λΆμ° μ»΄ν¨ν μ§μ: λ€νΈμν¬λ₯Ό ν΅ν΄ μ°κ²°λ μ¬λ¬ μ»΄ν¨ν°λ€ κ°μ ν΅μ μ κ΄λ¦¬νλ©°, λΆμ°λ νκ²½μμ μ ν리μΌμ΄μ μ΄ μμ νκ³ ν¨μ¨μ μΌλ‘ μλνλλ‘ μ§μν©λλ€.
- 보μ λ° μΈμ¦: λ°μ΄ν°μ 보μμ κ°ννκ³ , μ¬μ©μλ μμ€ν μ μ κ·Ό κΆνμ κ΄λ¦¬νλ μν μ ν μλ μμ΅λλ€.
- νΈλμμ κ΄λ¦¬: μ¬λ¬ μμ μ΄ νλμ λ¨μλ‘ μ²λ¦¬λλλ‘ νμ¬ λ°μ΄ν°μ 무결μ±μ μ μ§νλ λ° κΈ°μ¬ν©λλ€.
- λ©μμ§: λΉλκΈ°μ μΌλ‘ λ©μμ§λ₯Ό μ£Όκ³ λ°λ κΈ°λ₯μ μ 곡νμ¬ μμ€ν κ°μ μ μ°ν μ°λμ κ°λ₯νκ² ν©λλ€.
- νλ«νΌ μ§μ: μ ν리μΌμ΄μ κ°λ°μ μ§μνκΈ° μν κ΄λ¦¬ν λꡬ λ° λ¦¬μμ€ μ²΄κ³λ₯Ό μ 곡ν©λλ€. λ°νμ νκ²½, μΉ μλ², μ½ν μΈ κ΄λ¦¬ μμ€ν (CMS), 컨ν μ΄λ λ±μ΄ κ·Έ μμκ° λ μ μμ΅λλ€.
λ―Έλ€μ¨μ΄μ μμ
μΌμμμ νν μ νλ μΉ μλΉμ€μλ λ―Έλ€μ¨μ΄κ° λ§μ΄ νμ©λκ³ μμ΄μ.
- λ°μ΄ν°λ² μ΄μ€ λ―Έλ€μ¨μ΄: λ°μ΄ν°λ² μ΄μ€μ μ ν리μΌμ΄μ μ¬μ΄μμ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°λ μν μ ν©λλ€. (μ: JDBC, ODBC)
- μΉ λ―Έλ€μ¨μ΄(WAS - Web Application Server): μΉ μλ²μ μΉ μ ν리μΌμ΄μ μ¬μ΄μμ λμ μΈ μ½ν μΈ λ₯Ό μ²λ¦¬νκ³ λ°μ΄ν°λ² μ΄μ€ μ°λ λ±μ λ΄λΉν©λλ€. (μ: Apache Tomcat, Nginx, Node.jsμ Express.js κ°μ νλ μμν¬λ λμ μλ―Έμμ λ―Έλ€μ¨μ΄ μν μ ν©λλ€.)
- λ©μμ§ μ§ν₯ λ―Έλ€μ¨μ΄ (MOM - Message-Oriented Middleware): μμ€ν κ°μ λΉλκΈ° λ©μμ§ ν΅μ μ λ΄λΉν©λλ€. (μ: Apache Kafka, RabbitMQ)
μ€ν μ΄μμ κ²μ΄νΈμ¨μ΄λ‘ μ°κ²°ν κ±΄λ° μ λ μΉ΄λ λμ€μ»€λ²λ¦¬ μ€μ μ΄λλ‘ μ°κ²°ν΄μΌ μ’μ?
β κ²°λ‘ : μ€ν μ΄λ λμ€μ»€λ²λ¦¬ μλ²(Eureka Server) μ λ±λ‘νκ³
β κ²μ΄νΈμ¨μ΄λ λμ€μ»€λ²λ¦¬(Eureka) λ₯Ό ν΅ν΄ μ€ν μ΄λ₯Ό μ°Ύλλ€.
μ¦ μ°κ²° λμμ μ λ μΉ΄(Eureka Server) μΌ.
π μ Eureka = Discovery Server μΈκ°?
- “μ λ μΉ΄(Eureka)”λ λ·νλ¦μ€μμ λ§λ μλΉμ€ λμ€μ»€λ²λ¦¬ μλ²μ μ΄λ¦μ΄μΌ.
- “λμ€μ»€λ²λ¦¬”λ κ°λ μ΄κ³ , Eurekaλ κ·Έκ²μ ꡬν체μΌ.
λ°λΌμ “μ λ μΉ΄μ λμ€μ»€λ²λ¦¬ μ€μ μ΄λμ μ°κ²°νλ?”λ μ§λ¬Έμ
μ¬μ€μ μ λ μΉ΄ μλ²μ λ±λ‘νλ κ²μ΄ λ§λ€λ μλ―Έκ° λΌ.
| Store μλΉμ€ | Eureka(=Discovery Server)μ “λ±λ‘” |
| Gateway | Eurekaμμ Store μλΉμ€ μ£Όμ “μ‘°ν” ν λΌμ°ν |
π κ·Έλμ μ€ν μ΄λ μ λ μΉ΄μ μ°κ²°ν΄μΌ νλ€.
π “λμ€μ»€λ²λ¦¬”λ κ°λ
μ μ΄λ¦μ΄κ³ , μ€μ ꡬνμ²΄κ° Eureka.
μ€ν μ΄(Store) μλΉμ€μμ κ²μ΄νΈμ¨μ΄(Gateway)λ‘ μ§μ νΈμΆν κ±΄μ§ κ³ λ―Ό μ€μ΄λΌλ©΄, κ²°λ‘ λΆν° λ§νλ©΄ κ±°μ λλΆλΆμ κ²½μ° Eureka(λλ λ€λ₯Έ μλΉμ€ λμ€μ»€λ²λ¦¬)λ‘ λ±λ‘λ μλΉμ€ μ΄λ¦μ ν΅ν΄ Gatewayλ‘ νΈμΆνλ κ² ν¨μ¬ λ μ’μ΅λλ€. μ§μ IPλ νΈμ€νΈλͺ μΌλ‘ Gatewayλ₯Ό νλμ½λ©νλ 건 μ λ λΉμΆμ²μ΄μμ.
μ Eureka(μλΉμ€ λμ€μ»€λ²λ¦¬)λ₯Ό ν΅ν΄ Gatewayλ₯Ό νΈμΆν΄μΌ ν κΉ?
| κ³ κ°μ©μ± (HA) | Gatewayκ° μ¬λ¬ λ λμμ Έλ νλμ μ£Όμλ§ μλ©΄ μ₯μ μ μλ λ³κ²½ νμ | μλμΌλ‘ μ΄μμλ Gateway μΈμ€ν΄μ€λ‘ λΌμ°ν |
| λ°°ν¬/μ€μΌμΌλ§ νΈμμ± | Gateway μ¬λ°°ν¬ μ IP λ³κ²½ → Storeλ μ¬λ°°ν¬ νμ | Gatewayκ° 1λλ 10λλ Store μ½λλ κ·Έλλ‘ |
| MSA νμ€ λ°©μ | anti-pattern | Spring Cloud νμ€ λ°©μ (Service Discovery + Client-side LB) |
| Circuit Breaker μ°κ³ | μ΄λ ΅κ±°λ λ³λ ꡬν νμ | Hystrix/Resilience4jμ μμ°μ€λ½κ² μ°κ³ κ°λ₯ |
| κ΄μ /λͺ¨λν°λ§ | κ°κ°μ νΈμΆμ λ³λλ‘ μΆμ ν΄μΌ ν¨ | μλΉμ€ μ΄λ¦ λ¨μλ‘ ν΅ν© λͺ¨λν°λ§ (Zipkin, Sleuth λ±) |
'Project ESG+AI > Tech Basics' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
| 34μΌμ°¨. IT κ°λ μ 리 (1) | 2025.11.25 |
|---|---|
| 33μΌμ°¨. IT κ°λ μ 리 (1) | 2025.11.24 |
| 31μΌμ°¨. IT κ°λ μ 리 (1) | 2025.11.20 |
| 30μΌμ°¨. IT κ°λ μ 리 (0) | 2025.11.19 |
| 29μΌμ°¨. IT κ°λ μ 리 (0) | 2025.11.18 |