Package - taeyun-ham/andalos GitHub Wiki

Package Structure

com.taeyoon.api
β”œβ”€β”€ domain                # 엔터티와 λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ ν¬ν•¨ν•˜λŠ” μ΅œλ‚΄λΆ€ 계측
β”‚   β”œβ”€β”€ user              # λΉ„μ¦ˆλ‹ˆμŠ€ 도메인 (예:μœ μ €)
β”‚   β”‚   β”œβ”€β”€ model         # 도메인 λͺ¨λΈ(μ—”ν„°ν‹°, κ°’ 객체 λ“±)
β”‚   β”‚   β”œβ”€β”€ creation      # 도메인 ν–‰μœ„
β”‚   β”‚   └── withdraw      # 도메인 ν–‰μœ„
β”‚   └── order             # λΉ„μ¦ˆλ‹ˆμŠ€ 도메인 (예:μ£Όλ¬Έ)
β”‚       β”œβ”€β”€ model          
β”‚       β”œβ”€β”€ creation       
β”‚       └── delivery       
β”‚
β”œβ”€β”€ application           # μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” μ‚¬μš© 사둀 계측
β”‚   β”œβ”€β”€ dto               # 데이터 전솑 객체
β”‚   β”œβ”€β”€ service           # μ‘μš© μ„œλΉ„μŠ€ (λΉ„μ¦ˆλ‹ˆμŠ€ 둜직의 κ΅¬ν˜„)
β”‚   └── exception         # μ‘μš© κ³„μΈ΅μ˜ μ˜ˆμ™Έ μ •μ˜
β”‚
β”œβ”€β”€ infra                 # μΈν”„λΌμŠ€νŠΈλŸ­μ²˜ 계측 (λ°μ΄ν„°λ² μ΄μŠ€, λ©”μ‹œμ§• μ‹œμŠ€ν…œ λ“± μ™ΈλΆ€μ™€μ˜ 톡신을 λ‹΄λ‹Ή)
β”‚   β”œβ”€β”€ persistence       # λ°μ΄ν„°λ² μ΄μŠ€ μ ‘κ·Όκ³Ό κ΄€λ ¨λœ κ΅¬ν˜„ (리포지토리 κ΅¬ν˜„μ²΄)
β”‚   β”œβ”€β”€ configuration     # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ •κ³Ό κ΄€λ ¨λœ 클래슀
β”‚   └── external          # μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Όμ˜ 톡신을 λ‹΄λ‹Ή
β”‚
└── interfaces            # μΈν„°νŽ˜μ΄μŠ€ μ–΄λŒ‘ν„° 계측 (μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€, μ›Ή API λ“±)
    β”œβ”€β”€ web               # μ›Ή μΈν„°νŽ˜μ΄μŠ€ (컨트둀러)
    β”œβ”€β”€ cli               # μ»€λ§¨λ“œλΌμΈ μΈν„°νŽ˜μ΄μŠ€
    └── rest              # REST API μΈν„°νŽ˜μ΄μŠ€
  • νŒ¨ν‚€μ§€ ꡬ쑰에 λŒ€ν•œ 고민이 λ§Žμ•˜λ‹€.
  • 이미 λ§Žμ€ 문제점이 발견된 전톡적인 μˆ˜ν‰ λΆ„ν•  κ³„μΈ΅ν˜• νŒ¨ν‚€μ§€λ‘œλŠ” ν•  수 μ—†κ³ ,
  • MSA 둜 ν™•μž₯ κ°€λŠ₯ν•œ 도메인 μ€‘μ‹¬μ˜ κΈ°λŠ₯ 기반 νŒ¨ν‚€μ§€λ‘œ ꡬ성해야 ν•œλ‹€.
  • λ˜ν•œ μ €μˆ˜μ€€κ³Ό κ³ μˆ˜μ€€μ˜ 경계가 ν™•μ‹€ν•΄μ•Ό ν•˜κ³  격리 μ‹œμΌœμ•Ό ν•˜κΈ°μ— μœ„μ™€ 같은 νŒ¨ν‚€μ§€ ꡬ쑰λ₯Ό κ΅¬μ„±ν•˜μ˜€λ‹€.

Domain

β”œβ”€β”€ domain                # 엔터티와 λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ ν¬ν•¨ν•˜λŠ” μ΅œλ‚΄λΆ€ 계측
β”‚   β”œβ”€β”€ user              # λΉ„μ¦ˆλ‹ˆμŠ€ 도메인 (예:μœ μ €)
β”‚   β”‚   β”œβ”€β”€ model         # 도메인 λͺ¨λΈ(μ—”ν„°ν‹°, κ°’ 객체 λ“±)
β”‚   β”‚   β”œβ”€β”€ creation      # 도메인 ν–‰μœ„
β”‚   β”‚   └── withdraw      # 도메인 ν–‰μœ„
β”‚   └── order             # λΉ„μ¦ˆλ‹ˆμŠ€ 도메인 (예:μ£Όλ¬Έ)
β”‚       β”œβ”€β”€ model          
β”‚       β”œβ”€β”€ creation       
β”‚       └── delivery       
  • 도메인은 νŒ¨ν‚€μ§€ ꡬ쑰만 보더라도 μ–΄λ–€ μ„œλΉ„μŠ€λ₯Ό ν•˜λŠ”μ§€ μ•Œ 수 μžˆλ„λ‘ ν•΄μ•Ό ν•œλ‹€.
  • μ €μˆ˜μ€€μΈ ν”„λ ˆμž„μ›Œν¬μ™€ κ²©λ¦¬λ˜μ–΄μ•Ό ν•˜κ³  μ˜€λ‘œμ§€ 도메인 λ‘œμ§μ—λ§Œ 집쀑해야 ν•œλ‹€.
  • 각 도메인 ν•˜μœ„λŠ” μ—”ν‹°ν‹° 객체와 ν–‰μœ„λ‘œ κ΅¬μ„±ν•œλ‹€.

Application

β”œβ”€β”€ application           # μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” μ‚¬μš© 사둀 계측
β”‚   β”œβ”€β”€ dto               # 데이터 전솑 객체
β”‚   β”œβ”€β”€ service           # μ‘μš© μ„œλΉ„μŠ€ (λΉ„μ¦ˆλ‹ˆμŠ€ 둜직의 κ΅¬ν˜„)
β”‚   └── exception         # μ‘μš© κ³„μΈ΅μ˜ μ˜ˆμ™Έ μ •μ˜   
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ λ‹΄λ‹Ήν•˜λŠ” μ˜μ—­μ΄λ‹€.
  • ν”„λ ˆμž„μ›Œν¬μ™€ 쒅속적이고 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ²˜λ¦¬ν•  λ•Œ μ—¬λŸ¬ 도메인듀을 ν™œμš©ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.
  • μ°¨ν›„ MSA 둜 ν™•μž₯ν•  경우 μˆ˜μ •λ  뢀뢄이 κ°€μž₯ λ§Žμ€ 곳이 될 λ“― ν•˜λ‹€.
  • dto : μΈν„°νŽ˜μ΄μŠ€ μ–΄λ‹΅ν„° κ³„μΈ΅μ—μ„œ 데이터λ₯Ό 전솑할 λ•Œ μ‚¬μš©ν•˜λŠ” 객체듀이 μžˆλŠ” 곳이닀.
  • service : λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ κ΅¬ν˜„ν•˜λŠ” 곳이닀.
  • exception : λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 μ²˜λ¦¬μ‹œ λ°œμƒν•˜λŠ” exception 듀이 μžˆλŠ” 곳이닀.

Infrastructure

β”œβ”€β”€ infra                 # μΈν”„λΌμŠ€νŠΈλŸ­μ²˜ 계측 (λ°μ΄ν„°λ² μ΄μŠ€, λ©”μ‹œμ§• μ‹œμŠ€ν…œ λ“± μ™ΈλΆ€μ™€μ˜ 톡신을 λ‹΄λ‹Ή)
β”‚   β”œβ”€β”€ persistence       # λ°μ΄ν„°λ² μ΄μŠ€ μ ‘κ·Όκ³Ό κ΄€λ ¨λœ κ΅¬ν˜„ (리포지토리 κ΅¬ν˜„μ²΄)
β”‚   β”œβ”€β”€ configuration     # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ„€μ •κ³Ό κ΄€λ ¨λœ 클래슀
β”‚   └── external          # μ™ΈλΆ€ μ‹œμŠ€ν…œκ³Όμ˜ 톡신을 λ‹΄λ‹Ή
  • μ €μˆ˜μ€€μ— ν•΄λ‹Ήν•˜λŠ” νŒ¨ν‚€μ§€λ“€μ΄ μžˆλŠ” 곳이닀.
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 섀정에 κ΄€λ ¨λœ 클래슀, λ°μ΄ν„°λ² μ΄μŠ€ μ ‘κ·Ό κ΄€λ ¨λœ 클래슀 λ˜λŠ” μ™ΈλΆ€ μΈν„°νŽ˜μ΄μŠ€μ— κ΄€λ ¨λœ ν΄λž˜μŠ€λ“€μ΄ μžˆλŠ” 곳이닀.
  • Spring framework λ₯Ό μ‚¬μš©ν•  경우 각쒅 configuration 클래슀, Jpa λ₯Ό μ‚¬μš©ν•  경우 repository κ΅¬ν˜„μ²΄ 등이 μžˆλ‹€.
  • external 은 타 μ‹œμŠ€ν…œκ³Όμ˜ μΈν„°νŽ˜μ΄μŠ€ κ΄€λ ¨λœ 클래슀, λ˜λŠ” cloud service λ₯Ό ν™œμš©ν•˜κΈ° μœ„ν•œ sdk μ²˜λ¦¬λ‘œμ§μ„ λ‹΄λ‹Ήν•˜λŠ” ν΄λž˜μŠ€λ“€μ΄ μžˆλ‹€.

Interfaces

└── interfaces            # μΈν„°νŽ˜μ΄μŠ€ μ–΄λŒ‘ν„° 계측 (μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€, μ›Ή API λ“±)
    β”œβ”€β”€ web               # μ›Ή μΈν„°νŽ˜μ΄μŠ€ (컨트둀러)
    β”œβ”€β”€ cli               # μ»€λ§¨λ“œλΌμΈ μΈν„°νŽ˜μ΄μŠ€
    └── rest              # REST API μΈν„°νŽ˜μ΄μŠ€
  • μΈν„°νŽ˜μ΄μŠ€ μ–΄λŒ‘ν„° 계측이닀.
  • ν•˜μœ„ νŒ¨ν‚€μ§€λ§Œ 보더라도 금방 이해가 될 것이닀.
  • Spring framework λ₯Ό μ‚¬μš©ν•  경우 Controller κ°€ 여기에 μœ„μΉ˜ν•œλ‹€.

μ’…ν•©

  • μΈν„°νŽ˜μ΄μŠ€ μ–΄λŒ‘ν„° 계측 : interfaces, infra
  • μœ μŠ€μΌ€μ΄μŠ€ 계측 : application
  • μ—”ν‹°ν‹° 계측 : domain

the-clean-architecture