μλ°μ€ν¬λ¦½νΈ λͺ¨λμ κ° κ°μ²΄λ₯Ό ν΅ν΄ κ²¬κ³ νκ³ μ μ§λ³΄μ λ° ν μ€νΈκ° μ©μ΄ν μ½λλ₯Ό μμ±νμΈμ. λΆλ³ λ°μ΄ν° ꡬ쑰λ₯Ό ꡬννμ¬ λ°μ΄ν° 무결μ±μ κ°ννλ λ°©λ²μ λ°°μλλ€.
μλ°μ€ν¬λ¦½νΈ λͺ¨λ κ° κ°μ²΄: λΆλ³ λ°μ΄ν° λͺ¨λΈλ§
νλ μλ°μ€ν¬λ¦½νΈ κ°λ°μμ λ°μ΄ν° 무결μ±κ³Ό μ μ§λ³΄μμ±μ 보μ₯νλ κ²μ λ§€μ° μ€μν©λλ€. μ΄λ₯Ό λ¬μ±νκΈ° μν κ°λ ₯ν κΈ°μ μ€ νλλ λͺ¨λμ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ λ΄μμ κ° κ°μ²΄(Value Objects)λ₯Ό νμ©νλ κ²μ λλ€. κ° κ°μ²΄λ νΉν λΆλ³μ±(immutability)κ³Ό κ²°ν©λ λ, λ κΉ¨λνκ³ μμΈ‘ κ°λ₯νλ©° ν μ€νΈνκΈ° μ¬μ΄ μ½λλ‘ μ΄μ΄μ§λ κ²¬κ³ ν λ°μ΄ν° λͺ¨λΈλ§ μ κ·Όλ²μ μ 곡ν©λλ€.
κ° κ°μ²΄λ 무μμΈκ°?
κ° κ°μ²΄λ κ°λ μ κ°μ λνλ΄λ μκ³ λ¨μν κ°μ²΄μ λλ€. μμ μ μ 체μ±μΌλ‘ μ μλλ μν°ν°(entity)μ λ¬λ¦¬, κ° κ°μ²΄λ μμ±μΌλ‘ μ μλ©λλ€. λ κ° κ°μ²΄λ κ°μ²΄μ μ 체μ±κ³Ό μκ΄μμ΄ μμ±μ΄ κ°λ€λ©΄ λμΌν κ²μΌλ‘ κ°μ£Όλ©λλ€. κ° κ°μ²΄μ μΌλ°μ μΈ μλ λ€μκ³Ό κ°μ΅λλ€:
- ν΅ν: κΈμ μ κ°μΉλ₯Ό λνλ λλ€ (μ: USD 10, EUR 5).
- λ μ§ λ²μ: μμμΌκ³Ό μ’ λ£μΌμ λνλ λλ€.
- μ΄λ©μΌ μ£Όμ: μ ν¨ν μ΄λ©μΌ μ£Όμλ₯Ό λνλ λλ€.
- μ°νΈλ²νΈ: νΉμ μ§μμ μ ν¨ν μ°νΈλ²νΈλ₯Ό λνλ λλ€. (μ: λ―Έκ΅μ 90210, μκ΅μ SW1A 0AA, λ μΌμ 10115, μΌλ³Έμ γ100-0001)
- μ νλ²νΈ: μ ν¨ν μ νλ²νΈλ₯Ό λνλ λλ€.
- μ’ν: μ§λ¦¬μ μμΉ(μλ λ° κ²½λ)λ₯Ό λνλ λλ€.
κ° κ°μ²΄μ ν΅μ¬ νΉμ§μ λ€μκ³Ό κ°μ΅λλ€:
- λΆλ³μ±: μΌλ¨ μμ±λλ©΄ κ° κ°μ²΄μ μνλ λ³κ²½λ μ μμ΅λλ€. μ΄λ μλνμ§ μμ λΆμμ©μ μνμ μ κ±°ν©λλ€.
- κ° κΈ°λ° λλ±μ±: λ κ° κ°μ²΄λ λ©λͺ¨λ¦¬μμμ λμΌν κ°μ²΄μΈμ§κ° μλλΌ, κ·Έλ€μ κ°μ΄ κ°λ€λ©΄ λμΌν κ²μΌλ‘ κ°μ£Όλ©λλ€.
- μΊ‘μν: κ°μ λ΄λΆ ννμ μ¨κ²¨μ§κ³ , λ©μλλ₯Ό ν΅ν΄ μ κ·Όμ΄ μ 곡λ©λλ€. μ΄λ₯Ό ν΅ν΄ μ ν¨μ± κ²μ¬λ₯Ό μννκ³ κ°μ 무결μ±μ 보μ₯ν μ μμ΅λλ€.
μ κ° κ°μ²΄λ₯Ό μ¬μ©νλκ°?
μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μμ κ° κ°μ²΄λ₯Ό μ¬μ©νλ©΄ μ¬λ¬ κ°μ§ μ€μν μ΄μ μ΄ μμ΅λλ€:
- λ°μ΄ν° λ¬΄κ²°μ± ν₯μ: κ° κ°μ²΄λ μμ± μμ μ μ μ½ μ‘°κ±΄κ³Ό μ ν¨μ± κ²μ¬ κ·μΉμ κ°μ νμ¬ μ ν¨ν λ°μ΄ν°λ§ μ¬μ©λλλ‘ λ³΄μ₯ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, `EmailAddress` κ° κ°μ²΄λ μ λ ₯ λ¬Έμμ΄μ΄ μ€μ λ‘ μ ν¨ν μ΄λ©μΌ νμμΈμ§ κ²μ¦ν μ μμ΅λλ€. μ΄λ μμ€ν μ 체μ μ€λ₯κ° μ νλ κ°λ₯μ±μ μ€μ¬μ€λλ€.
- λΆμμ© κ°μ: λΆλ³μ±μ κ° κ°μ²΄μ μνκ° μλμΉ μκ² μμ λ κ°λ₯μ±μ μ κ±°νμ¬, λ μμΈ‘ κ°λ₯νκ³ μ λ’°ν μ μλ μ½λλ‘ μ΄μ΄μ§λλ€.
- ν μ€νΈ λ¨μν: κ° κ°μ²΄λ λΆλ³μ΄λ©° λλ±μ±μ΄ κ°μ κΈ°λ°νκΈ° λλ¬Έμ λ¨μ ν μ€νΈκ° ν¨μ¬ μ¬μμ§λλ€. μλ €μ§ κ°μΌλ‘ κ° κ°μ²΄λ₯Ό μμ±νκ³ μμ κ²°κ³Όμ κ°λ¨ν λΉκ΅ν μ μμ΅λλ€.
- μ½λ λͺ νμ± μ¦κ°: κ° κ°μ²΄λ λλ©μΈ κ°λ μ λͺ μμ μΌλ‘ νννμ¬ μ½λλ₯Ό λ ννλ ₯ μκ³ μ΄ν΄νκΈ° μ½κ² λ§λλλ€. μμ λ¬Έμμ΄μ΄λ μ«μλ₯Ό μ λ¬νλ λμ , `Currency`λ `PostalCode`μ κ°μ κ° κ°μ²΄λ₯Ό μ¬μ©νμ¬ μ½λμ μλλ₯Ό λ λͺ ννκ² ν μ μμ΅λλ€.
- λͺ¨λμ± κ°ν: κ° κ°μ²΄λ νΉμ κ°κ³Ό κ΄λ ¨λ νΉμ λ‘μ§μ μΊ‘μννμ¬ κ΄μ¬μ¬ λΆλ¦¬λ₯Ό μ΄μ§νκ³ μ½λλ₯Ό λ λͺ¨λνν©λλ€.
- νμ κ°μ : νμ€ κ° κ°μ²΄λ₯Ό μ¬μ©νλ©΄ ν κ°μ 곡ν΅λ μ΄ν΄λ₯Ό μ¦μ§μν΅λλ€. μλ₯Ό λ€μ΄, λͺ¨λ μ¬λμ΄ 'Currency' κ°μ²΄κ° 무μμ λνλ΄λμ§ μ΄ν΄ν©λλ€.
μλ°μ€ν¬λ¦½νΈ λͺ¨λμμ κ° κ°μ²΄ ꡬννκΈ°
λΆλ³μ±κ³Ό μ μ ν μΊ‘μνμ μ€μ μ λκ³ ES λͺ¨λμ μ¬μ©νμ¬ μλ°μ€ν¬λ¦½νΈμμ κ° κ°μ²΄λ₯Ό ꡬννλ λ°©λ²μ μ΄ν΄λ³΄κ² μ΅λλ€.
μμ : EmailAddress κ° κ°μ²΄
κ°λ¨ν `EmailAddress` κ° κ°μ²΄λ₯Ό μκ°ν΄ λ΄ μλ€. μ κ· ννμμ μ¬μ©νμ¬ μ΄λ©μΌ νμμ μ ν¨μ±μ κ²μ¬ν κ²μ λλ€.
```javascript // email-address.js const EMAIL_REGEX = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/; class EmailAddress { constructor(value) { if (!EmailAddress.isValid(value)) { throw new Error('Invalid email address format.'); } // λΉκ³΅κ° μμ± (ν΄λ‘μ μ¬μ©) let _value = value; this.getValue = () => _value; // Getter // ν΄λμ€ μΈλΆμμμ μμ μ λ°©μ§ Object.freeze(this); } getValue() { return this.value; } toString() { return this.getValue(); } static isValid(value) { return EMAIL_REGEX.test(value); } equals(other) { if (!(other instanceof EmailAddress)) { return false; } return this.getValue() === other.getValue(); } } export default EmailAddress; ```μ€λͺ :
- λͺ¨λ λ΄λ³΄λ΄κΈ°: `EmailAddress` ν΄λμ€λ λͺ¨λλ‘ λ΄λ³΄λ΄μ Έ μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆμμ μ¬μ¬μ©ν μ μμ΅λλ€.
- μ ν¨μ± κ²μ¬: μμ±μλ μ κ· ννμ(`EMAIL_REGEX`)μ μ¬μ©νμ¬ μ λ ₯λ μ΄λ©μΌ μ£Όμμ μ ν¨μ±μ κ²μ¬ν©λλ€. μ΄λ©μΌμ΄ μ ν¨νμ§ μμΌλ©΄ μ€λ₯λ₯Ό λ°μμν΅λλ€. μ΄λ μ ν¨ν `EmailAddress` κ°μ²΄λ§ μμ±λλλ‘ λ³΄μ₯ν©λλ€.
- λΆλ³μ±: `Object.freeze(this)`λ `EmailAddress` κ°μ²΄κ° μμ±λ ν μ΄λ ν μμ λ λ°©μ§ν©λλ€. λκ²°λ κ°μ²΄λ₯Ό μμ νλ €κ³ νλ©΄ μ€λ₯κ° λ°μν©λλ€. λν ν΄λ‘μ λ₯Ό μ¬μ©νμ¬ `_value` μμ±μ μ¨κ²¨ ν΄λμ€ μΈλΆμμ μ§μ μ κ·Όν μ μκ² λ§λλλ€.
- `getValue()` λ©μλ: `getValue()` λ©μλλ λ΄λΆ μ΄λ©μΌ μ£Όμ κ°μ λν μ μ΄λ μ κ·Όμ μ 곡ν©λλ€.
- `toString()` λ©μλ: `toString()` λ©μλλ κ° κ°μ²΄λ₯Ό λ¬Έμμ΄λ‘ μ½κ² λ³νν μ μκ² ν΄μ€λλ€.
- `isValid()` μ μ λ©μλ: μ μ `isValid()` λ©μλλ₯Ό μ¬μ©νλ©΄ ν΄λμ€μ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ λ λ¬Έμμ΄μ΄ μ ν¨ν μ΄λ©μΌ μ£ΌμμΈμ§ νμΈν μ μμ΅λλ€.
- `equals()` λ©μλ: `equals()` λ©μλλ λ `EmailAddress` κ°μ²΄λ₯Ό κ°μ λ°λΌ λΉκ΅νμ¬, λλ±μ±μ΄ κ°μ²΄ IDκ° μλ λ΄μ©μ μν΄ κ²°μ λλλ‘ λ³΄μ₯ν©λλ€.
μ¬μ© μμ
```javascript // main.js import EmailAddress from './email-address.js'; try { const email1 = new EmailAddress('test@example.com'); const email2 = new EmailAddress('test@example.com'); const email3 = new EmailAddress('invalid-email'); // μ΄ μ½λλ μ€λ₯λ₯Ό λ°μμν΅λλ€ console.log(email1.getValue()); // μΆλ ₯: test@example.com console.log(email1.toString()); // μΆλ ₯: test@example.com console.log(email1.equals(email2)); // μΆλ ₯: true // email1μ μμ νλ €κ³ νλ©΄ μ€λ₯κ° λ°μν©λλ€ (μ격 λͺ¨λ νμ) // email1.value = 'new-email@example.com'; // μ€λ₯: Cannot assign to read only property 'value' of object '#μ¦λͺ λ μ΄μ
μ΄ μμ λ κ° κ°μ²΄μ ν΅μ¬ μμΉμ 보μ¬μ€λλ€:
- μ ν¨μ± κ²μ¬: `EmailAddress` μμ±μλ μ΄λ©μΌ νμ μ ν¨μ± κ²μ¬λ₯Ό κ°μ ν©λλ€.
- λΆλ³μ±: `Object.freeze()` νΈμΆμ μμ μ λ°©μ§ν©λλ€.
- κ° κΈ°λ° λλ±μ±: `equals()` λ©μλλ μ΄λ©μΌ μ£Όμλ₯Ό κ°μ λ°λΌ λΉκ΅ν©λλ€.
κ³ κΈ κ³ λ €μ¬ν
νμ μ€ν¬λ¦½νΈ
μ΄μ μμ λ μμ μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ§λ§, νμ μ€ν¬λ¦½νΈλ κ° κ°μ²΄μ κ°λ°κ³Ό κ²¬κ³ ν¨μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. νμ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νλ©΄ κ° κ°μ²΄μ λν νμ μ μ μνμ¬ μ»΄νμΌ νμ νμ κ²μ¬μ ν₯μλ μ½λ μ μ§λ³΄μμ±μ μ 곡ν μ μμ΅λλ€. λ€μμ νμ μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ `EmailAddress` κ° κ°μ²΄λ₯Ό ꡬννλ λ°©λ²μ λλ€:
```typescript // email-address.ts const EMAIL_REGEX = /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/; class EmailAddress { private readonly value: string; constructor(value: string) { if (!EmailAddress.isValid(value)) { throw new Error('Invalid email address format.'); } this.value = value; Object.freeze(this); } getValue(): string { return this.value; } toString(): string { return this.value; } static isValid(value: string): boolean { return EMAIL_REGEX.test(value); } equals(other: EmailAddress): boolean { return this.value === other.getValue(); } } export default EmailAddress; ```νμ μ€ν¬λ¦½νΈμ μ£Όμ κ°μ μ :
- νμ μμ μ±: `value` μμ±μ λͺ μμ μΌλ‘ `string` νμ μΌλ‘ μ§μ λλ©°, μμ±μλ λ¬Έμμ΄λ§ μ λ¬λλλ‘ κ°μ ν©λλ€.
- μ½κΈ° μ μ© μμ±: `readonly` ν€μλλ `value` μμ±μ΄ μμ±μμμλ§ ν λΉλ μ μλλ‘ λ³΄μ₯νμ¬ λΆλ³μ±μ λμ± κ°νν©λλ€.
- ν₯μλ μ½λ μμ± λ° μ€λ₯ κ°μ§: νμ μ€ν¬λ¦½νΈλ λ λμ μ½λ μμ±μ μ 곡νκ³ κ°λ° μ€μ νμ κ΄λ ¨ μ€λ₯λ₯Ό μ‘λ λ° λμμ μ€λλ€.
ν¨μν νλ‘κ·Έλλ° κΈ°λ²
ν¨μν νλ‘κ·Έλλ° μμΉμ μ¬μ©νμ¬ κ° κ°μ²΄λ₯Ό ꡬνν μλ μμ΅λλ€. μ΄ μ κ·Όλ²μ μ’ μ’ ν¨μλ₯Ό μ¬μ©νμ¬ λΆλ³ λ°μ΄ν° ꡬ쑰λ₯Ό μμ±νκ³ μ‘°μνλ κ²μ ν¬ν¨ν©λλ€.
```javascript // currency.js import { isNil, isNumber, isString } from 'lodash-es'; function Currency(amount, code) { if (!isNumber(amount)) { throw new Error('Amount must be a number'); } if (!isString(code) || code.length !== 3) { throw new Error('Code must be a 3-letter string'); } const _amount = amount; const _code = code.toUpperCase(); return Object.freeze({ getAmount: () => _amount, getCode: () => _code, toString: () => `${_code} ${_amount}`, equals: (other) => { if (isNil(other) || typeof other.getAmount !== 'function' || typeof other.getCode !== 'function') { return false; } return other.getAmount() === _amount && other.getCode() === _code; } }); } export default Currency; // μμ // const price = Currency(19.99, 'USD'); ```μ€λͺ :
- ν©ν 리 ν¨μ: `Currency` ν¨μλ λΆλ³ κ°μ²΄λ₯Ό μμ±νκ³ λ°ννλ ν©ν 리 μν μ ν©λλ€.
- ν΄λ‘μ : `_amount`μ `_code` λ³μλ ν¨μ λ²μ λ΄μ μΊ‘μνλμ΄ μΈλΆμμ μ κ·Όν μ μλ λΉκ³΅κ° μνκ° λ©λλ€.
- λΆλ³μ±: `Object.freeze()`λ λ°νλ κ°μ²΄κ° μμ λ μ μλλ‘ λ³΄μ₯ν©λλ€.
μ§λ ¬ν λ° μμ§λ ¬ν
κ° κ°μ²΄λ₯Ό λ€λ£° λ, νΉν λΆμ° μμ€ν μ΄λ λ°μ΄ν°λ₯Ό μ μ₯ν λ μ’ μ’ μ§λ ¬ν(JSONκ³Ό κ°μ λ¬Έμμ΄ νμμΌλ‘ λ³ν)νκ³ μμ§λ ¬ν(λ¬Έμμ΄ νμμμ κ° κ°μ²΄λ‘ λ€μ λ³ν)ν΄μΌ ν©λλ€. JSON μ§λ ¬νλ₯Ό μ¬μ©ν λ, μΌλ°μ μΌλ‘ κ° κ°μ²΄λ₯Ό λνλ΄λ μμ κ°(λ¬Έμμ΄ νν, μ«μ νν λ±)μ μ»κ² λ©λλ€.
μμ§λ ¬νν λλ μ ν¨μ± κ²μ¬μ λΆλ³μ±μ κ°μ νκΈ° μν΄ νμ μμ±μλ₯Ό μ¬μ©νμ¬ κ° κ°μ²΄ μΈμ€ν΄μ€λ₯Ό λ€μ μμ±ν΄μΌ ν©λλ€.
```javascript // μ§λ ¬ν const email = new EmailAddress('test@example.com'); const emailJSON = JSON.stringify(email.getValue()); // λ΄λΆ κ°μ μ§λ ¬ν console.log(emailJSON); // μΆλ ₯: "test@example.com" // μμ§λ ¬ν const deserializedEmail = new EmailAddress(JSON.parse(emailJSON)); // κ° κ°μ²΄ λ€μ μμ± console.log(deserializedEmail.getValue()); // μΆλ ₯: test@example.com ```μ€μ μ¬μ© μ¬λ‘
κ° κ°μ²΄λ λ€μν μλ리μ€μ μ μ©λ μ μμ΅λλ€:
- μ μμκ±°λ: `Currency` κ° κ°μ²΄λ₯Ό μ¬μ©νμ¬ μ ν κ°κ²©μ νννκ³ μΌκ΄λ ν΅ν μ²λ¦¬λ₯Ό 보μ₯ν©λλ€. `SKU` κ° κ°μ²΄λ‘ μ ν SKUμ μ ν¨μ±μ κ²μ¬ν©λλ€.
- κΈμ΅ μ ν리μΌμ΄μ : `Money` λ° `AccountNumber` κ° κ°μ²΄λ‘ κΈμ‘κ³Ό κ³μ’ λ²νΈλ₯Ό μ²λ¦¬νμ¬ μ ν¨μ± κ²μ¬ κ·μΉμ κ°μ νκ³ μ€λ₯λ₯Ό λ°©μ§ν©λλ€.
- μ§λ¦¬ μ 보 μ ν리μΌμ΄μ : `Coordinates` κ° κ°μ²΄λ‘ μ’νλ₯Ό νννμ¬ μλ λ° κ²½λ κ°μ΄ μ ν¨ν λ²μ λ΄μ μλμ§ νμΈν©λλ€. `CountryCode` κ° κ°μ²΄λ‘ κ΅κ°λ₯Ό ννν©λλ€ (μ: "US", "GB", "DE", "JP", "BR").
- μ¬μ©μ κ΄λ¦¬: μ μ© κ° κ°μ²΄λ₯Ό μ¬μ©νμ¬ μ΄λ©μΌ μ£Όμ, μ νλ²νΈ λ° μ°νΈλ²νΈμ μ ν¨μ±μ κ²μ¬ν©λλ€.
- λ¬Όλ₯: `Address` κ° κ°μ²΄λ‘ λ°°μ‘ μ£Όμλ₯Ό μ²λ¦¬νμ¬ λͺ¨λ νμ νλκ° μ‘΄μ¬νκ³ μ ν¨νμ§ νμΈν©λλ€.
μ½λ μΈμ μΈ μ΄μ
- νμ κ°μ : κ° κ°μ²΄λ νκ³Ό νλ‘μ νΈ λ΄μμ 곡μ λ μ΄νλ₯Ό μ μν©λλ€. λͺ¨λ μ¬λμ΄ `PostalCode` λλ `PhoneNumber`κ° λ¬΄μμ λνλ΄λμ§ μ΄ν΄νλ©΄ νμ μ΄ ν¬κ² ν₯μλ©λλ€.
- μμ¬μ΄ μ¨λ³΄λ©: μλ‘μ΄ νμμ κ° κ° κ°μ²΄μ λͺ©μ κ³Ό μ μ½μ μ΄ν΄ν¨μΌλ‘μ¨ λλ©μΈ λͺ¨λΈμ λΉ λ₯΄κ² νμ ν μ μμ΅λλ€.
- μΈμ§ λΆν κ°μ: 볡μ‘ν λ‘μ§κ³Ό μ ν¨μ± κ²μ¬λ₯Ό κ° κ°μ²΄ λ΄μ μΊ‘μνν¨μΌλ‘μ¨ κ°λ°μλ λ λμ μμ€μ λΉμ¦λμ€ λ‘μ§μ μ§μ€ν μ μμ΅λλ€.
κ° κ°μ²΄λ₯Ό μν λͺ¨λ² μ¬λ‘
- μκ³ μ§μ€μ μΌλ‘ μ μ§: κ° κ°μ²΄λ λ¨μΌνκ³ μ μ μλ κ°λ μ λνλ΄μΌ ν©λλ€.
- λΆλ³μ± κ°μ : μμ± ν κ° κ°μ²΄μ μν λ³κ²½μ λ°©μ§ν©λλ€.
- κ° κΈ°λ° λλ±μ± ꡬν: λ κ° κ°μ²΄μ κ°μ΄ κ°μΌλ©΄ λμΌν κ²μΌλ‘ κ°μ£Όλλλ‘ λ³΄μ₯ν©λλ€.
- `toString()` λ©μλ μ 곡: μ΄λ₯Ό ν΅ν΄ λ‘κΉ λ° λλ²κΉ μ μν΄ κ° κ°μ²΄λ₯Ό λ¬Έμμ΄λ‘ μ½κ² ννν μ μμ΅λλ€.
- ν¬κ΄μ μΈ λ¨μ ν μ€νΈ μμ±: κ° κ°μ²΄μ μ ν¨μ± κ²μ¬, λλ±μ± λ° λΆλ³μ±μ μ² μ ν ν μ€νΈν©λλ€.
- μλ―Έ μλ μ΄λ¦ μ¬μ©: κ° κ°μ²΄κ° λνλ΄λ κ°λ μ λͺ ννκ² λ°μνλ μ΄λ¦μ μ νν©λλ€ (μ: `EmailAddress`, `Currency`, `PostalCode`).
κ²°λ‘
κ° κ°μ²΄λ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μμ λ°μ΄ν°λ₯Ό λͺ¨λΈλ§νλ κ°λ ₯ν λ°©λ²μ μ 곡ν©λλ€. λΆλ³μ±, μ ν¨μ± κ²μ¬, κ° κΈ°λ° λλ±μ±μ μ±νν¨μΌλ‘μ¨ λ κ²¬κ³ νκ³ , μ μ§λ³΄μ μ©μ΄νλ©°, ν μ€νΈνκΈ° μ¬μ΄ μ½λλ₯Ό λ§λ€ μ μμ΅λλ€. μκ·λͺ¨ μΉ μ ν리μΌμ΄μ μ ꡬμΆνλ λκ·λͺ¨ μν°νλΌμ΄μ¦ μμ€ν μ ꡬμΆνλ , μν€ν μ²μ κ° κ°μ²΄λ₯Ό ν΅ν©νλ©΄ μννΈμ¨μ΄μ νμ§κ³Ό μ λ’°μ±μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€. λͺ¨λμ μ¬μ©νμ¬ μ΄λ¬ν κ°μ²΄λ₯Ό ꡬμ±νκ³ λ΄λ³΄λ΄λ©΄, λ λͺ¨λνλκ³ μ ꡬ쑰νλ μ½λλ² μ΄μ€μ κΈ°μ¬νλ κ³ λλ‘ μ¬μ¬μ© κ°λ₯ν κ΅¬μ± μμλ₯Ό λ§λ€ μ μμ΅λλ€. κ° κ°μ²΄λ₯Ό μμ©νλ κ²μ μ μΈκ³ κ³ κ°μ μν λ κΉ¨λνκ³ μ λ’°ν μ μμΌλ©° μ΄ν΄νκΈ° μ¬μ΄ μλ°μ€ν¬λ¦½νΈ μ ν리μΌμ΄μ μ ꡬμΆνλ μ€μν λ¨κ³μ λλ€.