Skip to content

Latest commit

Β 

History

History
119 lines (86 loc) Β· 7.36 KB

File metadata and controls

119 lines (86 loc) Β· 7.36 KB

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

λ°μ΄ν„°λ² μ΄μŠ€ 주도 섀계λ₯Ό ν”Όν•˜κΈ° μœ„ν•΄ μ˜μ†μ„± 계측을 μ•± κ³„μΈ΅μ˜ ν”ŒλŸ¬κ·ΈμΈμœΌλ‘œ λ§Œλ“€μ–΄λ³΄μž.

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

image

  • 앱은 μ˜μ†μ„± κΈ°λŠ₯ μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 포트 호좜. 이 ν¬νŠΈλŠ” μ˜μ†μ„± μ–΄λŒ‘ν„°μ— μ˜ν•΄ κ΅¬ν˜„.(DIP)
  • μœ‘κ°ν˜• μ•„ν‚€ν…μ²˜μ—μ„œ μ˜μ†μ„± μ–΄λŒ‘ν„°λŠ” μ•±μ—μ„œ ν˜ΈμΆœν•˜κΈ° λ•Œλ¬Έμ— μ•„μ›ƒκ³ μž‰ μ–΄λŒ‘ν„°
  • ν¬νŠΈλŠ” μ•±κ³Ό μ˜μ†μ„± μ‚¬μ΄μ˜ 간접적 계측
    • μ˜μ†μ„± λ¬Έμ œμ— 신경쓰지 μ•Šκ³  도메인 μ½”λ“œ 개발
    • μ˜μ†μ„± 계측에 μ½”λ“œ μ˜μ‘΄μ„±μ„ μ—†μ•€λ‹€
    • μ˜μ†μ„± μ½”λ“œλ₯Ό λ³€κ²½ν•˜λ”λΌλ„ μ½”μ–΄ μ½”λ“œμ— 영ν–₯이 μ—†λ‹€
  • DIP둜 인해 정적인 μƒν™©μ—μ„œλŠ” μ˜μ‘΄μ„±μ΄ μ—­μ „λ˜μ—ˆμ§€λ§Œ 동적인 νƒ€μž„μ—λŠ” μ—¬μ „νžˆ 앱이 μ˜μ†μ„± μ½”λ“œμ— μ˜μ‘΄ν•˜κ³  μžˆλ‹€. ν•˜μ§€λ§Œ μΈν„°νŽ˜μ΄μŠ€ 계약을 λ§Œμ‘±ν•˜λŠ” ν•œ μ˜μ†μ„± μ½”λ“œ μˆ˜μ •μ€ λ¬Έμ œκ°€ μ—†λ‹€.

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

μ˜μ†μ„± μ–΄λŒ‘ν„°κ°€ 일반적으둜 ν•˜λŠ” 일.

  1. μž…λ ₯을 λ°›λŠ”λ‹€
    • μž…λ ₯ λͺ¨λΈμ€ μΈν„°νŽ˜μ΄μŠ€μ˜ 도메인 μ—”ν‹°ν‹°λ‚˜ νŠΉμ • λ°μ΄ν„°λ² μ΄μŠ€ μ—°μ‚° μ „μš© 객체
  2. μž…λ ₯을 λ°μ΄ν„°λ² μ΄μŠ€ 포맷으둜 λ§€ν•‘ν•œλ‹€
    • JPA인 경우 JPA μ—”ν‹°ν‹° 객체둜 맀핑
    • λ§₯락에 따라 맀핑이 ν•„μš”ν•˜μ§€ μ•ŠλŠ” κ²½μš°λ„ 있음 -> 8μž₯
    • JPAκ°€ μ•„λ‹Œ μ–΄λ–€ κΈ°μˆ λ„ μƒκ΄€μ—†μŒ
    • 핡심은 μ˜μ†μ„± μ–΄λŒ‘ν„°μ˜ μž…λ ₯ λͺ¨λΈμ΄ μ–΄λŒ‘ν„°κ°€ μ•„λ‹Œ 코어에 쑴재. μ΄λ‘œμΈν•΄ μ–΄λŒ‘ν„° 변경이 코어에 영ν–₯을 주지 μ•ŠλŠ”λ‹€

  3. μž…λ ₯을 λ°μ΄ν„°λ² μ΄μŠ€λ‘œ 보낸닀
  4. λ°μ΄ν„°λ² μ΄μŠ€ 좜λ ₯을 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 포맷으둜 λ§€ν•‘ν•œλ‹€
    • 좜λ ₯ λͺ¨λΈλ„ 코어에 μœ„μΉ˜
  5. 좜λ ₯을 λ°˜ν™˜ν•œλ‹€

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

κ·Έλ ‡λ‹€λ©΄ μ˜μ†μ„±μ„ λ‹΄λ‹Ήν•˜λŠ” 포트 μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ–΄λ–»κ²Œ λ‚˜λˆ μ•Ό ν• κΉŒ?

image

  • μœ„ 그림처럼 ν•˜λ‚˜μ— 리포지터리 μΈν„°νŽ˜μ΄μŠ€μ— λ‹΄μ•„ λ†“λŠ”κ²Œ μΌλ°˜μ μ΄λ‹€.
  • ν•˜μ§€λ§Œ 이럴경우 '넓은' 포트 μΈν„°νŽ˜μ΄μŠ€ λ¬Έμ œμ μ„ κ°–κ²Œ λœλ‹€(SRP μœ„λ°°)
  • 이둜 인해 λΆˆν•„μš”ν•œ 의쑴이 생기고
  • ν…ŒμŠ€νŠΈλ₯Ό μ–΄λ ΅κ²Œ ν•œλ‹€
    • μœ„ κ·Έλ¦Όμ—μ„œ RegisterAccountServiceλ₯Ό ν…ŒμŠ€νŠΈ ν•œλ‹€λ©΄ AccountRepository λͺ¨ν‚Ήμ„ ν•΄μ•Όν•  λ•Œ μ–΄λ–€ λ©”μ„œλ“œλ₯Ό λͺ¨ν‚Ήν•΄μ•Ό ν•˜λŠ”μ§€ 일일이 μ°Ύμ•„λ΄μ•Όν•œλ‹€.
    • λ˜ν•œ, λ‹€μŒμ— 이 ν…ŒμŠ€νŠΈμ— μž‘μ—…ν•˜λŠ” μ‚¬λžŒμ€ μΈν„°νŽ˜μ΄μŠ€ 전체가 λͺ¨ν‚Ή λ˜μ—ˆλ‹€κ³  μ˜€ν•΄λ₯Ό ν•  μˆ˜λ„ μžˆλ‹€.
  • ISP(Interface Segregation Principle μΈν„°νŽ˜μ΄μŠ€ 뢄리 원칙)을 μ μš©ν•΄μ•Όν•œλ‹€.

image

  • 포트의 이름이 ꡬ체적이고 역할을 잘 ν‘œν˜„ν•œλ‹€
  • ν…ŒμŠ€νŠΈ μ‹œ λͺ¨ν‚Ήμ˜ λŒ€μƒμ΄ 쒁아지고 λͺ…확해진닀
  • 쒁은 ν¬νŠΈλŠ” 코딩을 ν”ŒλŸ¬κ·Έ μ•€ ν”Œλ ˆμ΄κ°€ κ°€λŠ₯ν•˜κ²Œ ν•œλ‹€

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

μ§€κΈˆκΉŒμ§€ μ–΄λŒ‘ν„° ν•˜λ‚˜λ‘œ ν•΄κ²°ν–ˆμœΌλ‚˜ 이제 λ‚˜λˆ λ³΄μž.

image

  • μ˜μ†μ„± 연산이 ν•„μš”ν•œ 도메인 클래슀(μ• κ·Έλ¦¬κ±°νŠΈ) λ‹Ή ν•˜λ‚˜μ˜ μ–΄λŒ‘ν„° κ΅¬ν˜„
  • 도메인 경계λ₯Ό 따라 μžμ—°μŠ€λŸ½κ²Œ λ‚˜λ‰˜μ–΄μ§„λ‹€
  • λ¬Όλ‘  μ–΄λŒ‘ν„°λ₯Ό ν•„μš”μ— 따라 훨씬 더 μͺΌκ°€ μˆ˜λ„ μžˆλ‹€. 예) JPA 외에 SQL을 λ°”λ‘œ μ“°κΈ° μœ„ν•œ 포트λ₯Ό κ΅¬ν˜„ν•˜λŠ” 경우 λ“±
  • μ΄λŠ” μ—¬λŸ¬ 개의 λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈμ˜ μ˜μ†μ„± μš”κ΅¬μ‚¬ν•­μ„ λΆ„λ¦¬ν•˜κΈ° μœ„ν•œ 쒋은 ν† λŒ€ image
  • 각 λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈλŠ” μ˜μ†μ„± μ–΄λŒ‘ν„°λ₯Ό λ”°λ‘œ 가지고 있고
  • λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈλŠ” μ„œλ‘œ λΆ„λ¦¬λ˜μ–΄ μ˜μ‘΄μ„±μ΄ μ—†λ‹€
  • λ§Œμ•½ μ„œλ‘œ μ ‘κ·Όν•  ν•„μš”κ°€ μžˆλ‹€λ©΄ μ˜μ†μ„± μ–΄λŒ‘ν„°μ— λ°”λ‘œ μ ‘κ·Όν•˜μ§€ μ•Šκ³  인컀밍 포트λ₯Ό ν†΅ν•΄μ„œ μ ‘κ·Όν•˜κ²Œ λœλ‹€

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

image

  • λΆˆλ³€μ„±
  • μœ νš¨ν•œ μƒνƒœμ˜ Account μ—”ν‹°ν‹°λ§Œ μƒμ„±ν•˜λ„λ‘ νŒ©ν† λ¦¬ λ©”μ„œλ“œ 제곡

image

  • μ˜μ†μ„± μ–΄λŒ‘ν„°λ₯Ό μœ„ν•œ Account μ—”ν‹°ν‹° λ”°λ‘œ μ •μ˜

image

  • μ˜μ†μ„± μ–΄λŒ‘ν„°μ—μ„œ μ‚¬μš©ν•  Activity μ—”ν‹°ν‹° μ •μ˜
  • JPA의 @ManyToOne μ΄λ‚˜ @OneToMany λŠ” λΆ€μˆ˜νš¨κ³Όμ— λΉ„ν•΄ 아직 크게 ν•„μš”ν•˜μ§€ μ•Šλ‹€ νŒλ‹¨λ˜μ–΄ μ‚¬μš©μ•ˆν•¨
  • JPAλŠ” 쒋은 λ„κ΅¬μ΄λ‚˜ 그에 λΉ„ν•΄ λ§Žμ€ λ¬Έμ œκ°€ μžˆμ„ 수 μžˆλ‹€

image

  • ActivityRepositoryλŠ” μŠ€ν”„λ§μ— μ˜ν•΄μ„œ μžλ™μœΌλ‘œ κ΅¬ν˜„μ²΄κ°€ μƒμ„±λœλ‹€

image image

  • μ‹€μ œ μ˜μ†μ„± μ–΄λŒ‘ν„°
  • LoadAccountPort / UpdateAccountStatePort 두 개의 포트λ₯Ό κ΅¬ν˜„ν•œλ‹€
  • Accountλ₯Ό λ””λΉ„μ—μ„œ 뢈러였고
  • 베이슀 λ‚ μ§œ 이후 Activityλ₯΄ κ°€μ Έμ˜€κ³ 
  • 베이슀 μž”κ³ λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄ 베이슀 λ‚ μ§œ μ „κΉŒμ§€μ˜ μž…κΈˆ / 좜금 ν™œλ™μ„ λ””λΉ„μ—μ„œ κ°€μ Έμ™€μ„œ
  • Account Entity둜 λ³€κ²½μ‹œ 베이슀 μž”κ³ λ₯Ό κ³„μ‚°ν•œλ‹€

image

  • 도메인 엔티티와 μ˜μ†μ„± μ—”ν‹°ν‹° 간에 쌍으둜 μ‘΄μž¬ν•œλ‹€. ꡳ이 μ΄λž˜μ•Ό ν•˜λ‚˜?
  • 쌍으둜 μ—”ν‹°ν‹°λ₯Ό λ§Œλ“€μ§€ μ•Šκ³  'λ§€ν•‘ν•˜μ§€ μ•ŠκΈ°' μ „λž΅μ΄ μœ νš¨ν•  μˆ˜λ„ μžˆλ‹€
  • ν•˜μ§€λ§Œ 이런 경우 JPAλ₯Ό μœ„ν•΄μ„œ 도메인 λͺ¨λΈμ„ νƒ€ν˜‘ν•  수 밖에 μ—†λ‹€(κΈ°λ³Έ μƒμ„±μžλΌλ“ κ°€...)
  • 즉, μ˜μ†μ„± 츑면에 νƒ€ν˜‘ν•˜μ§€ μ•Šμ„ λ•Œ μ’€ 더 ν’λΆ€ν•œ 도메인 λͺ¨λΈμ‘ 생성할 수 μžˆλ‹€.

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

νŠΈλžœμž­μ…˜μ˜ μ‹œμž‘μ€ 어디에 μœ„μΉ˜ν•΄μ•Ό ν• κΉŒ?

  • νŠΈλžœμž­μ…˜μ€ νŠΉμ • μœ μŠ€μΌ€μ΄μŠ€μ— λŒ€ν•΄μ„œ λͺ¨λ“  μ“°κΈ° μž‘μ—…μ— 걸쳐 μžˆμ–΄μ•Όν•œλ‹€. ν•˜λ‚˜λΌλ„ μ‹€νŒ¨ν•˜λ©΄ λ‹€ 같이 λ‘€λ°±λ˜μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έ
  • μ–΄λŒ‘ν„° 같은 경우 μ–΄λ–€ μœ μŠ€μΌ€μ΄μŠ€μ— ν¬ν•¨λ˜λŠ”μ§€ μ•Œμ§€ λͺ»ν•˜κΈ°λ•Œλ¬Έμ— νƒˆλ½
  • νŠΈλžœμž­μ…˜μ˜ μ‹œμž‘μ€ μ„œλΉ„μŠ€

image

  • μŠ€ν”„λ§μ—μ„œ κ°€μž₯ μ‰¬μš΄ 방법은 μœ„μ™€ 같이 μ„œλΉ„μŠ€ ν΄λž˜μŠ€μ— λΆ™μ—¬μ„œ λͺ¨λ“  public λ©”μ„œλ“œλ₯Ό νŠΈλžœμž­μ…˜μœΌλ‘œ κ°μ‹ΈλŠ” 것이닀
  • @Transaction 으둜 μ˜€μ—Όμ‹œν‚€κΈ° μ‹«λ‹€λ©΄ μœ„λΉ™μ„ ν†΅ν•˜μ—¬ ν•΄κ²° ν•  μˆ˜λ„ μžˆλ‹€

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

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