์จ๋ผ์ธ ๊ฐ์
>PHP - ์ต์๊ธ
๐ PHP ์ต์๊ธ - 8์ฃผ์ฐจ: ์ํคํ ์ฒ ํจํด ๋ฐ ์ค๊ณ ์ฌํ - 01 ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ (DDD)
์ฃผ์ ํ๋ก๊ทธ๋จ ์คํ
- ํ์ : 10.0
- ๋ผ์ด์ ์ค: free
- ์ด์์ฒด์ :
- ํ์ผ ํฌ๊ธฐ: 0
ํผ๋๋ฐฑ ๋ฐ ๋ค์ด๋ก๋
- ์ฌ์ฉ์ ํ์ : 10.0
- ๋ค์ด๋ก๋ ์: 0
- ์กฐํ์: 30
์ ์กฐ์ฌ ๋ฐ ๋ฑ๋ก ์ ๋ณด
- ์ ์์ฌ: LUZENSOFT
- ๋ฑ๋ก์ผ: 2025-10-26 12:14:44
- ์ค๋ช
๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ(DDD)๋ ๋ฌด์์ธ๊ฐ?
#๋๋ฉ์ธ #์ฃผ๋ #์ค๊ณ(#DDD: #Domain-Driven #Design)๋ ๋ณต์กํ #์ํํธ์จ์ด #์์คํ ์ ์ค๊ณํ๊ณ ๊ตฌํํ๋ #์ ๊ทผ #๋ฐฉ์์ด์์. ์ด๋ #๊ธฐ์ ์ด๋ #๋ฐ์ดํฐ๊ฐ ์๋, #๋น์ฆ๋์ค #๋๋ฉ์ธ ์์ฒด์ ๊ทธ ๋๋ฉ์ธ ๋ด์ #๋น์ฆ๋์ค #๋ก์ง์ ์ํํธ์จ์ด์ #ํต์ฌ์ผ๋ก ์ผ์์. DDD์ ๋ชฉํ๋ #๊ฐ๋ฐ์๊ฐ #๋น์ฆ๋์ค #์ ๋ฌธ๊ฐ์ ๋์ผํ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋๋ฉ์ธ์ ๋ํ ๊น์ #์ดํด๋ฅผ #์ํํธ์จ์ด #์ค๊ณ์ ์ง์ ๋ฐ์ํ๋ ๊ฑฐ์์.
#PHP์ ๊ฐ์ #๊ฐ์ฒด #์งํฅ #์ธ์ด์์ DDD๋ฅผ ์ ์ฉํ๋ฉด, ์ฝ๋๊ฐ #๋น์ฆ๋์ค #์๊ตฌ์ฌํญ์ ๋ ๋ช ํํ๊ฒ ๋ฐ์ํ๊ณ #์ ์ง๋ณด์(#Maintenance)๊ฐ ์ฌ์์ ธ์.
DDD์ ํต์ฌ ๊ฐ๋
DDD๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ๋ช ๊ฐ์ง ํต์ฌ #๊ตฌ์ฑ #์์์ #๊ฐ๋ ์ ์์งํด์ผ ํด์.
1. ์ ๋น์ฟผํฐ์ค ์ธ์ด (#Ubiquitous #Language)
#์ ๋น์ฟผํฐ์ค #์ธ์ด๋ #๋๋ฉ์ธ #์ ๋ฌธ๊ฐ์ #๊ฐ๋ฐ์ #๋ชจ๋๊ฐ #ํ๋ก์ ํธ ๋ด์์ ์ฌ์ฉํ๋ #๊ณตํต์ #์ธ์ด๋ฅผ ์๋ฏธํด์. #๋ฌธ์, #์ฝ๋, #ํ์ ๋ฑ ๋ชจ๋ ๊ณณ์์ ๋์ผํ #์ฉ์ด์ #์ ์๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ #์์ฌ์ํต์ #์ค๋ฅ๋ฅผ ์ต์ํํด์.
์๋ฅผ ๋ค์ด, #์ผํ๋ชฐ #๋๋ฉ์ธ์์ '๊ณ ๊ฐ'์ด '์ฌ์ฉ์'์ ๋ค๋ฅธ ๋ช ํํ #๋น์ฆ๋์ค #์๋ฏธ๋ฅผ ๊ฐ์ง๋ค๋ฉด, ์ฝ๋์์๋ 'Customer'์ 'User'๋ฅผ ๋ช ํํ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉํด์.
2. ๊ฒฝ๊ณ๊ฐ ์๋ ์ปจํ ์คํธ (#Bounded #Context)
#๊ฒฝ๊ณ๊ฐ #์๋ #์ปจํ ์คํธ๋ ํน์ #๋๋ฉ์ธ #๋ชจ๋ธ์ด #์ ํจํ #๊ฒฝ๊ณ๋ฅผ ์ ์ํด์. ๋ณต์กํ ์์คํ ์ ์ฌ๋ฌ ๊ฐ์ ๊ฒฝ๊ณ๊ฐ ์๋ ์ปจํ ์คํธ๋ก ๋๋๋ฉฐ, ๊ฐ ์ปจํ ์คํธ ๋ด์์ #์ ๋น์ฟผํฐ์ค #์ธ์ด์ #๋๋ฉ์ธ #๋ชจ๋ธ์ ์ผ๊ด์ฑ์ ์ ์งํด์.
์์: 'ํ์ ๊ด๋ฆฌ' ์ปจํ ์คํธ์์์ 'User'์ '๊ฒฐ์ ' ์ปจํ ์คํธ์์์ 'User'๋ #์์ฑ๊ณผ #์ฑ ์์ด ๋ค๋ฅผ ์ ์์ผ๋ฉฐ, ๋ณ๋์ #๋ชจ๋ธ๋ก ๊ด๋ฆฌํด์ผ ํด์.
3. ๋๋ฉ์ธ ๊ฐ์ฒด (#Domain Objects)
DDD์์ ๊ฐ์ฅ ์ค์ํ #์ค๊ณ #์์๋ค์ด์์.
#์ํฐํฐ(#Entity): #๊ณ ์ ํ #์๋ณ์(#ID)๋ฅผ ๊ฐ์ง๋ฉฐ, ์๊ฐ์ด ์ง๋๋ #์์ฑ์ด ๋ณํด๋ #์ ์ฒด์ฑ(#Identity)์ด ์ ์ง๋๋ #๊ฐ์ฒด์์. (์:
User,Order)#๊ฐ #๊ฐ์ฒด(#Value #Object): #๊ณ ์ ํ #์๋ณ์๊ฐ ์์ผ๋ฉฐ, #์์ฑ๋ค์ด ๋ชจ๋ ๊ฐ์ผ๋ฉด ๊ฐ์ ๊ฒ์ผ๋ก ์ทจ๊ธ๋๋ #๊ฐ์ฒด์์. (์:
Address,Money)#์ ๊ทธ๋ฆฌ๊ฑฐํธ(#Aggregate): ํจ๊ป ๋ค๋ค์ ธ์ผ ํ๋ #์ํฐํฐ์ #๊ฐ #๊ฐ์ฒด๋ค์ #๋ฌถ์์ด๋ฉฐ, #์ผ๊ด์ฑ(#Consistency) ์ ์ง๋ฅผ ์ํด ํ๋์ #๋ฃจํธ(#Root) #์ํฐํฐ๋ฅผ ํตํด #์ ๊ทผ๋ผ์. (์:
Order์ ๊ด๋ จ๋OrderLine๋ค)
4. ๋ฆฌํฌ์งํ ๋ฆฌ (#Repository)
#์ ๊ทธ๋ฆฌ๊ฑฐํธ๋ฅผ #์ ์ฅ(#Persistence)ํ๊ณ #์กฐํํ๋ #๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ๋ #๊ฐ์ฒด์์. #๋ฐ์ดํฐ #์ ์ฅ์(#๋ฐ์ดํฐ๋ฒ ์ด์ค, #ํ์ผ #์์คํ ๋ฑ)์์ #์ ๊ทผ #๋ก์ง์ #๋๋ฉ์ธ #๋ก์ง์ผ๋ก๋ถํฐ #๋ถ๋ฆฌํด์. ์ด๋ #๋ฃจ์ ํธ์คํ (#https://hosting.luzensoft.com)์ #๋ฐ์ดํฐ๋ฒ ์ด์ค๋ #์คํ ๋ฆฌ์ง์ #PHP #์ฝ๋๋ฅผ ์ฐ๊ฒฐํ๋ #์ฑ ์์ ๋งก๊ฒ ๋ผ์.
PHP ์ ํ๋ฆฌ์ผ์ด์ ์ DDD ์ ์ฉํ๊ธฐ
#PHP #ํ๋ ์์ํฌ, ํนํ #Laravel์ด๋ #Symfony์ ๊ฐ์ #MVC #ํ๋ ์์ํฌ๋ฅผ ์ฌ์ฉํ ๋๋ DDD ์์น์ ์ ์ฉํ์ฌ ๋ ๊ฒฌ๊ณ ํ #์ํคํ ์ฒ๋ฅผ ๋ง๋ค ์ ์์ด์.
1. ๋๋ฉ์ธ ๊ณ์ธต ๋ถ๋ฆฌ
#์ฝ๋ #๊ตฌ์กฐ์์ #๋๋ฉ์ธ #๋ก์ง์ #์ปจํธ๋กค๋ฌ(#Controller)๋ #์๋น์ค #์ปจํ ์ด๋ ์ธ๋ถ์ ๋ณ๋ #Domain #๋๋ ํ ๋ฆฌ์ #๋ถ๋ฆฌํ์ฌ #์ค์ ์ง์คํํด์ผ ํด์.
Controller: ์ค์ง #HTTP #์์ฒญ์ ์ฒ๋ฆฌํ๊ณ #์๋ตํ๋ ์ญํ ๋ง ์ํํด์.Service: #๋๋ฉ์ธ #๊ฐ์ฒด๋ค์ ์กฐ์จํ์ฌ ๋ณต์กํ #๋น์ฆ๋์ค #์๋๋ฆฌ์ค๋ฅผ ์ฒ๋ฆฌํด์.Domain: #์ํฐํฐ, #๊ฐ #๊ฐ์ฒด, #์ ๊ทธ๋ฆฌ๊ฑฐํธ #๋ฃจํธ ๋ฑ ์์ํ #๋๋ฉ์ธ #๊ฐ์ฒด๋ค์ ํฌํจํด์.
2. ๊ฐ์ฒด ์งํฅ์ ์ฒ ์ ํ ํ์ฉ
#PHP์์ DDD๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด #๊ฐ์ฒด #์งํฅ #ํจ๋ฌ๋ค์์ ์ฒ ์ ํ ์ง์ผ์ผ ํด์.
#๊ฐ #๊ฐ์ฒด ์ฌ์ฉ: ๋จ์ํ #Primitive #ํ์ (#string, #int) ๋์
EmailAddress๋Price๊ฐ์ #๊ฐ #๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด #๋ฐ์ดํฐ์ #์ ํจ์ฑ #๊ฒ์ฆ(#Validation)๊ณผ #๋ถ๋ณ์ฑ(#Immutability)์ ๋ณด์ฅํด์.#ํ์ ํฌํจ: #์ํฐํฐ๋ #๋ฐ์ดํฐ(#์์ฑ)๋ฟ๋ง ์๋๋ผ ํด๋น #๋ฐ์ดํฐ์ ๊ด๋ จ๋ **#ํ์(#Behavior)**๋ ํจ๊ป ๊ฐ์ ธ์ผ ํด์. (์:
Order์ํฐํฐ๊ฐcancel()๋ฉ์๋๋ฅผ ๊ฐ์ง)
์์ฝ
#DDD๋ #๋ณต์ก์ฑ๊ณผ์ #์ธ์์ด์์. #๋น์ฆ๋์ค #๋๋ฉ์ธ์ ๋ช ํํ๊ฒ ์ดํดํ๊ณ , #์ ๋น์ฟผํฐ์ค #์ธ์ด์ #๊ฒฝ๊ณ๊ฐ #์๋ #์ปจํ ์คํธ๋ฅผ ํตํด #๋ชจ๋ธ์ #๊ตฌ์ถํ๋ฉฐ, #์ํฐํฐ, #๊ฐ #๊ฐ์ฒด, #์ ๊ทธ๋ฆฌ๊ฑฐํธ์ ๊ฐ์ #๋๋ฉ์ธ #๊ฐ์ฒด๋ค์ ์ค์ฌ์ผ๋ก #PHP #์ฝ๋๋ฅผ #์ค๊ณํจ์ผ๋ก์จ #์ ์ง๋ณด์์ฑ์ด ๋์ #์ต์๊ธ #์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ด์.
๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ, DDD, ์ ๋น์ฟผํฐ์ค ์ธ์ด, ๊ฒฝ๊ณ๊ฐ ์๋ ์ปจํ ์คํธ, ์ํฐํฐ, ๊ฐ ๊ฐ์ฒด, ์ ๊ทธ๋ฆฌ๊ฑฐํธ, ๋ฆฌํฌ์งํ ๋ฆฌ, PHP, ๊ฐ์ฒด ์งํฅ, ์ค๊ณ, ๋น์ฆ๋์ค ๋ก์ง, ๋ฃจ์ ํธ์คํ
๊ฒ์, ๋ง์ผํ , ์๋ฒ์ฉ ๊ณ ์ IP, ๋ฐฉํ๋ฒฝ์ฐํ, ๊นจ๋ํ๊ณ ์ค๋ณต์๋ IP ์ ๊ณต.