Post

πŸ₯œ [Conference] Hexagonal Achitecture 에 λŒ€ν•΄μ„œ (GDSC Kprintf)

image-01 (GDSC Kprintf)

ν•΄λ‹Ήμžλ‘œλŠ” GDSC μ»¨νΌλŸ°μŠ€μ— μ°Έμ—¬ν•˜μ—¬ 듀은 κ°•μ˜ λ‚΄μš© μ†Œκ°μ„ λ°”νƒ•μœΌλ‘œ

μž‘μ„± 된 포슀트 μž…λ‹ˆλ‹€.

κ°œμš”

ν•œμ°½ ν”„λ‘œμ νŠΈλ₯Ό λ§Œλ“€λ‹€λ³΄λ©΄ λ‚œκ΄€μ— λ΄‰μ°©ν•˜κ²Œ λ˜λŠ”λ°

첫 번째둜 λŒμ•„λŠ”κ°€λŠ”λ° μ“°λ ˆκΈ°μž₯ μ½”λ“œμΈκ²½μš°

두 번째둜 λŒμ•„κ°€μ§„ μ•ŠλŠ”λ° ꡬ쑰λ₯Ό 이쁘게 μ§  κ²½μš°μ΄λ‹€.

λ‘˜ λ‹€ 정말 거지같은 κ²½μš°μ΄μ§€λ§Œ ν•΄λ‹Ή 상황을 μ–΄λ–»κ²Œ μ΄κ²¨λ‚˜κ°€μ•Ό ν•˜λŠ”μ§€

κ°œμ„ λ°©μ•ˆκ³Ό 관점 λ³€ν™”λ₯Ό 받은 λ‚΄μš©μ΄λΌ ν¬μŠ€νŒ… ν•΄λ³ΌκΉŒ ν•œλ‹€.

μ†Œν”„νŠΈμ›¨μ–΄ μ•„ν‚€ν…μ³λž€?

μ—¬λŸ¬ 가지 μ†Œν”„νŠΈμ›¨μ–΄ κ΅¬μ„±μš”μ†Œμ™€ κ·Έ κ΅¬μ„±μš”μ†Œκ°€ 가진 νŠΉμ„± 쀑 외뢀에 λ“œλŸ¬λ‚˜λŠ” νŠΉμ„±

그리고 ꡬ성 μš”μ†Œ κ°„μ˜ 관계λ₯Ό ν‘œν˜„ν•˜λŠ” μ‹œμŠ€ν…œ κ΅¬μ‘°λ‚˜ ꡬ쑰체

ν–‰μœ„μ™€ ꡬ쑰 쀑 뭐가 더 높은 κ°€μΉ˜μΈκ°€

ν”„λ‘œμ νŠΈλ₯Ό κ΅¬ν˜„ν•˜λ € ν•˜λ‹€λ³΄λ©΄

일단 λŒμ•„κ°€κΈ΄ ν•˜λŠ”λ° 였λ₯˜κ°€ λ§Žμ€ ν”„λ‘œμ νŠΈμ™€

λ™μž‘μ€ ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ 섀계λ₯Ό 정말 μž˜ν•΄λ‘” ν”„λ‘œμ νŠΈλ₯Ό μ ‘ν•˜κ²Œ 될 것이닀.

μ΄λŸ¬ν•œ μƒν™©μ—μ„œ μ–΄λ–»κ²Œ ν”„λ‘œμ νŠΈλ₯Ό 이어가야할지 μ•Œμ•„κ°€λ³΄λ €λŠ” μ‹œμ μ—μ„œ

ν–‰μœ„(λ™μž‘) κ³Ό ꡬ쑰(섀계) 쀑 무엇을 더 μ€‘μ μ μœΌλ‘œ 섀계 ν•΄μ•Ό ν•˜λŠ”μ§€ 생각을 ν•΄λ³΄κ²Œ λ˜μ—ˆλ‹€.

  1. 일단 λ™μž‘ν•¨
  2. μœ μ§€ λ³΄μˆ˜ν•˜κΈ° νž˜λ“¬
  3. ν…ŒμŠ€νŠΈλ„ μ—†μŒ
  4. 사싀상 폐기


  1. λ‹Ήμž₯ λ™μž‘μ€ μ•ˆν•˜μ§€λ§Œ
  2. μˆ˜μ •μ„ 금방 ν•  수 있음
  3. κ°œμ„  κ°€λŠ₯
  4. 지속 κ°€λŠ₯ ν”„λ‘œμ νŠΈ

λ”°λΌμ„œ ꡬ쑰가 μ’‹λ‹€ > μœ μ§€λ³΄μˆ˜ν•˜κΈ° 쉽닀 > λΉ„μš©μ΄ 적게 듀어감 > ν”„λ‘œμ νŠΈκ°€ μž₯κΈ°κ°„ 지속

Q. 정말 ꡬ쑰 κ°€ μ†Œν”„νŠΈμ›¨μ–΄κ°€ μ œκ³΅ν•˜λŠ” κ°€μΉ˜μΈκ°€?

ν”ν•˜κ²Œ μ ‘ν•˜κ²Œ λ˜λŠ” μ½”λ“œλŠ” β€œμ •λ¦¬κ°€ μ•ˆλœ 방”과 κ°™λ‹€

(책상이 책상 정리가 μ•ˆλ˜μ–΄ μžˆμ–΄ μ—­ν•  μ‘°μ°¨ ν•  수 μ—†λŠ” 상황)

(ꡬ쑰가 쒋지 μ•ŠκΈ° 떄문에 책상 μœ„μ— 무언가λ₯Ό μΆ”κ°€λ‘œ λ‘˜ 수 μ—†μŒ)

μ •λ¦¬ν•˜μžλ©΄ 'ν–‰μœ„'λŠ” 'ꡬ쑰'에 μ˜μ§€ν•˜κ²Œ λœλ‹€



μ•„ν‚€ν…μ³μ˜ λͺ©μ 

μ•„ν‚€ν…μ³μ˜ 주된 λͺ©μ μ€ μ‹œμŠ€ν…œμ˜ 생λͺ…μ£ΌκΈ°λ₯Ό μ§€μ›ν•˜λŠ” 것 인데,

쒋은 μ•„ν‚€ν…μ³λŠ” μ‹œμŠ€ν…œμ„ μ‰½κ²Œ 이해, 개발, μœ μ§€λ³΄μˆ˜ λ₯Ό ν•˜κ²Œ ν•΄μ£Όλ©΄μ„œ λ°°ν¬κΉŒμ§€ 도와쀀닀.

λ”°λΌμ„œ

μ•„ν‚€ν…μ²˜μ˜ ꢁ극적인 λͺ©ν‘œλŠ” μ‹œμŠ€ν…œμ˜ 생λͺ…κ³Ό λΉ„μš©μ„ μ€„μ΄λŠ” 것이닀.



When ?

아킀텍쳐가 λ¬΄μ—‡μΌκΉŒ?

μ§€μΌœμ•Ό ν•˜λŠ” μ œμ•½μ‘°κ±΄λ“€μ˜ 집합



클린 μ•„ν‚€ν…μ³λž€?

μ€‘μš”λ„, 관심사에 따라 계측을 λ‚˜λˆ„κ²Œ λ˜λŠ”λ° 이에 λ”°λΌμ„œ

관심사λ₯Ό λΆ„λ¦¬ν•˜μ—¬ μ˜μ‘΄μ„±μ΄ λ‚΄λΆ€μ˜ κ³ μˆ˜μ€€μ„ ν–₯ν•˜λ„λ‘ 섀계해야 ν•œλ‹€.

WEB -> Controllers -> UseCases -> Entities (μ΄λŸ¬ν•œ λ°©ν–₯으둜 ν˜λŸ¬κ°„λ‹€β€¦)

μ΄λŸ¬ν•œ 클린 μ•„ν‚€ν…μ³μ—λŠ” 크게 3가지가 μžˆλŠ”λ°

  1. Hexagonal Architecture
  2. Boundary Control Entity
  3. Data Context and Interaction

이 쀑 Hexagonal Architecture κ°€ μ΄λ²ˆμ— 닀뀄 λ³Ό μ£Όμ œμ΄λ‹€.



Hexagonal Architecture

image-02 (Hexagonal Architecture)

Hexagonal Architecture λ₯Ό μœ„ν•œ κ·œμΉ™

  1. DIP λ₯Ό 톡해 κ³ μˆ˜μ€€ 바라보기
  2. Entity λ₯Ό 뢄리해 Usecaseλ₯Ό Infra Layer 둜 λΆ€ν„° 독립
  3. port λ₯Ό ν†΅ν•œ 경계 뢄리
  4. 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

λ₯Ό λΆ„λ¦¬ν–ˆμ„ λ•Œ

  1. Domain Entity λ₯Ό λ‹€λ£° λ•Œ 연관관계, 맀핑 μ¦‰μ‹œλ‘œλ”© μ§€μ—°λ‘œλ”©λ“± 고민이 쀄어듬
  2. μžμ—°μŠ€λŸ½κ²Œ 핡심 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ— 집쀑

μ•ˆν–ˆμ„ λ•Œ

  1. 무쑰건 λΆ„λ¦¬ν•˜μ§€ μ•Šμ•„λ„ 됨 JPA Entity μžμ²΄μ •λ„λŠ” 문제 x -> λ³€κ²½ 여지가 거의 x
  2. 였히렀 μ—¬λŸ¬ 객체λ₯Ό κ΄€λ¦¬ν•˜κ³  λ³€ν™˜ν•˜λŠ” 과정이 μ—†μ–΄ λΉ„μš©μ μΈ μΈ‘λ©΄μ—μ„œ 이득

Incomming Port κ°€ ν•„μˆ˜μΈκ°€?

incomming port κ°€ 없어도 μ˜μ‘΄μ„±μ˜ λ°©ν–₯은 κ³ μˆ˜μ€€μ„ ν–₯ν•˜μ—¬ 흐λ₯΄κ³  있기 λ•Œλ¬Έμ— 없어도 λ˜λŠ” 것 μ•„λ‹κΉŒ?

ν•˜μ§€λ§Œ μ–΄μ§€κ°„ν•˜λ©΄ λ§Œλ“€μž

μ ‘κ·Ό μ œν•œμž

public > protect > default > private

default μ ‘κ·Ό μ œν•œμžκ°€ μ™œ μ€‘μš”ν•œκ°€

단일 μ§„μž…μ μ„ λ§Œλ“€κΈ° μœ„ν•΄μ„œ, μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•˜μ§€ λͺ»ν•˜κ²Œ 함

deafult λ₯Ό μ‚¬μš©ν•¨μœΌλ‘œμ„œ μ§μ ‘μ μœΌλ‘œ Usecase 에 μ ‘κ·Όν•  수 없도둝 함

마치며

λ”°λΌμ„œ

κΈ°λŠ₯을 μ§€μ§€ν•˜λŠ” ꡬ쑰가 제일 μ€‘μš”ν•˜λ‹€.

κΈ°λŠ₯이 μžˆλŠ” 건 λ‹Ήμ—°ν•΄μ•Ό ν•˜κ³  ꡬ쑰가 이λ₯Ό λ’·λ°›μΉ¨ ν•΄μ£Όμ–΄μ•Ό ν•œλ‹€.

λ”°λΌμ„œ ꡬ쑰에 μ˜μ‘΄ν•˜μ—¬ 더 μ•ˆμ •μ μ΄κ³  μœ μ§€λ³΄μˆ˜ν•˜κΈ° 쒋은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“€μžλŠ”

닀짐을 ν•˜κ²Œ λ˜μ—ˆλ‹€.

This post is licensed under CC BY 4.0 by the author.