π₯ [Conference] Hexagonal Achitecture μ λν΄μ (GDSC Kprintf)
ν΄λΉμλ‘λ GDSC 컨νΌλ°μ€μ μ°Έμ¬νμ¬ λ€μ κ°μ λ΄μ© μκ°μ λ°νμΌλ‘
μμ± λ ν¬μ€νΈ μ λλ€.
κ°μ
νμ°½ νλ‘μ νΈλ₯Ό λ§λ€λ€λ³΄λ©΄ λκ΄μ λ΄μ°©νκ² λλλ°
첫 λ²μ§Έλ‘ λμλκ°λλ° μ°λ κΈ°μ₯ μ½λμΈκ²½μ°
λ λ²μ§Έλ‘ λμκ°μ§ μλλ° κ΅¬μ‘°λ₯Ό μ΄μκ² μ§ κ²½μ°μ΄λ€.
λ λ€ μ λ§ κ±°μ§κ°μ κ²½μ°μ΄μ§λ§ ν΄λΉ μν©μ μ΄λ»κ² μ΄κ²¨λκ°μΌ νλμ§
κ°μ λ°©μκ³Ό κ΄μ λ³νλ₯Ό λ°μ λ΄μ©μ΄λΌ ν¬μ€ν ν΄λ³ΌκΉ νλ€.
μννΈμ¨μ΄ μν€ν μ³λ?
μ¬λ¬ κ°μ§ μννΈμ¨μ΄ ꡬμ±μμμ κ·Έ ꡬμ±μμκ° κ°μ§ νΉμ± μ€ μΈλΆμ λλ¬λλ νΉμ±
κ·Έλ¦¬κ³ κ΅¬μ± μμ κ°μ κ΄κ³λ₯Ό νννλ μμ€ν ꡬ쑰λ ꡬ쑰체
νμμ ꡬ쑰 μ€ λκ° λ λμ κ°μΉμΈκ°
νλ‘μ νΈλ₯Ό ꡬννλ € νλ€λ³΄λ©΄
μΌλ¨ λμκ°κΈ΄ νλλ° μ€λ₯κ° λ§μ νλ‘μ νΈμ
λμμ νμ§ μμμ§λ§ μ€κ³λ₯Ό μ λ§ μν΄λ νλ‘μ νΈλ₯Ό μ νκ² λ κ²μ΄λ€.
μ΄λ¬ν μν©μμ μ΄λ»κ² νλ‘μ νΈλ₯Ό μ΄μ΄κ°μΌν μ§ μμκ°λ³΄λ €λ μμ μμ
νμ(λμ) κ³Ό ꡬ쑰(μ€κ³) μ€ λ¬΄μμ λ μ€μ μ μΌλ‘ μ€κ³ ν΄μΌ νλμ§ μκ°μ ν΄λ³΄κ² λμλ€.
- μΌλ¨ λμν¨
- μ μ§ λ³΄μνκΈ° νλ¬
- ν μ€νΈλ μμ
- μ¬μ€μ νκΈ°
- λΉμ₯ λμμ μνμ§λ§
- μμ μ κΈλ°© ν μ μμ
- κ°μ κ°λ₯
- μ§μ κ°λ₯ νλ‘μ νΈ
λ°λΌμ κ΅¬μ‘°κ° μ’λ€ > μ μ§λ³΄μνκΈ° μ½λ€ > λΉμ©μ΄ μ κ² λ€μ΄κ° > νλ‘μ νΈκ° μ₯κΈ°κ° μ§μ
Q. μ λ§
ꡬ쑰
κ° μννΈμ¨μ΄κ° μ 곡νλ κ°μΉμΈκ°?
ννκ² μ νκ² λλ μ½λλ βμ λ¦¬κ° μλ λ°©βκ³Ό κ°λ€
(μ± μμ΄ μ± μ μ λ¦¬κ° μλμ΄ μμ΄ μν μ‘°μ°¨ ν μ μλ μν©)
(κ΅¬μ‘°κ° μ’μ§ μκΈ° λλ¬Έμ μ± μ μμ 무μΈκ°λ₯Ό μΆκ°λ‘ λ μ μμ)
μ 리νμλ©΄ 'νμ'
λ 'ꡬ쑰'
μ μμ§νκ² λλ€
μν€ν μ³μ λͺ©μ
μν€ν μ³μ μ£Όλ λͺ©μ μ μμ€ν μ μλͺ μ£ΌκΈ°λ₯Ό μ§μνλ κ² μΈλ°,
μ’μ μν€ν μ³λ μμ€ν μ μ½κ² μ΄ν΄, κ°λ°, μ μ§λ³΄μ λ₯Ό νκ² ν΄μ£Όλ©΄μ λ°°ν¬κΉμ§ λμμ€λ€.
λ°λΌμ
μν€ν μ²μ κΆκ·Ήμ μΈ λͺ©νλ μμ€ν μ μλͺ κ³Ό λΉμ©μ μ€μ΄λ κ²μ΄λ€.
When ?
μν€ν μ³κ° 무μμΌκΉ?
μ§μΌμΌ νλ μ μ½μ‘°κ±΄λ€μ μ§ν©
ν΄λ¦° μν€ν μ³λ?
μ€μλ, κ΄μ¬μ¬μ λ°λΌ κ³μΈ΅μ λλκ² λλλ° μ΄μ λ°λΌμ
κ΄μ¬μ¬λ₯Ό λΆλ¦¬νμ¬ μμ‘΄μ±μ΄ λ΄λΆμ κ³ μμ€μ ν₯νλλ‘ μ€κ³ν΄μΌ νλ€.
WEB
-> Controllers
-> UseCases
-> Entities
(μ΄λ¬ν λ°©ν₯μΌλ‘ νλ¬κ°λ€β¦)
μ΄λ¬ν ν΄λ¦° μν€ν μ³μλ ν¬κ² 3κ°μ§κ° μλλ°
- Hexagonal Architecture
- Boundary Control Entity
- Data Context and Interaction
μ΄ μ€ Hexagonal Architecture
κ° μ΄λ²μ λ€λ€ λ³Ό μ£Όμ μ΄λ€.
Hexagonal Architecture
Hexagonal Architecture λ₯Ό μν κ·μΉ
- DIP λ₯Ό ν΅ν΄ κ³ μμ€ λ°λΌλ³΄κΈ°
- Entity λ₯Ό λΆλ¦¬ν΄ Usecaseλ₯Ό Infra Layer λ‘ λΆν° λ 립
- port λ₯Ό ν΅ν κ²½κ³ λΆλ¦¬
- Adapter λ₯Ό ν΅ν μ§μ μ μμ±
μμ 4κ°μ§ κ·μΉμ λ°λ₯΄λ©΄ λλ€.
νμ§λ§ κΈ°μ‘΄μ μν€ν μ³μ λ¬Έμ μ μ μμμΌ κ°μ λ°©μμ νμ νκΈ° μ½λ€.
κ²μΈ΅ν μν€ν μ³μ λΆνΈνλ μ
λ°μ΄ν°λ² μ΄μ€ μ€μ¬μ μΈ μ€κ³λ₯Ό μ£Όλν¨
λλ©μΈ μ½λλ μν°ν°μ μνλ₯Ό λ³κ²½νλ μΌμ μ€μ¬μΌλ‘ νκΈ° λλ¬Έμ
Entity λ₯Ό λλ©μΈ κ³μΈ΅μΌλ‘ μ¬λ¦°λ€
μν μ°Έμ‘°κ° λ°μν΄λ²λ¦Ό
DIP λ₯Ό μ μ©νμ¬ μμ‘΄μ±μ λ°©ν₯μ λ€μ§μ
Business Layer μ Entity μ Infra layer μ Entity λΆλ¦¬
Entity λ₯Ό λΆλ¦¬νμ¬ usecase λ₯Ό Infra layer λ‘ λΆν° λ 립μν€κΈ°
Port λ₯Ό ν΅ν κ²½κ³ λΆλ¦¬
Incoming Port μ Outgoing Port λ₯Ό ν΅ν΄ κ²½κ³ λΆλ¦¬
ν΄λΉμμ μ ν΅ν΄μΌ Adapter λν μλ―Έκ° μ΄μλκΈ° μμν¨
ν΄λΉ λ°©λ²μ ν΅νλ©΄ UseCase κ° λͺ νν΄μ§λ€.
Use Case : λ΄κ° λ§λ€κ³ μ νλ μμ€ν (μλΉμ€)
κ°μλ₯Ό λ€μ ν λλ μ
JPA Entity μ Domain Entity
λ₯Ό λΆλ¦¬νμ λ
- Domain Entity λ₯Ό λ€λ£° λ μ°κ΄κ΄κ³, 맀ν μ¦μλ‘λ© μ§μ°λ‘λ©λ± κ³ λ―Όμ΄ μ€μ΄λ¬
- μμ°μ€λ½κ² ν΅μ¬ λΉμ¦λμ€ λ‘μ§μ μ§μ€
μνμ λ
- 무쑰건 λΆλ¦¬νμ§ μμλ λ¨ JPA Entity μ체μ λλ λ¬Έμ x -> λ³κ²½ μ¬μ§κ° κ±°μ x
- μ€νλ € μ¬λ¬ κ°μ²΄λ₯Ό κ΄λ¦¬νκ³ λ³ννλ κ³Όμ μ΄ μμ΄ λΉμ©μ μΈ μΈ‘λ©΄μμ μ΄λ
Incomming Port κ° νμμΈκ°?
incomming port
κ° μμ΄λ μμ‘΄μ±μ λ°©ν₯μ κ³ μμ€μ ν₯νμ¬ νλ₯΄κ³ μκΈ° λλ¬Έμ μμ΄λ λλ κ² μλκΉ?
νμ§λ§ μ΄μ§κ°νλ©΄ λ§λ€μ
μ κ·Ό μ νμ
public
> protect
> default
> private
default μ κ·Ό μ νμκ° μ μ€μνκ°
λ¨μΌ μ§μ μ μ λ§λ€κΈ° μν΄μ, μΈλΆμμ μ κ·Όνμ§ λͺ»νκ² ν¨
deafult λ₯Ό μ¬μ©ν¨μΌλ‘μ μ§μ μ μΌλ‘ Usecase μ μ κ·Όν μ μλλ‘ ν¨
λ§μΉλ©°
λ°λΌμ
κΈ°λ₯μ μ§μ§νλ κ΅¬μ‘°κ° μ μΌ μ€μνλ€.
κΈ°λ₯μ΄ μλ 건 λΉμ°ν΄μΌ νκ³ κ΅¬μ‘°κ° μ΄λ₯Ό λ·λ°μΉ¨ ν΄μ£Όμ΄μΌ νλ€.
λ°λΌμ ꡬ쑰μ μμ‘΄νμ¬ λ μμ μ μ΄κ³ μ μ§λ³΄μνκΈ° μ’μ μ ν리μΌμ΄μ μ λ§λ€μλ
λ€μ§μ νκ² λμλ€.