도메인 모델링

도메인 주도 섀계 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν•΅μ‹¬μ—λŠ” μ‹œμŠ€ν…œμ˜ 핡심 지식과 λΉ„μ¦ˆλ‹ˆμŠ€ κ·œμΉ™μ„ λ‚˜νƒ€λ‚΄λŠ” λͺ¨λΈμ΄ μžˆμŠ΅λ‹ˆλ‹€. 도메인을 잘 λͺ¨λΈλ§ν•œλ‹€λŠ” 것은 ν˜„μ‹€ μ„Έκ³„μ˜ κ°œλ…μ„ ν‘œν˜„λ ₯ 있고, 응집λ ₯ 있으며, 일관성 μžˆλŠ” μ†Œν”„νŠΈμ›¨μ–΄ ꡬ쑰둜 λ³€ν™˜ν•˜λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.

μ—”ν‹°ν‹°

μ—”ν‹°ν‹°λŠ” 주둜 μ‹λ³„μ„±μœΌλ‘œ μ •μ˜λ˜λŠ” 객체이며 λ‹¨μˆœνžˆ μ†μ„±λ§ŒμœΌλ‘œ μ •μ˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 속성이 μ‹œκ°„μ΄ μ§€λ‚˜λ©΄μ„œ λ³€κ²½λ˜λ”λΌλ„ μ—”ν‹°ν‹°μ˜ 식별성은 λ³€ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ£Όμš” νŠΉμ§•:

  • κ³ μœ ν•œ 식별성(일반적으둜 Id)을 κ°€μ§‘λ‹ˆλ‹€.
  • μ€‘μš”ν•œ 것은 μ—”ν‹°ν‹°κ°€ 무엇을 ν¬ν•¨ν•˜λŠ”μ§€κ°€ μ•„λ‹ˆλΌ λˆ„κ΅¬μΈμ§€μž…λ‹ˆλ‹€.
  • 속성은 μ‹œκ°„μ΄ μ§€λ‚˜λ©΄μ„œ 변경될 수 μžˆμŠ΅λ‹ˆλ‹€.

Lino둜 μ—”ν‹°ν‹° μƒμ„±ν•˜κΈ°

Linoλ₯Ό μ‚¬μš©ν•˜μ—¬ μƒˆ μ—”ν‹°ν‹°λ₯Ό μƒμ„±ν•˜λ €λ©΄ λ‹€μŒμ„ μ‹€ν–‰ν•˜μ„Έμš”:

lino entity new

CLI λ„μš°λ―Έκ°€ μš”μ²­ν•©λ‹ˆλ‹€:

  • μ„œλΉ„μŠ€ – μ—”ν‹°ν‹°κ°€ 생성될 μ„œλΉ„μŠ€μž…λ‹ˆλ‹€.
  • λͺ¨λ“ˆ – μ—”ν‹°ν‹°κ°€ 생성될 λͺ¨λ“ˆ(λͺ¨λ“ˆν˜• μ„œλΉ„μŠ€μ—λ§Œ ν•΄λ‹Ή).
  • μ—”ν‹°ν‹° 이름 – 도메인과 λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ—μ„œ μ‚¬μš©λ˜λŠ” μ΄λ¦„μž…λ‹ˆλ‹€.

κ·Έ ν›„, 각 ν•„λ“œλ₯Ό μ„€μ •ν•˜μ—¬ μ—”ν‹°ν‹°λ₯Ό κ΅¬μ„±ν•©λ‹ˆλ‹€.

μ‚¬μš© κ°€λŠ₯ν•œ ν•„λ“œ νƒ€μž…

νƒ€μž… μ„€λͺ… λ²”μœ„ / μ°Έκ³  사항
short16λΉ„νŠΈ μ •μˆ˜-32,768 β†’ 32,767
int32λΉ„νŠΈ μ •μˆ˜-2,147,483,648 β†’ 2,147,483,647
long64λΉ„νŠΈ μ •μˆ˜-9,223,372,036,854,775,808 β†’ 9,223,372,036,854,775,807
stringν…μŠ€νŠΈμ•½ 20μ–΅ λ¬ΈμžκΉŒμ§€
boolλΆˆλ¦¬μ–Έ κ°’true λ˜λŠ” false
GuidκΈ€λ‘œλ²Œ 고유 μ‹λ³„μžλΆ„μ‚°λœ κ³ μœ μ„±
decimalκ³ μ • μ†Œμˆ˜μ  숫자금육 값에 적합
float뢀동 μ†Œμˆ˜μ  숫자 (32λΉ„νŠΈ)μ•½ 6–9자리 정밀도
double뢀동 μ†Œμˆ˜μ  숫자 (64λΉ„νŠΈ)μ•½ 15–17자리 정밀도
DateTimeλ‚ μ§œ 및 μ‹œκ°„μ‹œκ°„λŒ€ 포함
DateOnlyλ‚ μ§œλ§Œ (C# 10+)–
TimeOnlyμ‹œκ°„λ§Œ (C# 10+)–
Entityλ‹€λ₯Έ μ—”ν‹°ν‹° μ°Έμ‘°1 : 1 λ˜λŠ” 1 : N
Value ObjectλΆˆλ³€ κ°’ 객체예: μ£Όμ†Œ, CPF
Enumμ—΄κ±°ν˜•κ³ μ •λœ κ°’ μ§‘ν•©
List<Entity>μ—”ν‹°ν‹° 리슀트1 : N
ManyToManyλ‹€λŒ€λ‹€ 관계쑰인 ν…Œμ΄λΈ” ν•„μš”

예제

Person μ—”ν‹°ν‹° μƒμ„±ν•˜κΈ°:

β”Œβ”€β”€β”€β”€β”¬β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ PK β”‚ FK β”‚ Property name β”‚ Type   β”‚ Length β”‚ Required  β”‚ Auto-increment β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ x  β”‚    β”‚ Id            β”‚ int    β”‚        β”‚     x     β”‚       x        β”‚
β”œβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚    β”‚    β”‚ Name          β”‚ string β”‚  100   β”‚     x     β”‚                β”‚
β””β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Linoκ°€ μƒμ„±ν•œ ꡬ쑰:

MyApp/
└── src/
    └── Services/
        └── MyService/
            └── Domain/
                β”œβ”€β”€ MyApp.MyService.Domain.csproj
                └── Aggregates/
                    └── People/
                        β”œβ”€β”€ Person.cs
                        β”œβ”€β”€ Errors/
                        β”‚   └── PersonErrors.cs
                        β”œβ”€β”€ Repositories/
                        β”‚   └── IPersonRepository.cs
                        └── Resources/
                            └── Person/
                                β”œβ”€β”€ PersonResources.resx
                                β”œβ”€β”€ PersonResources.en.resx
                                └── PersonResources.pt-BR.resx

μ—”ν‹°ν‹°λ₯Ό μ •μ˜ν•œ ν›„, Linoλ₯Ό μ‚¬μš©ν•˜μ—¬ Migrationsλ₯Ό κ΄€λ¦¬ν•˜κ³  λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ™κΈ°ν™”ν•˜μ„Έμš”. 이 과정은 Persistence Layer μ„Ήμ…˜μ—μ„œ μžμ„Ένžˆ λ‹€λ£° μ˜ˆμ •μž…λ‹ˆλ‹€.

κ°’ 객체

κ°’ κ°μ²΄λŠ” 였직 μ†μ„±λ“€λ‘œλ§Œ μ •μ˜λ˜λŠ” 도메인 κ°œλ…μ„ λ‚˜νƒ€λ‚΄λ©°, 자체적인 μ‹λ³„μžκ°€ μ—†μŠ΅λ‹ˆλ‹€. 두 κ°’ κ°μ²΄λŠ” λͺ¨λ“  값이 κ°™μœΌλ©΄ λ™μΌν•˜λ‹€κ³  κ°„μ£Όλ©λ‹ˆλ‹€.

μ£Όμš” νŠΉμ§•:

  • 생성 ν›„ λΆˆλ³€μž…λ‹ˆλ‹€.
  • Idκ°€ μ—†μŠ΅λ‹ˆλ‹€.

Lino둜 κ°’ 객체 μƒμ„±ν•˜κΈ°

λ‹€μŒ λͺ…령을 μ‹€ν–‰ν•˜μ„Έμš”:

lino value-object new

CLIκ°€ λ‹€μŒμ„ μš”μ²­ν•©λ‹ˆλ‹€:

  • μ„œλΉ„μŠ€ – 객체가 생성될 μ„œλΉ„μŠ€.
  • λͺ¨λ“ˆ – 객체가 생성될 λͺ¨λ“ˆ(λͺ¨λ“ˆν˜• μ„œλΉ„μŠ€μ—λ§Œ ν•΄λ‹Ή).
  • μœ„μΉ˜ – 도메인 루트 λ˜λŠ” νŠΉμ • μ• κ·Έλ¦¬κ²Œμ΄νŠΈ.
  • κ°’ 객체 이름.

그런 λ‹€μŒ 객체λ₯Ό κ΅¬μ„±ν•˜λŠ” ν•„λ“œλ₯Ό μ •μ˜ν•˜μ„Έμš”.

μ‚¬μš© κ°€λŠ₯ν•œ ν•„λ“œ νƒ€μž…

νƒ€μž…μ„€λͺ…λΉ„κ³ 
short16λΉ„νŠΈ μ •μˆ˜-32,768 β†’ 32,767
int32λΉ„νŠΈ μ •μˆ˜-2,147,483,648 β†’ 2,147,483,647
long64λΉ„νŠΈ μ •μˆ˜-9,223,372,036,854,775,808 β†’ 9,223,372,036,854,775,807
stringν…μŠ€νŠΈμ•½ 20μ–΅ λ¬ΈμžκΉŒμ§€
boolλΆˆλ¦¬μ–Έtrue/false
decimalμ •ν™•ν•œ μ†Œμˆ˜μ  μˆ«μžκΈˆμ•‘ κ°’
float뢀동 μ†Œμˆ˜μ  숫자 (32λΉ„νŠΈ)μ•½ 6~9자리
double뢀동 μ†Œμˆ˜μ  숫자 (64λΉ„νŠΈ)μ•½ 15~17자리
DateTimeλ‚ μ§œ/μ‹œκ°„νƒ€μž„μ‘΄ 포함
DateOnlyλ‚ μ§œλ§ŒC# 10 이상
TimeOnlyμ‹œκ°„λ§ŒC# 10 이상

예제

κ°’ 객체 Address:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Property name β”‚ Type   β”‚ Length β”‚ Required  β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Street        β”‚ string β”‚  100   β”‚     x     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Number        β”‚ string β”‚   10   β”‚     x     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Neighborhood  β”‚ string β”‚   50   β”‚           β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ City          β”‚ string β”‚  100   β”‚     x     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ State         β”‚ string β”‚   2    β”‚     x     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ PostalCode    β”‚ string β”‚   20   β”‚     x     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ Country       β”‚ string β”‚  100   β”‚     x     β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

μƒμ„±λœ 파일 ꡬ쑰 (μ• κ·Έλ¦¬κ²Œμ΄νŠΈ Person):

MyApp/
└── src/
    └── Services/
        └── MyService/
            └── Domain/
                β”œβ”€β”€ MyApp.MyService.Domain.csproj
                └── Aggregates/
                    └── People/
                        β”œβ”€β”€ Person.cs
                        β”œβ”€β”€ ValueObjects/
                        β”‚   └── Address.cs
                        β”œβ”€β”€ Errors/
                        β”‚   β”œβ”€β”€ AddressErrors.cs
                        β”‚   └── PersonErrors.cs
                        β”œβ”€β”€ Repositories/
                        β”‚   └── IPersonRepository.cs
                        └── Resources/
                            β”œβ”€β”€ Address/
                            β”‚   β”œβ”€β”€ AddressResources.resx
                            β”‚   β”œβ”€β”€ AddressResources.en.resx
                            β”‚   └── AddressResources.pt-BR.resx
                            └── Person/
                                β”œβ”€β”€ PersonResources.resx
                                β”œβ”€β”€ PersonResources.en.resx
                                └── PersonResources.pt-BR.resx

엔티티와 λ§ˆμ°¬κ°€μ§€λ‘œ MigrationsλŠ” Lino에 μ˜ν•΄ κ΄€λ¦¬λ˜μ–΄ 데이터 λͺ¨λΈμ„ 동기화 μƒνƒœλ‘œ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ—΄κ±°ν˜•

DDDμ—μ„œ μ—΄κ±°ν˜•μ€ C#의 전톡적인 enum을 λ„˜μ–΄μ„€ 수 μžˆμŠ΅λ‹ˆλ‹€. μƒνƒœλ₯Ό ν‘œν˜„ν•˜λŠ” ν’λΆ€ν•œ κ°μ²΄λ‘œμ„œ μœ νš¨μ„± 검사, 보쑰 λ©”μ„œλ“œ, 심지어 λ™μž‘κΉŒμ§€ 포함할 수 μžˆμŠ΅λ‹ˆλ‹€.

동기:

  • C#의 enum은 μ •μˆ˜ λ˜λŠ” λ¬Έμžμ—΄ κ°’μ—λ§Œ μ œν•œλ©λ‹ˆλ‹€.
  • 클래슀둜 μ—΄κ±°ν˜•μ„ λͺ¨λΈλ§ν•˜λ©΄ 더 큰 μœ μ—°μ„±κ³Ό ν‘œν˜„λ ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.

μ£Όμš” νŠΉμ§•:

  • 곡톡 κΈ°λ³Έ 클래슀λ₯Ό μƒμ†ν•˜λ©° Id와 이름을 μΊ‘μŠν™”ν•˜λŠ” ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
  • μœ νš¨μ„± 검사, 보쑰 λ©”μ„œλ“œ 및 λ™μž‘μ„ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Lino둜 μ—΄κ±°ν˜• μƒμ„±ν•˜κΈ°

λ‹€μŒ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜μ„Έμš”:

lino enum new

도움말이 λ‹€μŒμ„ μš”μ²­ν•©λ‹ˆλ‹€:

  • μ„œλΉ„μŠ€.
  • λͺ¨λ“ˆ (적용 κ°€λŠ₯ν•œ 경우).
  • μœ„μΉ˜ – 도메인 루트 λ˜λŠ” μ• κ·Έλ¦¬κ²Œμ΄νŠΈ.
  • μ—΄κ±°ν˜• 이름.
  • μœ ν˜• – 전톡적인 enum λ˜λŠ” 슀마트 Enum (class).
  • μ €μž₯ 방식 – λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ int λ˜λŠ” string.

예제

PersonStatus μ—΄κ±°ν˜•:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Value β”‚ Name      β”‚ Display Name β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 1     β”‚ Active    β”‚ Active       β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 2     β”‚ Inactive  β”‚ Inactive     β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 3     β”‚ Suspended β”‚ Suspended    β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ 4     β”‚ Deleted   β”‚ Deleted      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

μƒμ„±λœ ꡬ쑰:

MyApp/
└── src/
    └── Services/
        └── MyService/
            └── Domain/
                β”œβ”€β”€ MyApp.MyService.Domain.csproj
                └── Aggregates/
                    └── People/
                        β”œβ”€β”€ Person.cs
                        β”œβ”€β”€ Enums/
                        β”‚   └── PersonStatus.cs
                        β”œβ”€β”€ ValueObjects/
                        β”‚   └── Address.cs
                        β”œβ”€β”€ Errors/
                        β”‚   β”œβ”€β”€ AddressErrors.cs
                        β”‚   └── PersonErrors.cs
                        β”œβ”€β”€ Repositories/
                        β”‚   └── IPersonRepository.cs
                        └── Resources/
                            β”œβ”€β”€ Address/
                            β”‚   β”œβ”€β”€ AddressResources.resx
                            β”‚   β”œβ”€β”€ AddressResources.en.resx
                            β”‚   └── AddressResources.pt-BR.resx
                            β”œβ”€β”€ Person/
                            β”‚   β”œβ”€β”€ PersonResources.resx
                            β”‚   β”œβ”€β”€ PersonResources.en.resx
                            β”‚   └── PersonResources.pt-BR.resx
                            └── PersonStatus/
                                β”œβ”€β”€ PersonStatusResources.resx
                                β”œβ”€β”€ PersonStatusResources.en.resx
                                └── PersonStatusResources.pt-BR.resx

μ—΄κ±°ν˜• 값을 string으둜 μ €μž₯ν•˜λŠ” 것도 κ°€λŠ₯ν•˜λ©° 가독성을 높일 수 μžˆμ§€λ§Œ, μ„±λŠ₯κ³Ό μ €μž₯ 곡간 λ©΄μ—μ„œλŠ” 덜 효율적일 수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 값은 int둜 μ €μž₯ν•˜κ³ , 무결성 μœ μ§€μ™€ μœ μ§€λ³΄μˆ˜λ₯Ό μ‰½κ²Œ ν•˜κΈ° μœ„ν•΄ μ—΄κ±°ν˜• κ°’κ³Ό μΌμΉ˜ν•˜λŠ” κΈ°λ³Έ ν‚€λ₯Ό κ°€μ§„ 보쑰 μ—”ν‹°ν‹°(ν…Œμ΄λΈ”)λ₯Ό μƒμ„±ν•˜λŠ” 것을 ꢌμž₯ν•©λ‹ˆλ‹€.

μ—΄κ±°ν˜•μ„ μ •μ˜ν•œ ν›„μ—λŠ” Linoλ₯Ό μ‚¬μš©ν•˜μ—¬ Migrationsλ₯Ό μƒμ„±ν•˜κ³  μ μš©ν•˜μ—¬ λ°μ΄ν„°λ² μ΄μŠ€κ°€ 도메인 λͺ¨λΈμ„ λ°˜μ˜ν•˜λ„λ‘ ν•˜μ„Έμš”. μžμ„Έν•œ λ‚΄μš©μ€ μ˜μ†μ„± 계측 μ„Ήμ…˜μ„ μ°Έκ³ ν•˜μ‹­μ‹œμ˜€.

처리되지 않은 오류가 발생했습니다. 새로 고침 πŸ—™