LUCATHREE.COM

← Back to list
🧐 TIL

[DDD] 리포지토리, Repository

μž‘μ„±μΌ:
TILDDDArchitecture

리포지토리

μ†Œν”„νŠΈμ›¨μ–΄λ‘œ 도메인 κ°œλ…μ„ ν‘œν˜„ν–ˆλ‹€κ³  ν•΄μ„œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ˜λŠ” 것은 μ•„λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©° λ©”λͺ¨λ¦¬μ— λ‘œλ“œλœ λ°μ΄ν„°λŠ” ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ©΄ μ‚¬λΌμ§€λŠ”λ°, κ·Έλž˜μ„œ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ”λΌλ„ 객체가 사라지지 μ•Šλ„λ‘ μ €μž₯ν•˜κ³  볡원할 수 μžˆλ„λ‘ μ˜μ†ν™”(νΌμ‹œμŠ€ν„΄μ‹œ, Persistency)κ°€ ν•„μš”ν•˜λ‹€.
μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ™μž‘μ„ μœ„ν•΄ 객체λ₯Ό μ €μž₯ν•˜κ³  λ³΅μ›ν•˜λŠ” ν–‰μœ„λŠ” 도메인 κ°œλ…κ³Ό 거리가 λ©€λ‹€κ³  생각할 수 μžˆμœΌλ‚˜ 생애주기λ₯Ό κ°–λŠ” μ—”ν‹°ν‹° 같은 객체의 경우 도메인 κ·œμΉ™μ— μ˜ν•΄ 생애주기가 이루어져야 ν•˜λŠ”λ° ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λŠ” κ²ƒμœΌλ‘œ 인해 κ°•μ œλ‘œ μ—”ν‹°ν‹°μ˜ 생애주기가 κ²°μ •λœλ‹€λ©΄ 도메인 κ·œμΉ™μ„ μ˜¬λ°”λ₯΄κ²Œ μœ μ§€ν•˜κ³  κ΅¬ν˜„ν•  수 μ—†κ²Œ λ˜λŠ” λ¬Έμ œκ°€ μžˆλ‹€.
κ·Έλž˜μ„œ νΌμ‹œμŠ€ν„΄μ‹œμ˜ μ—­ν• κ³Ό μ±…μž„μ„ μ§€κ²Œ ν•˜λŠ” 객체가 λ°”λ‘œ β€˜μ €μž₯μ†Œβ€™λΌλŠ” 의미λ₯Ό μ§€λ‹ˆκ³  μžˆλŠ” 리포지토리닀.

λ¦¬ν¬μ§€ν† λ¦¬μ˜ μ±…μž„

μ•žμ„œ 도메인 μ„œλΉ„μŠ€μ— λŒ€ν•œ λ‹¨μ›μ—μ„œ β€˜νšŒμ›μ •λ³΄ 쀑볡검사’ 같이 κ°’ κ°μ²΄λ‚˜ μ—”ν‹°ν‹°μ˜ ν–‰λ™μœΌλ‘œ μ •μ˜ν•˜κΈ° λΆ€μžμ—°μŠ€λŸ¬μš΄ κΈ°λŠ₯은 도메인 μ„œλΉ„μŠ€λ‘œ κ΅¬ν˜„ν•˜λŠ” 것이 μ μ ˆν•˜λ‹€λŠ” 것을 κ³΅λΆ€ν–ˆμ—ˆλ‹€.
β€˜νšŒμ›μ •λ³΄ 쀑볡검사’λ₯Ό κ΅¬ν˜„ν•˜λ €λ©΄ κΈ°μ‘΄ νšŒμ› λͺ©λ‘μ— 같은 νšŒμ›λͺ… λ˜λŠ” μ‹λ³„μžλ₯Ό κ°€μ§„ νšŒμ› μ—”ν‹°ν‹°κ°€ μžˆλŠ”μ§€λ₯Ό 확인할 수 μžˆμ–΄μ•Ό ν•˜κ³ , 그러렀면 μ€‘λ³΅λœ νšŒμ› μ—”ν‹°ν‹°κ°€ μ‘΄μž¬ν•˜λŠ”μ§€λ₯Ό μ–΄λ”˜κ°€μ—μ„œ μ‘°νšŒν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.
μΌλ°˜μ μœΌλ‘œλŠ” λ°μ΄ν„°μ˜ μ €μž₯, 쑰회, μ—…λ°μ΄νŠΈ, μ‚­μ œ(CRUD)λ₯Ό μœ„ν•΄ λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜λŠ”λ°, νšŒμ› 데이터λ₯Ό μ‘°νšŒν•˜λŠ” μ½”λ“œκ°€ 도메인 μ„œλΉ„μŠ€ 내에 κ΅¬ν˜„λ  경우 도메인 λ‘œμ§μ„ νŒŒμ•…ν•˜κΈ° μ–΄λ €μ›Œμ§ˆλΏλ”λŸ¬ νšŒμ› 정보λ₯Ό μ‘°νšŒν•˜λŠ” 둜직이 λΆˆν•„μš”ν•˜κ²Œ λ…ΈμΆœλ˜κ²Œ λœλ‹€.
κ·Έλž˜μ„œ 리포지토리 객체λ₯Ό λ§Œλ“€μ–΄ λ°μ΄ν„°λ² μ΄μŠ€μ— λŒ€ν•œ μ ‘κ·Ό μ±…μž„μ„ λΆ€μ—¬ν•˜κ³  CRUD와 같은 행동은 리포지토리에 μ •μ˜ν•˜κ²Œ λœλ‹€.

λ¦¬ν¬μ§€ν† λ¦¬μ˜ ν˜•νƒœ

데이터λ₯Ό μ‘°νšŒν•  수 μžˆλŠ” β€˜μ–΄λ”˜κ°€β€™λ‘œ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ NoSQL λ°μ΄ν„°λ² μ΄μŠ€ 등이 일반적으둜 μ‚¬μš©λ˜κΈ°λŠ” ν•˜μ§€λ§Œ 리포지토리가 λ°˜λ“œμ‹œ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μ—°κ΄€λœ 속성과 ν–‰λ™λ§Œ μ •μ˜λ˜μ–΄μ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€. λ°μ΄ν„°λŠ” 파일둜 μ €μž₯을 ν•  μˆ˜λ„ 있고 ν…ŒμŠ€νŠΈ ν™˜κ²½μ²˜λŸΌ λ°μ΄ν„°μ˜ μœ μ§€κ°€ μ€‘μš”ν•˜μ§€ μ•Šλ‹€λ©΄ 인 λ©”λͺ¨λ¦¬ μ €μž₯μ†Œλ₯Ό κ΅¬ν˜„ν•΄μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆλ‹€.
μ€‘μš”ν•œ 것은 데이터λ₯Ό μ €μž₯ν•˜κ³  μ‘°νšŒν•˜λŠ” λ“±μ˜ κ·œμΉ™μ΄ μ •μ˜λ˜λŠ” 객체가 리포지토리고 μ–΄λ–€ μ’…λ₯˜μ˜ DBλ₯Ό μ“°κ±°λ‚˜ μ–΄λ–€ λ°©μ‹μœΌλ‘œ 데이터λ₯Ό λ‹€λ£¨λŠ”μ§€μ— λŒ€ν•΄μ„œλŠ” 리포지토리 λ°–μ—μ„œ λ…ΈμΆœλ˜μ§€ μ•Šμ•„μ•Ό ν•œλ‹€λŠ” 것이닀.

리포지토리에 μ •μ˜ν•˜κΈ° λΆ€μ μ ˆν•œ λ©”μ†Œλ“œ

β€˜νšŒμ›μ •λ³΄ 쀑볡검사’λ₯Ό κ΅¬ν˜„ν•  λ•Œ νšŒμ›μ„ μ‘°νšŒν•˜κΈ° μœ„ν•œ λ©”μ†Œλ“œ find()λ‚˜ 이미 λ™μΌν•œ νšŒμ›μ΄ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” exists() λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆμ„ 것이닀. 이 λ•Œ exists()λŠ” 어디에 μ •μ˜ν•˜λŠ” 것이 μ’‹μ„κΉŒ?
μ €μž₯μ†Œμ— νšŒμ›μ •λ³΄κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” 것이기 λ•Œλ¬Έμ— 리포지토리에 μ •μ˜ν•˜λŠ” 것이 μ μ ˆν•˜λ‹€κ³  μƒκ°ν•˜κΈ° μ‰½μ§€λ§Œ β€˜λ™μΌν•œ νšŒμ›β€™μ΄λΌλŠ” 쑰건의 μ„ΈλΆ€ κ·œμΉ™μ€ 도메인 κ·œμΉ™μ— ν•΄λ‹Ήν•˜κΈ° λ•Œλ¬Έμ— 이λ₯Ό 리포지토리에 κ΅¬ν˜„ν•˜λŠ” 것은 λ¦¬ν¬μ§€ν† λ¦¬μ˜ μ±…μž„μ„ λ²—μ–΄λ‚˜κ²Œ λ˜λ―€λ‘œ 도메인 μ„œλΉ„μŠ€μ— κ΅¬ν˜„ν•˜λŠ” 것이 μ μ ˆν•˜λ‹€.
λ‹€λ§Œ, μ–΄λ–»κ²Œ κ΅¬ν˜„ν•˜λŠλƒμ— 따라 μ°¨μ΄λŠ” μžˆμ„ 수 μžˆλŠ”λ° λ§Œμ•½ exists() λ©”μ†Œλ“œμ— User 객체 λŒ€μ‹  user_idλ‚˜ user_name 같은 ꡬ체적인 인자λ₯Ό μ£Όμ–΄ β€˜λ™μΌν•œ νšŒμ›β€™μ„ μ‘°νšŒν•˜λŠ” 것이 μ•„λ‹ˆλΌ β€˜κ°™μ€ id μ‘°νšŒβ€™ λ˜λŠ” β€˜κ°™μ€ 이름 μ‘°νšŒβ€™ 같은 μ±…μž„μ„ λΆ€μ—¬ν•œλ‹€λ©΄ 도메인 κ·œμΉ™μ„ λ“œλŸ¬λ‚΄μ§€ μ•Šκ³  리포지토리에 μ–΄μšΈλ¦¬λŠ” λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•  수 μžˆλ‹€.

리포지토리 κ΅¬ν˜„μ‹œ μœ μ˜ν•  점

  • 객체λ₯Ό μ €μž₯ν•˜κ±°λ‚˜ μ—…λ°μ΄νŠΈ ν•˜λŠ” λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•  λ•ŒλŠ” 객체 자체λ₯Ό 인자둜 받도둝 ν•˜λŠ” 것이 μ’‹λ‹€. κ·Έλ ‡μ§€ μ•ŠμœΌλ©΄ 객체의 속성 λ³„λ‘œ μ €μž₯/μˆ˜μ • λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•΄μ•Ό ν•˜κ²Œ 될 수 있으며 객체의 μˆ˜μ •μ€ μ• μ΄ˆμ— 객체 μžμ‹ μ—κ²Œ λ§‘κΈ°λŠ” 것이 μ˜³λ‹€.
  • μ €μž₯된 λͺ¨λ“  객체λ₯Ό λ³΅μ›ν•˜λŠ” λ©”μ†Œλ“œλŠ” μ»΄ν“¨ν„°μ˜ λ¦¬μ†ŒμŠ€λ₯Ό μ†Œλͺ¨μ‹œν‚€κΈ° 쉽닀. μ„±λŠ₯μ—μ„œ κΈ°μ•ˆν•˜λŠ” 문제λ₯Ό νšŒν”Όν•˜κΈ° μœ„ν•΄ 전체 λ³΅μ›λ³΄λ‹€λŠ” ν•„μš”μ— 따라 더 μ ν•©ν•œ λ©”μ†Œλ“œλ₯Ό μ •μ˜ν•˜λŠ” 것이 μ’‹λ‹€.
  • 인 λ©”λͺ¨λ¦¬ 리포지토리λ₯Ό κ΅¬ν˜„ν•˜λŠ” 경우 객체 쑰회 μ‹œ 찾은 객체λ₯Ό κ·ΈλŒ€λ‘œ λ°˜ν™˜ν•˜μ§€ 말고 κΉŠμ€ 볡사λ₯Ό 톡해 λ§Œλ“  μƒˆλ‘œμš΄ 객체λ₯Ό λ°˜ν™˜ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€. μžμΉ«ν•˜λ©΄ λ³΅μ›λœ μΈμŠ€ν„΄μŠ€λ₯Ό μ‘°μž‘ν–ˆμ„ λ•Œ 리포지토리에 μ €μž₯된 객체에 영ν–₯을 λ―ΈμΉ  수 있기 λ•Œλ¬Έμ΄λ‹€.
Β