Home > Backend Development > πŸ“š[Backend Development] DTO(Data Transfer Object) κ΅¬ν˜„ 4λŒ€ 원칙

πŸ“š[Backend Development] DTO(Data Transfer Object) κ΅¬ν˜„ 4λŒ€ 원칙
Backend Ddevelopment DTO Layer Architecture

πŸ“š[Backend Development] DTO(Data Transfer Object) κ΅¬ν˜„ 4λŒ€ 원칙

DTO(Data Transfer Object)λŠ” 계측 κ°„ 데이터 전솑을 μœ„ν•΄ μ‚¬μš©ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.

DTO κ΅¬ν˜„ 4λŒ€ 원칙에 λŒ€ν•΄ μ•Œμ•„λ³΄κΈ° 전에 DTO의 핡심 κ°œλ…κ³Ό DTOλ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ μ— λŒ€ν•΄ κ°„λ‹¨ν•˜κ²Œ μ•Œμ•„λ³Έ ν›„ 본격적으둜 DTO κ΅¬ν˜„ 4λŒ€ 원칙에 λŒ€ν•΄ μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.


πŸ“ λͺ©μ°¨

  • DTO
      1. DTO 핡심 κ°œλ….
      1. DTOλ₯Ό μ‚¬μš©ν•˜λŠ” 이유.
  • DTO κ΅¬ν˜„ 4λŒ€ 원칙
      1. λ‹¨μˆœν•œ 데이터 μ»¨ν…Œμ΄λ„ˆμ—¬μ•Ό ν•©λ‹ˆλ‹€.(Be a Simple Data Container)
      1. λΆˆλ³€(Immutable) 객체둜 λ§Œλ“œμ„Έμš”(Be Immutable).
      1. 엔티티와 μ² μ €νžˆ λΆ„λ¦¬ν•˜μ„Έμš”(Be Decoupled from the Entity)
      1. λͺ©μ μ— 따라 λΆ„λ¦¬ν•΄μ„œ λ§Œλ“œμ„Έμš”(Be Purpost-Specific)

πŸ“¦ DTO

βœ… 1. DTO 핡심 κ°œλ….

DTOλŠ” μ‹œμŠ€ν…œμ˜ λ‚΄λΆ€ 둜직과 μ™ΈλΆ€ μΈν„°νŽ˜μ΄μŠ€λ₯Ό λΆ„λ¦¬ν•˜κΈ° μœ„ν•œ β€˜λ°μ΄ν„° μƒμžβ€™ λ˜λŠ” β€˜λ°μ΄ν„° 운반용 κ°μ²΄β€™μž…λ‹ˆλ‹€.
λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 없이, 였직 데이터λ₯Ό λ‹΄μ•„ μ „λ‹¬ν•˜λŠ” μš©λ„λ‘œλ§Œ μ‚¬μš©λ©λ‹ˆλ‹€.

βœ… 2. DTOλ₯Ό μ‚¬μš©ν•˜λŠ” 이유.

κ°€μž₯ μ€‘μš”ν•œ μ΄μœ λŠ” λ‚΄λΆ€ 데이터 λͺ¨λΈ(Entity)κ³Ό μ™ΈλΆ€ API 계약(DTO)을 λΆ„λ¦¬ν•˜κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

  • 관심사 뢄리
    • λ°μ΄ν„°λ² μ΄μŠ€μ™€ 직접 μ—°κ²°λœ Entityλ₯Ό 외뢀에 κ·ΈλŒ€λ‘œ λ…ΈμΆœν•˜λ©΄ λ³΄μ•ˆμ— μ·¨μ•½ν•˜κ³ , λ‚΄λΆ€ ꡬ쑰가 변경될 λ•Œλ§ˆλ‹€ API λͺ…μ„Έ 전체가 영ν–₯을 λ°›κ²Œ λ©λ‹ˆλ‹€. DTOλŠ” API λͺ…세에 ν•„μš”ν•œ λ°μ΄ν„°λ§Œ 골라 λ‹΄μ•„ 이 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.
  • μœ μ—°μ„± 및 μ•ˆμ •μ„±
    • λ°μ΄ν„°λ² μ΄μŠ€ Entity의 ꡬ쑰가 λ³€κ²½λ˜λ”λΌλ„ DTOλ₯Ό μ‚¬μš©ν•˜λŠ” ν•œ API λͺ…μ„ΈλŠ” κ·ΈλŒ€λ‘œ μœ μ§€ν•  수 μžˆμ–΄, μ‹œμŠ€ν…œμ΄ 훨씬 μœ μ—°ν•˜κ³  μ•ˆμ •μ μ΄κ²Œ λ©λ‹ˆλ‹€.
  • λ³΄μ•ˆ
    • Entity에 ν¬ν•¨λœ λΉ„λ°€λ²ˆν˜Έμ™€ 같은 민감함 μ •λ³΄λ‚˜, 외뢀에 λΆˆν•„μš”ν•œ λ‚΄λΆ€ 데이터가 ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ λ…ΈμΆœλ˜λŠ” 것을 λ°©μ§€ν•©λ‹ˆλ‹€.

πŸ“¦ DTO κ΅¬ν˜„ 4λŒ€ 원칙

βœ… 1. λ‹¨μˆœν•œ 데이터 μ»¨ν…Œμ΄λ„ˆμ—¬μ•Ό ν•©λ‹ˆλ‹€ (Be a Simple Data Container)

DTO의 μœ μΌν•œ μ—­ν•œμ€ β€œλ°μ΄ν„°λ₯Ό λ‹΄μ•„ 계측(Layer) 간에 μ „λ‹¬ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.”
가격 κ³„μ‚°μ΄λ‚˜ μœ νš¨μ„± 검증과 같은 β€œλΉ„μ¦ˆλ‹ˆμŠ€ 둜직(Business Logic)을 μ ˆλŒ€ ν¬ν•¨ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.”
μ΄λŸ¬ν•œ λ‘œμ§μ€ μ„œλΉ„μŠ€ 계측(Service Layer)의 μ±…μž„μž…λ‹ˆλ‹€.

βœ… 2. λΆˆλ³€(Immutable) 객체둜 λ§Œλ“œμ„Έμš”. (Be Immutable)

setterλ₯Ό μ œκ³΅ν•˜μ§€ μ•Šκ³ , β€œμƒμ„±μžλ‚˜ λΉŒλ”(@Builder)λ₯Ό 톡해 생성 μ‹œμ μ—λ§Œ 값을 ν• λ‹Ήν•˜μ„Έμš”.”
데이터가 μ—¬λŸ¬κ³³μœΌλ‘œ μ „λ‹¬λ˜λŠ” λ™μ•ˆ 값이 변경될 μœ„ν—˜μ„ μ›μΉ™μ μœΌλ‘œ μ°¨λ‹¨ν•˜μ—¬ μ‹œμŠ€ν…œμ˜ μ•ˆμ •μ„±μ„ 크게 λ†’μž…λ‹ˆλ‹€.

βœ… 3. 엔티티와 μ² μ €νžˆ λΆ„λ¦¬ν•˜μ„Έμš” (Be Decoupled from the Entity)

β€œDTOλŠ” API의 μ™ΈλΆ€ λͺ…μ„Έ(계약)λ₯Ό, μ—”ν‹°ν‹°λŠ” λ‚΄λΆ€ λ°μ΄ν„°λ² μ΄μŠ€ ꡬ쑰λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.”
DTOκ°€ μ—”ν‹°ν‹°λ₯Ό 직접 μ°Έμ‘°ν•˜κ±°λ‚˜ μ˜μ‘΄ν•΄μ„œλŠ” μ•ˆ λ©λ‹ˆλ‹€.
이 원칙은 λ‚΄λΆ€ ꡬ쑰가 λ³€κ²½λ˜λ”λΌλ„ μ™ΈλΆ€ API에 영ν–₯을 μ£Όμ§€ μ•ŠλŠ” μœ μ—°ν•œ μ‹œμŠ€ν…œμ„ λ§Œλ“­λ‹ˆλ‹€.

βœ… 4. λͺ©μ μ— 따라 λΆ„λ¦¬ν•΄μ„œ λ§Œλ“œμ„Έμš” (Be Purpost-Specific)

ν•˜λ‚˜μ˜ κ±°λŒ€ν•œ DTOλ₯Ό μ—¬λŸ¬ κ³³μ—μ„œ μ‚¬μš©ν•˜λŠ” λŒ€μ‹ , 각 API의 λͺ©μ μ— λ§žλŠ” λ³„κ°œμ˜ DTOλ₯Ό λ§Œλ“œμ„Έμš”.
예λ₯Ό λ“€μ–΄, β€˜μƒν’ˆ 생성 μš”μ²­β€™μ—λŠ” ProductCreateRequestDtoλ₯Ό,β€™μƒν’ˆ λͺ©λ‘ 쑰회 μ‘λ‹΄β€™μ—λŠ” ProductListResponseDtoλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.
μ΄λŠ” DTOλ₯Ό λͺ…ν™•ν•˜κ³  κ°„κ²°ν•˜κ²Œ μœ μ§€μ‹œμΌœμ€λ‹ˆλ‹€.