https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
μννΈμ¨μ΄ μ€κ³μ λ€μν κ΄μ μ μμ΄μ 곡ν΅λ λΆλΆ - κ΄μ¬μ¬ λΆλ¦¬. μΌλ°μ μΌλ‘ νλμ μννΈμ¨μ΄λ₯Ό μ¬λ¬κ°μ κ³μΈ΅ κ΅¬μ‘°λ‘ λ³κ²½νμ¬ κ΄μ¬μ¬ λΆλ¦¬λ₯Ό μνν¨. κ° λ μ΄μ΄λ μ΅μ νλ μ΄μμ λΉμ¦λμ€ λ£°κ³Ό μΈν°νμ΄μ€λ₯Ό μ μν¨.
κ·Έλμ λ Όμλμ΄μ¨ λ€μν μν€ν μ³λ μ£Όλ‘ μλμ κ°μ νΉμ§μ΄ μμ
-
νλ μμν¬ λ 립μ±. μν€ν μ³λ λΌμ΄λΈλ¬λ¦¬λ νλ μμν¬μ 무κ΄νκ² λ 립μ μΌλ‘ μ€κ³ κ°λ₯ν΄μΌν¨. μ΄λ₯Ό ν΅ν΄ νλ μμν¬μ λΌμ΄λΈλ¬λ¦¬λ₯Ό λ¨μν ν΄μ νλλ‘ μ¬μ©ν μ μκ² νκ³ μμ‘΄μ μ΄μ§ μκ² ν¨.
-
μ¬μ΄ ν μ€νΈ. λΉμ¦λμ€ λ£°μ ν μ€νΈ νκ³ μ νλ κ²½μ° UI, λ°μ΄ν°λ² μ΄μ€, μΉ μλ² λ±κ³Ό κ°μ λΉμ¦λμ€ λ£° μΈμ μΈλΆ μμμ 무κ΄νκ² ν μ€νΈ ν μ μμ΄μΌ ν¨.
-
UI λ 립μ±. UIλ₯Ό λ³κ²½ν λ λ€λ₯Έ μμλ€μ λ³κ²½νμ§ μκ³ μ½κ² UIλ§ λ³κ²½ κ°λ₯ν΄μΌ ν¨. μΉ UI μ ν리μΌμ΄μ μ μ μ½κ² console UI μ ν리μΌμ΄μ μΌλ‘ λ³κ²½νκ³ , λΉμ¦λμ€ λ£°κ³Ό κ΄λ ¨λ μ½λλ μ ν λ³κ²½νμ§ μμ μ μλ μνκ° μ’μ μμ .
-
λ°μ΄ν°λ² μ΄μ€ λ 립μ±. μνλ μμ μ μνλ λ°μ΄ν°λ² μ΄μ€λ‘ λ§μλλ‘ λ³κ²½ κ°λ₯ν΄μΌ ν¨.
-
μΈλΆ μμμμ λ 립μ±. κΈ°λ³Έμ μΌλ‘ νλμ μννΈμ¨μ΄λ μΈλΆ μμμ λν μ 보λ₯Ό μ ν λͺ¨λ₯Έλ€κ³ κ°μ ν΄μΌ ν¨.
μμ κ·Έλ¦ΌμΌλ‘ μμ μ κ°λ΅νκ² λνλΌ μ μμ.
μμ κ·Έλ¦Όμμ νλμ μμ μννΈμ¨μ΄ λ΄μμ λΆλ¦¬λ κ°κ°μ μν μ λνλ. μΌλ°μ μΌλ‘ μ΄λ₯Ό μ μ μ©ν μλ‘ μ μ λ κ³ μμ€μ μννΈμ¨μ΄λ₯Ό μμ±μν¬ μ μμ. μμ μΈλΆμ κ°κΉμΈ μλ‘ λ©μ»€λμ¦μ ννμ μλ―Έν¨. μμ λ΄λΆμ κ°κΉμΈ μλ‘ μ μ± (policy)λ₯Ό μλ―Έν¨.
ν΄λ¦° μν€ν μ³λ₯Ό ꡬμ±νλ κ°μ₯ κΈ°λ³Έμ μΈ μμ‘΄μ± κ·μΉμ, κ° λ μ΄μ΄λ λ μμͺ½ μμ λ μ΄μ΄μλ§ μμ‘΄ν΄μΌ νλ€λ κ². μμͺ½μ μμ λ°κΉ₯ μͺ½μ λ μ΄μ΄μ λν΄ μ ν μμ§ λͺ»ν μνλ‘ λμν μ μμ΄μΌ ν¨. μμͺ½ μμ νννλ μ½λμλ λ°κΉ₯ μͺ½ μμ νννλ μ½λμ κ·Έ μ΄λ€ (ν΄λμ€, ν¨μ, λ³μ λ±λ±) μ½λλ€λ μ¬μ©ν΄μλ μλ¨. μΈλΆμμ μ¬μ©νλ λ°μ΄ν° νμ λν, λ΄λΆμμ μ¬μ©ν΄μλ μλ¨. μ΄λ₯Ό ν΅ν΄μ μΈλΆ μμ λ³κ²½μ΄ λ΄λΆ μμ λ³κ²½μΌλ‘ μ΄μ΄μ§μ§ μλλ‘ μ€κ³ ν μ μμ.
μν°ν°λ μ μ¬μ λΉμ¦λμ€ κ·μΉμ μΊ‘μν νλ μν μ ν¨. λ©μλλ₯Ό κ°μ§ κ°μ²΄, λ°μ΄ν° ꡬ쑰μ μ§ν©, λ€μν ν¨μ λ±μ΄ μν°ν° μν μ μνν μ μμ. μ μ¬μ μΌλ‘ μ¬μ©λλ λ€μν μννΈμ¨μ΄κ° νλμ μν°ν°λ₯Ό μμ νμ§ μκ³ μ¬μ©ν μλ§ μλ€λ©΄, μ΄λ€μμΌλ‘ ꡬννλ μκ΄ μμ.
μ μ¬μ μννΈμ¨μ΄λ₯Ό ꡬννλκ² μλλΌ, λ¨μΌ μ ν리μΌμ΄μ μ ꡬννλ κ±°λΌλ©΄, μ± λ΄μ λΉμ¦λμ€ κ°μ²΄λ₯Ό νννλ©΄ λ¨. μν°ν°λ₯Ό ꡬνν λλ μλΉμ€ λ΄μμ κ°μ₯ μΌλ°μ μΈ ννλ‘ κ³ μμ€μ κ·μΉμ ννν΄μΌν¨. μΈλΆ μμκ° λ³κ²½λλλΌλ κ±°μ λ³νμ§ μκ³ , μ λ§ νμμ μΈ μ΅νμ κ²½μ°μλ§ μν°ν° μ½λκ° λ³κ²½λλλ‘ λΆλ¦¬ν΄μΌν¨. μλ₯Ό λ€μ΄, νμ΄μ§ μ΄λμ΄λ 보μ κ·μΉμ΄ λ³νλ€κ³ ν΄μ μν°ν°μ μ½λκ° λ³νν΄μλ μλ¨. μ±μ κ·Έ μ΄λ€ λ μ΄μ΄μμ λ°μνλ λ³νλ μν°ν°μ μν₯μ μ£Όμ§ μλλ‘ μ£Όμ.
μ μ¦ μΌμ΄μ€ λ 벨μ μ½λλ μ§κΈ ꡬννκ³ μ νλ μ±μ νΉνλ λΉμ¦λμ€ λ‘μ§μ΄ λ€μ΄κ°. νμ¬ κ΅¬ννλ μμ€ν μ λͺ¨λ μ μ¦ μΌμ΄μ€λ₯Ό ꡬννκ³ μΊ‘μν ν΄μΌ ν¨. μ± λ΄μ μν°ν°λ₯Ό μ μ¬μ μΈ λ 벨μ λΉμ¦λμ€ λ£°κ³Ό μ°κ²°νλ μν μ ν¨.
λΉμ°ν μ΄ λ μ΄μ΄μ λ³νκ° μν°ν°μ μν₯μ μ€μλ μλ¨. λν, μ μ¦ μΌμ΄μ€ λ μ΄μ΄ μΈλΆμ λ€λ₯Έ λ μ΄μ΄, μ¦ λ°μ΄ν°λ² μ΄μ€, UI, νλ μμν¬ λ±μ΄ μ μ¦ μΌμ΄μ€ λ μ΄μ΄μ μν₯μ μ€μλ μλ¨. λ°λμ κ΄μ¬μ¬ λΆλ¦¬κ° λμ΄μΌ ν¨.
μ μ¦ μΌμ΄μ€λ μ± νΉνμ λΉμ¦λμ€ λ£°μ ꡬννλ κ²μ΄λ―λ‘, μ±μ μ¬μ© λ°©μμ΄λ λΉμ¦λμ€ λ£° λ³νμλ λΉμ°ν μ μ¦μΌμ΄μ€ λ³νλ λ°μν΄μΌν¨. μ μ¦ μΌμ΄μ€μ μμΈ λμ λ°©μμ μ΄ λ μ΄μ΄μμ ꡬννλ©΄ λ¨.
μ μ¦μΌμ΄μ€μ μν°ν°μμ μ¬μ©νλ λ°μ΄ν° ν¬λ§·μ λ°μ΄ν°λ² μ΄μ€λ μΉμλΉμ€μ κ°μ μΈλΆ μμμμ μ¬μ©νκΈ° νΈν λͺ¨λΈλ‘ λ³κ²½ν΄μ£Όλ μ΄λν°λ€μ μ§ν©μ΄λ€. GUI μ±μμ νν λ§νλ MVC μν€ν μ³μ κ°μ κ΅¬μ‘°κ° μ΄ λ μ΄μ΄μ ν¬ν¨λλ€. Presenter, View, Controller λ₯Ό λͺ¨λ μ΄κ³³μμ μμ±νλ©΄ λλ€. λͺ¨λΈμ 컨νΈλ‘€λ¬μμ μ μ¦ μΌμ΄μ€λ‘ μ λ¬νλ λ¨μν λ°μ΄ν° ꡬ쑰μ΄κ³ , μ μ¦ μΌμ΄μ€μμ Presenterμ View λ‘ μ λ¬ν λλ λμΌνκ² μ¬μ©λλ€.
λ°μ΄ν°λ² μ΄μ€λ‘ 보λ΄λ λ°μ΄ν° ν¬λ§·μΌλ‘ λ³κ²½ν λλ λμΌνκ² μ΄ λ μ΄μ΄μ μ½λλ₯Ό μμ±νλ©΄ λλ€. λ€λ§, μ΄ λ μ΄μ΄μ μ½λλ€μ λ°μ΄ν°λ² μ΄μ€μ λμμ리λ μ€μ λ°μ΄ν°λ² μ΄μ€ λ°μ΄ν° λͺ¨λΈμ μμμλ μλλ€. SQL μ μ¬μ©νλ λ°μ΄ν°λ² μ΄μ€κ° λμμΌ κ²½μ°, SQL μ체μ κ΄λ ¨λ λ‘μ§λ§ μ΄ λ μ΄μ΄μ μμ±νκ³ , μμ±λ SQL λν λ 립λ λ°μ΄ν°λ² μ΄μ€ μΈν°νμ΄μ€ μ΄λν° μ½λμ ꡬνλμ΄μΌ νλ€. νΉμ SQL λ°μ΄ν°λ² μ΄μ€μ λν κΈ°λ₯μ΄ ν¬ν¨λμ΄μλ μλλ€.
μμ μμ μΈμλ λ΄λΆμ μλ£κ΅¬μ‘°λ₯Ό μΈλΆμ ν΅μ ν λ μ¬μ©λλ λ°μ΄ν° λ³ν μ½λλ λͺ¨λ μ΄ κ³μΈ΅μ ꡬννλ€.
κ°μ₯ λ°κΉ₯ μμ λ°μ΄ν°λ² μ΄μ€, μΉ νλ μμν¬ λ±κ³Ό κ°μ λ€μν ν΄λ€μ μ§ν©μ΄λ€. λ³΄ν΅ μμͺ½ μκ³Ό ν΅μ νλ μ½λλ§ μμ±νλ©΄ λλ€.
μ€μ μΉμ μμΈ μ½λ, λ°μ΄ν°λ² μ΄μ€μ μμΈ μ½λ λ±λ μ΄κ³³μμ μμ±νλ€.
μ¬κΈ°μ 보μ¬μ€ μν ꡬ쑰λ λμμ μΌλ‘ ν΄λ¦° μν€ν μ³λ₯Ό ννν κ² λΏμ΄λ€. μ΄ λ³΄λ€ λ λ§μ κ³μΈ΅ κ΅¬μ‘°κ° νμν κ²½μ°λ μλ€. λ€λ§, Dependency Rule λ§μ λ°λμ μ§μΌμ ΈμΌ νλ€. μ½λλ€μ μμ‘΄μ±μ νμ μμͺ½μΌλ‘λ§ ν₯ν΄μΌ νλ€. μμͺ½ μμ ν₯ν μλ‘ μΆμνκ° μ¬νλλ€κ³ 보면 λκ³ , λ°κΉ₯ μμ ν₯ν μλ‘ λ μμΈν μ½λκ° λ€μ΄κ°λ€κ³ 보면λλ€.
λ€μ΄μ΄κ·Έλ¨μ μ°νλ¨μ 보면 μμ κ²½κ³μ μ μ§λκ°κ±°λ ν΅μ νλ μμ κ° μλ€. μμ μμλ Controllerμ Presenter κ° λ΄λΆ κ³μΈ΅μΈ Use caseμ ν΅μ νλ λ°©μμ 보μ¬μ€λ€. Controllerμμ μμν΄μ use caseλ‘ μ΄λν λ€μ, presenterμμ κ²°κ³Όλ₯Ό μ²λ¦¬νκ³ μλ€. UMLμ μμ‘΄μ±μ μμΈν 보면, νμͺ½ λ°©ν₯μΌλ‘λ§ νλ₯΄λ κ²μ μ μ μλ€. Controllerλ Use case Input portμ ꡬν체λ₯Ό μ¬μ© νμ¬ use caseλ₯Ό μ λ¬νκ³ , Presenterλ use case output portμ ꡬν체λ₯Ό μμ±νλ€ use caseκ° μΈλΆ λ΄μ©μ λͺ¨λ₯΄κ³ μ¬μ©ν μ μλλ‘ νλ€. μ£Όμ μ μ, λ κ³μΈ΅μ μ°κ²°νλ interface/port/adapterλ λͺ¨λ λ΄λΆ κ³μΈ΅μΈ use caseμμ κ΄λ¦¬νλ€λ μ μ΄λ€.
μ΄λ¬ν λ°©μμ μμ‘΄μ± μμ (Dependency Inversion Principle) μ΄λΌκ³ νλ€. μλ°μ κ°μ μΈμ΄λ₯Ό μλ‘ λ€λ©΄, μμκ΄κ³μ νλ‘μ°λ₯Ό λ°μ΄ν° νλ‘μ°μ μ λ°λλ‘ μ€κ³νλ©΄ λλ€.
Use caseκ° presenterλ₯Ό νΈμΆν΄μΌ νλ μν©μ 보μ. Dependency Rule μ λ°λΌ Use caseκ° μ§μ presenterλ₯Ό νΈμΆν΄μλ μλλ€ (out -> inλ§ ν΄μΌνλ κ·μΉμ μλ°°λ¨.) μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ use case κ³μΈ΅μ interfaceλ₯Ό μ μΈ νλ€ (κ·Έλ¦Όμμλ Use Case Output Port). Presenterλ μ΄μ λν ꡬν체λ₯Ό λ§λ€μ΄ λλ€. Use caseλ μμ μ μ μΈν interfaceλ§μ μ¬μ©νμ¬ presenterμ λ 립μ μΈ μ½λκ° λλλ‘ κ΅¬νν μ μλ€.
ν΄λ¦° μν€ν μ³μ λͺ¨λ κ³μΈ΅ κ²½κ³λ₯Ό μ§λκ°λ μ½λλ€μ μμ μμ μ λμΌνκ² κ΅¬ννλ©΄ λλ€. λμ λ€νμ±μ νμ©νλ©΄ μ΄λ₯Ό μ½κ² ꡬνν μ μκ³ , dependency ruleμ μλ°°νμ§ μκ² λλ€.
κ³μΈ΅ κ²½κ³λ₯Ό μ§λλ λ°μ΄ν° ꡬ쑰λ μΌλ°μ μΌλ‘ λ§€μ° λ¨μν ꡬ쑰μ¬μΌ νλ€. DTO (Data Transfer Object)λ κ°λ¨ν ꡬ쑰체λ₯Ό μ¬μ©ν΄λ λλ€. κ²½μ°μ λ°λΌμλ ν¨μ νΈμΆμ λ¨μλ§€κ°λ³μλ§ νμν λλ μλ€. μ€μν μ μ, μμ ν λ 립λ (κ³ λ¦½λ) λ¨μν λ°μ΄ν° ꡬ쑰μ¬μΌ νλ€λ κ²μ΄λ€. λ΄λΆμμ μ¬μ©νλ Entityλ μΈλΆμμ μ¬μ©νλ Database row λ±κ³Ό κ°μ μ§μ μ μΈ κ°μ²΄λ€μ μ λ¬ν΄μλ μλλ€. λ°μ΄ν° μ λ¬λ μμλ Dependency Ruleμ μλ°°νμ§ μμμΌ νλ€.
μλ₯Ό λ€μ΄, λλΆλΆμ λ°μ΄ν°λ² μ΄μ€ νλ μμν¬ λ€μ query μ©μ²μ λν΄ λ°μ΄ν°λ² μ΄μ€κ° νννκΈ° νΈν ν¬λ§·μ λ°μ΄ν°λ₯Ό λ°ννλ€. μ΄λ₯Ό RowStructureλΌκ³ νμ. νλ μμν¬ λ μ΄μ΄μμ λ°μμ¨ μ΄ κ΅¬μ‘°λ₯Ό κ·Έλλ‘ μμͺ½ κ³μΈ΅μΌλ‘ μ λ¬ν΄μλ μλλ€. μ΄λ μΈλΆμ ꡬ쑰λ₯Ό λ΄λΆμ κ³μΈ΅μ΄ μ§μ μκ³ μ¬μ©νλκ² λλ―λ‘, λ°μ΄ν°λ² μ΄μ€λ₯Ό λ³κ²½νλ λ±μ μΈλΆ λ³νμ λ΄λΆ κ³μΈ΅μ΄ μν₯μ λ°κ² λλ€.
κ·Έλ¬λ―λ‘ μΈλΆμμ λ΄λΆλ‘ λ°μ΄ν°λ₯Ό μ λ¬νλ κ²½μ°μλ λ°λμ λ΄λΆμμλ§ μ¬μ©νλ λ°μ΄ν° ꡬ쑰μ λ§κ² λ³κ²½νμ¬ μ λ¬ν΄μΌ νλ€.
ν΄λ¦° μν€ν μ³ κ·μΉμ μ§ν€λ κ²μ ν¬κ² μ΄λ ΅μ§ μκ³ , μννΈμ¨μ΄λ₯Ό κ³ μμ€μΌλ‘ μ μ§νλλ° ν° λμμ μ€λ€. μννΈμ¨μ΄λ₯Ό λ€μν κ³μΈ΅ κ΅¬μ‘°λ‘ λλκ³ , Dependency Ruleμ μ€μνλ©΄, μμ°μ μΌλ‘ ν μ€νΈνκΈ° μ½κ³ μ΄μ λ°λΌ λ€μν μ΄μ μ κ°λ μννΈμ¨μ΄λ₯Ό λ§λ€ μ μλ€. μΈλΆ μμμ κ·Έ μ΄λ€κ²μ΄ λ³ν/μμ λλλΌλ μ΅μνμ λ³κ²½μΌλ‘ μννΈμ¨μ΄λ₯Ό μ μ§ν μ μλ€.
