λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ›οΈ Architecture

[λ§Œλ“€λ©΄μ„œ λ°°μš°λŠ” 클린 μ•„ν‚€ν…μ²˜] Chapter6. μ˜μ†μ„± μ–΄λŒ‘ν„° κ΅¬ν˜„ν•˜κΈ°

by GroovyArea 2022. 10. 31.

CH 6. μ˜μ†μ„± μ–΄λŒ‘ν„° κ΅¬ν˜„ν•˜κΈ°

1. μ˜μ‘΄μ„± μ—­μ „

  • μ„œλΉ„μŠ€κ°€ μ˜μ†μ„± κΈ°λŠ₯을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 포트 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 호좜
  • μœ‘κ°ν˜• μ•„ν‚€ν…μ²˜μ—μ„œ μ˜μ†μ„± μ–΄λŒ‘ν„°λŠ” 주둜 μ•„μ›ƒκ³ μž‰ μ–΄λŒ‘ν„°
    => μ•±μ—μ„œ ν˜ΈμΆœν•˜κΈ° λ•Œλ¬Έ, λ°˜λŒ€μ˜ κ²½μš°λŠ” μ—†λ‹€.
  • ν¬νŠΈλŠ” μ•±κ³Ό μ˜μ†μ„± μ‚¬μ΄μ˜ 간접적 계측
    • μ˜μ†μ„± λ¬Έμ œμ— μ‹ κ²½μ“°μ§€ μ•Šκ³  도메인 μ½”λ“œ 개발 λͺ©μ 
    • μ˜μ†μ„± 계측에 μ½”λ“œ μ˜μ‘΄μ„±μ„ μ—†μ•°
    • 이럴 경우, μ˜μ†μ„± μ½”λ“œλ₯Ό λ³€κ²½ν•˜λ”λΌλ„ μ½”μ–΄ μ½”λ“œμ— 영ν–₯이 μ—†μŒ
  • λŸ°νƒ€μž„μ—λ„ μ—¬μ „νžˆ 앱이 μ˜μ†μ„± μ½”λ“œμ— μ˜μ‘΄ν•˜κ³  μžˆλ‹€.
  • μΈν„°νŽ˜μ΄μŠ€ 계약을 λ§Œμ‘±ν•˜λŠ” ν•œ μ˜μ†μ„± μ½”λ“œ μˆ˜μ •μ€ λ¬Έμ œκ°€ μ—†λ‹€.

2. μ˜μ†μ„± μ–΄λŒ‘ν„°μ˜ μ±…μž„

  1. μž…λ ₯을 λ°›λŠ”λ‹€.
    • 주둜 도메인 μ—”ν‹°ν‹°, DB μ—°μ‚° μ „μš© 객체
  2. μž…λ ₯을 λ°μ΄ν„°λ² μ΄μŠ€ 포맷으둜 λ§€ν•‘ν•œλ‹€.
    • JPA Entity 객체 λ§€ν•‘
    • JPAλ₯Ό μ œμ™Έν•œ κΈ°μˆ λ„ κ³ λ €
    • μ˜μ†μ„± μ–΄λŒ‘ν„°μ˜ μž…λ ₯ λͺ¨λΈμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 코어에 μžˆμœΌλ―€λ‘œ, μ˜μ†μ„± μ–΄λŒ‘ν„°μ˜ 변경은 μ•„λ¬΄λŸ° 영ν–₯을 κ°€ν•˜μ§€ μ•ŠλŠ”λ‹€.
  3. μž…λ ₯을 λ°μ΄ν„°λ² μ΄μŠ€λ‘œ 보낸닀.
  4. λ°μ΄ν„°λ² μ΄μŠ€ 좜λ ₯을 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 포맷으둜 λ§€ν•‘ν•œλ‹€.
    • 좜λ ₯ λͺ¨λΈ λ˜ν•œ 코어에 μœ„μΉ˜ν•œλ‹€.
  5. 좜λ ₯을 λ°˜ν™˜ν•œλ‹€.

3. 포트 μΈν„°νŽ˜μ΄μŠ€ λ‚˜λˆ„κΈ°

  • ν•˜λ‚˜μ˜ Repository에 λͺ¨λ“  λ°μ΄ν„°λ² μ΄μŠ€ 연산을 λ‹΄μ•„ λ†“λŠ” 게 일반적인 λͺ¨λΈ
    • 넓은 포트 μΈν„°νŽ˜μ΄μŠ€λ₯Ό 가짐.
    • SRP (Single Responsiblity Principle) μœ„λ°°
    • ν…ŒμŠ€νŠΈκ°€ μ–΄λ ΅κ³  λΆˆν•„μš”ν•œ μ˜μ‘΄μ„ 가짐
  • ISP (Interface Segregation Principle) 적용이 μ‹œκΈ‰ν•˜λ‹€.

  • 포트λ₯Ό μ±…μž„μ— 맞게 λ‚˜λˆˆ λͺ¨μŠ΅
  • 가독성과 μ±…μž„μ˜ ν‘œν˜„μ΄ κ°œμ„ λ˜μ—ˆλ‹€.
  • ν…ŒμŠ€νŠΈ μ‹œ λͺ¨ν‚Ήμ΄ κ°„νŽΈν•΄μ‘Œλ‹€.
  • ν”ŒλŸ¬κ·Έ μ•€λ“œ ν”Œλ ˆμ΄κ°€ κ°€λŠ₯ν•΄μ‘Œλ‹€.
    • μ„œλΉ„μŠ€ μ½”λ“œλ₯Ό ν•„μš”ν•œ ν¬νŠΈμ— 꽂기 맀우 κ°€λŠ₯.

4. μ˜μ†μ„± μ–΄λŒ‘ν„° λ‚˜λˆ„κΈ°

  • μ–΄λŒ‘ν„°λ₯Ό λ‚˜λˆ”μœΌλ‘œμ¨ 도메인 클래슀(μ• κ·Έλ¦¬κ±°νŠΈ)λ§ˆλ‹€ ν•„μš”ν•œ ν•˜λ‚˜μ˜ μ–΄λŒ‘ν„°λ₯Ό κ΅¬ν˜„.
  • 도메인 경계λ₯Ό 따라 μžμ—°μŠ€λ ˆ λ‚˜λˆ„μ–΄μ§.
  • μ„±λŠ₯을 μœ„ν•œ SQL을 μ“°κΈ° μœ„ν•œ 포트λ₯Ό λ„£κΈ° μœ„ν•΄ 더 μͺΌκ°€ μˆ˜λ„ μžˆλ‹€.
  • μΆ”ν›„ μ—¬λŸ¬ 개의 λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈμ˜ μ˜μ†μ„± μš”κ΅¬μ‚¬ν•­μ„ λΆ„λ¦¬ν•˜κΈ° μœ„ν•œ 쒋은 ν† λŒ€κ°€ λœλ‹€.

  • 그림을 보면 도메인 별 λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈλŠ” 각자의 μ˜μ†μ„± μ–΄λŒ‘ν„°λ₯Ό κ°€μ§„λ‹€.
    • λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈ = 경계
  • κ²½κ³„λΌλ¦¬λŠ” μ² μ €ν•˜κ²Œ λΆ„λ¦¬λ˜μ–΄μžˆλ‹€.
  • λ‹€λ₯Έ λ§₯락을 ν•„μš”λ‘œ ν•  경우 인컀밍 포트λ₯Ό 톡해 μ ‘κ·Όν•˜λŠ” 방법밖엔 μ—†μŒ.

5. μŠ€ν”„λ§ 데이터 JPA 예제

  • λΆˆλ³€μ„±μ„ 띈 도메인 λͺ¨λΈμ„ 생성할 수 μžˆλŠ” μœ νš¨ν•œ μƒνƒœμ˜ Account μ—”ν‹°ν‹° 클래슀
  • νŒ©ν† λ¦¬ λ©”μ„œλ“œλ₯Ό 제곡

  • μ˜μ†μ„± μ–΄λŒ‘ν„°λ₯Ό μœ„ν•œ AccountEntityλ₯Ό μΆ”κ°€ μ •μ˜

  • μ˜μ†μ„± μ–΄λŒ‘ν„°μ—μ„œ μ‚¬μš©ν•  ActivityEntity 클래슀 μ •μ˜
  • JPAκ°€ 마λƒ₯ μ’‹μ§„ μ•Šλ‹€.
    • 관계 λ§€ν•‘ μ• λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ λΆ€μˆ˜νš¨κ³Όκ°€ 생길 수 있음.
  • 쑰금 더 κ°„λ‹¨ν•œ ORM도 있음.

  • ActivityRepository μΈν„°νŽ˜μ΄μŠ€
  • μŠ€ν”„λ§μ€ κ΅¬ν˜„μ²΄λ₯Ό μžλ™μœΌλ‘œ 생성.

  • μ˜μ†μ„± μ–΄λŒ‘ν„°
  • LoadAccountPort & UpdateAccountStatePort 2개의 포트 κ΅¬ν˜„
  • Account 데이터λ₯Ό DBμ—μ„œ 쑰회
    => νŠΉμ • μ‹œκ°„ λ²”μœ„μ˜ Activity 쑰회
    => μ‹œκ°„ λ²”μœ„μ˜ μž”κ³ λ₯Ό κ΅¬ν•˜κ³  μ‹œκ°„ λ²”μœ„ μ „μ˜ μž…, 좜금 Activityλ₯Ό DBμ—μ„œ 쑰회
    => Account Entity둜 λ³€κ²½ν•  경우 μž”κ³ λ₯Ό κ³„μ‚°ν•œλ‹€.

  • Domain μ—”ν‹°ν‹° & μ˜μ†μ„± μ—”ν‹°ν‹°κ°€ 쌍으둜 쑴재
  • JPA νŠΉμ„±μƒ 기보본 μƒμ„±μžλ₯Ό ν•„μš”λ‘œ ν•˜κΈ° λ•Œλ¬Έμ— λ§€ν•‘ μ§„ν–‰.
  • ν’λΆ€ν•œ 도메인 λͺ¨λΈμ„ μƒμ„±ν•˜κ³  싢을 경우 도메인, μ˜μ†μ„± λͺ¨λΈμ„ λ§€ν•‘ν•˜λŠ” 것이 μ’‹λ‹€.
    • μ˜μ†μ„± 츑면과의 νƒ€ν˜‘μ„ ν•˜κ³  μ‹Άμ§€ μ•Šμ„ 경우.

6. λ°μ΄ν„°λ² μ΄μŠ€ νŠΈλžœμž­μ…˜μ€ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?

  • νŠΈλžœμž­μ…˜μ€ ν•˜λ‚˜μ˜ μœ μŠ€μΌ€μ΄μŠ€μ— λŒ€ν•΄ μΌμ–΄λ‚˜λŠ” λͺ¨λ“  μ“°κΈ° μž‘μ—…μ— 걸쳐야 함.

    • μ‹€νŒ¨ μ‹œ λͺ¨λ‘ λ‘€λ°± ν•„μš”
  • μ˜μ†μ„± μ–΄λŒ‘ν„°μ˜ 경우 μœ μŠ€μΌ€μ΄μŠ€λ₯Ό λͺ¨λ₯΄κΈ° λ•Œλ¬Έμ— μ±…μž„μ„ κ°€μ§€κΈ° 뢀적합.

  • @Transactional μ• λ…Έν…Œμ΄μ…˜μœΌλ‘œ μ˜€μ—Όμ„ μ›μΉ˜ μ•Šμ„ 경우 AspectJ의 μœ„λΉ™μ„ 톡해 ν•΄κ²°ν•˜λŠ” 방법도 κ³ λ €ν•  수 μžˆλ‹€.


7. μœ μ§€λ³΄μˆ˜ κ°€λŠ₯ν•œ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό λ§Œλ“œλŠ” 데 μ–΄λ–»κ²Œ 도움이 될까?

  • 도메인 μ½”λ“œμ— ν”Œλ‘œκ·ΈμΈμ²˜λŸΌ λ™μž‘ν•˜λŠ” μ˜μ†μ„± μ–΄λŒ‘ν„°λŠ” 도메인이 μ˜μ†μ„±μ— λΆ„λ¦¬λ˜μ–΄ ν’λΆ€ν•œ 도메인 λͺ¨λΈμ΄ κ°€λŠ₯ν•˜λ‹€.
  • 쒁은 포트 μΈν„°νŽ˜μ΄μŠ€λŠ” ν¬νŠΈλ§ˆλ‹€ λ‹€λ₯Έ λ°©μ‹μœΌλ‘œ κ΅¬ν˜„ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ— μœ μ—°ν•˜λ‹€.
  • 포트의 μΈν„°νŽ˜μ΄μŠ€λ§Œ 지킨닀면 μ˜μ†μ„± 기술 선택에 μžμœ λ‘œμ›Œμ§„λ‹€.
λ°˜μ‘ν˜•