์จ๋ผ์ธ ๊ฐ์
>PHP - ์ต์๊ธ
๐ PHP ์ต์๊ธ - 8์ฃผ์ฐจ: ์ํคํ ์ฒ ํจํด ๋ฐ ์ค๊ณ ์ฌํ - 02 ํด๋ฆฐ ์ํคํ ์ฒ (Clean Architecture)
์ฃผ์ ํ๋ก๊ทธ๋จ ์คํ
- ํ์ : 10.0
- ๋ผ์ด์ ์ค: free
- ์ด์์ฒด์ :
- ํ์ผ ํฌ๊ธฐ: 0
ํผ๋๋ฐฑ ๋ฐ ๋ค์ด๋ก๋
- ์ฌ์ฉ์ ํ์ : 10.0
- ๋ค์ด๋ก๋ ์: 0
- ์กฐํ์: 31
์ ์กฐ์ฌ ๋ฐ ๋ฑ๋ก ์ ๋ณด
- ์ ์์ฌ: LUZENSOFT
- ๋ฑ๋ก์ผ: 2025-10-27 10:45:23
- ์ค๋ช
ํด๋ฆฐ ์ํคํ ์ฒ(Clean Architecture)๋ ๋ฌด์์ธ๊ฐ?
#ํด๋ฆฐ #์ํคํ ์ฒ(#Clean #Architecture)๋ #์ํํธ์จ์ด #์์คํ ์ #์ ์ง๋ณด์์ฑ(#Maintainability), #ํ์ฅ์ฑ(#Extensibility), #ํ ์คํธ #์ฉ์ด์ฑ(#Testability)์ ๊ทน๋ํํ๊ธฐ ์ํ #์ค๊ณ #์์น๋ค์ #์งํฉ์ด์์. ๋ก๋ฒํธ C. ๋งํด(#Uncle #Bob)์ด ์ ์ํ ์ด ์ํคํ ์ฒ๋ ์์คํ ์ ์ฌ๋ฌ ๊ณ์ธต์ผ๋ก ๋๋๊ณ , ์๊ฒฉํ #์์กด์ฑ(#Dependency) ๊ท์น์ ์ ์ฉํ์ฌ ์ธ๋ถ #๊ธฐ์ ์ด๋ #ํ๋ ์์ํฌ๋ก๋ถํฐ #ํต์ฌ #๋น์ฆ๋์ค #๋ก์ง์ ๋ณดํธํ๋ ๊ฒ์ ๋ชฉํ๋ก ํด์.
#PHP #์ ํ๋ฆฌ์ผ์ด์ ์ #ํด๋ฆฐ #์ํคํ ์ฒ๋ฅผ ์ ์ฉํ๋ฉด, #ํ๋ ์์ํฌ #๊ต์ฒด๋ #๋ฐ์ดํฐ๋ฒ ์ด์ค #๋ณ๊ฒฝ๊ณผ ๊ฐ์ ํฐ ๋ณํ์๋ #ํต์ฌ #๋ก์ง์ด ์ํฅ์ ๋ฐ์ง ์๋๋ก ๋ณดํธํ ์ ์์ด์.
ํด๋ฆฐ ์ํคํ ์ฒ์ ํต์ฌ ์์น: ์์กด์ฑ ๊ท์น
#ํด๋ฆฐ #์ํคํ ์ฒ์ ๊ฐ์ฅ ์ค์ํ ์์น์ **#์์กด์ฑ #๊ท์น(#Dependency #Rule)**์ด์์. ์ด ๊ท์น์ #์์ค #์ฝ๋์ #์์กด์ฑ์ด ํญ์ **๋ฐ๊นฅ์ชฝ์์ ์์ชฝ์ผ๋ก**๋ง ํฅํด์ผ ํ๋ค๊ณ ๋ช ์ํด์. ์ฆ, ์์ชฝ ๊ณ์ธต์ ๋ฐ๊นฅ์ชฝ ๊ณ์ธต์ ๋ํด ์ ํ ์์ง ๋ชปํด์ผ ํด์.
1. ๊ณ์ธต ๊ตฌ์กฐ
#ํด๋ฆฐ #์ํคํ ์ฒ๋ ๋ณดํต ๋ค์๊ณผ ๊ฐ์ ๋์ฌ์ ํํ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ์.
#์ํฐํฐ(#Entities): ๊ฐ์ฅ ์์ชฝ ๊ณ์ธต์ผ๋ก, #์์ํ #๋น์ฆ๋์ค #๊ท์น(#Business #Rules)์ ํฌํจํ๋ ๊ฐ์ฒด๋ค์ด์์. #ํ๋ ์์ํฌ, #๋ฐ์ดํฐ๋ฒ ์ด์ค, #UI ๋ฑ ์ด๋ค ์ธ๋ถ ์์์๋ ์์กดํ์ง ์์์.
#์ ์ค์ผ์ด์ค(#Use #Cases): #์ ํ๋ฆฌ์ผ์ด์ ์ #ํน์ #๊ธฐ๋ฅ(#Use #Case)์ ๊ตฌํํ๋ ๊ณ์ธต์ด์์. #์ํฐํฐ๋ฅผ ์กฐ์ํ์ฌ #๋น์ฆ๋์ค #๊ท์น์ ์ ์ฉํ๊ณ , #์ ๋ ฅ(#Input)์ ๋ฐ์ #์ถ๋ ฅ(#Output)์ ์์ฑํด์. ์ด ๋ํ ์ธ๋ถ ๊ณ์ธต์ ์์กดํ์ง ์์์.
#์ธํฐํ์ด์ค #์ด๋ํฐ(#Interface #Adapters): #์ ์ค์ผ์ด์ค์ #์ํฐํฐ๊ฐ ์ธ๋ถ ์ธ๊ณ(๋ฐ์ดํฐ๋ฒ ์ด์ค, #์น, #UI ๋ฑ)์ ํต์ ํ ์ ์๋๋ก #๋ฐ์ดํฐ #ํ์(#Data #Format)์ ๋ณํํ๋ ๊ณ์ธต์ด์์. ์๋ฅผ ๋ค์ด, #์น #์์ฒญ #๋ฐ์ดํฐ๋ฅผ #์ ์ค์ผ์ด์ค๊ฐ ์ดํดํ๋ ํํ๋ก ๋ฐ๊พธ๊ฑฐ๋, #์ ์ค์ผ์ด์ค์ ๊ฒฐ๊ณผ๋ฅผ #HTTP #์๋ต์ผ๋ก ๋ณํํด์.
#ํ๋ ์์ํฌ ๋ฐ ๋๋ผ์ด๋ฒ(#Frameworks & #Drivers): ๊ฐ์ฅ ๋ฐ๊นฅ์ชฝ ๊ณ์ธต์ผ๋ก, #์น #ํ๋ ์์ํฌ(#Laravel, #Symfony), #๋ฐ์ดํฐ๋ฒ ์ด์ค #๋๋ผ์ด๋ฒ, #UI ํ๋ ์์ํฌ ๋ฑ์ด ์ฌ๊ธฐ์ ํด๋น๋ผ์. ์ด๋ค์ ์์ชฝ ๊ณ์ธต์ ์์กดํ์ง๋ง, ์์ชฝ ๊ณ์ธต์ ์ด๋ค์ ๋ชฐ๋ผ์ผ ํด์.
2. ์์กด์ฑ ์ญ์ ์์น (DIP)
#ํด๋ฆฐ #์ํคํ ์ฒ์ #์์กด์ฑ #๊ท์น์ ์งํค๊ธฐ ์ํด **#์์กด์ฑ #์ญ์ #์์น(#DIP: #Dependency #Inversion #Principle)**์ด ์ค์ํ ์ญํ ์ ํด์. ์์ #๋ชจ๋์ด ํ์ #๋ชจ๋์ ์ง์ ์์กดํ๋ ๋์ , ๋ ๋ค #์ถ์ํ(#Abstraction)์ ์์กดํ๋๋ก ๋ง๋๋ ๊ฑฐ์์.
์๋ฅผ ๋ค์ด, #์ ์ค์ผ์ด์ค๊ฐ ํน์ #๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌํ์ฒด(#MySQL, #PostgreSQL)์ ์ง์ ์์กดํ๋ ๋์ , #๋ฆฌํฌ์งํ ๋ฆฌ(#Repository) #์ธํฐํ์ด์ค(#Interface)์ ์์กดํ๊ณ , ์ด ์ธํฐํ์ด์ค์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ฒด๋ #์ธํฐํ์ด์ค #์ด๋ํฐ ๊ณ์ธต์์ ์ ๊ณต๋ผ์. ์ด ๋ฐฉ๋ฒ์ ํตํด #PHP #์ ํ๋ฆฌ์ผ์ด์ ์ #๋ฐ์ดํฐ๋ฒ ์ด์ค #์ข ์์ฑ์ผ๋ก๋ถํฐ ์์ ๋ก์์ง ์ ์์ด์. #๋ฃจ์ ํธ์คํ (#https://hosting.luzensoft.com)๊ณผ ๊ฐ์ ํ๊ฒฝ์์ #๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ณ๊ฒฝ๋์ด๋ ํต์ฌ ๋ก์ง์ ๊ทธ๋๋ก ์ ์งํ ์ ์์ด์.
PHP ์ ํ๋ฆฌ์ผ์ด์ ์ ํด๋ฆฐ ์ํคํ ์ฒ ์ ์ฉํ๊ธฐ
#PHP์์ #ํด๋ฆฐ #์ํคํ ์ฒ๋ฅผ ๊ตฌํํ๋ ค๋ฉด #PSR(#PHP #Standard #Recommendation) ๋ฑ์ ํ์ค์ ๋ฐ๋ฅด๋ฉด์ #๊ฐ์ฒด #์งํฅ #์ค๊ณ #์์น์ ์ฒ ์ ํ ์ ์ฉํด์ผ ํด์.
1. ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ ์์
์ผ๋ฐ์ ์ธ #ํด๋ฆฐ #์ํคํ ์ฒ์ #PHP #๋๋ ํ ๋ฆฌ #๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์์.
src/
โโโ Domain/ # ์ํฐํฐ, ๊ฐ ๊ฐ์ฒด, ๋๋ฉ์ธ ์๋น์ค ๋ฑ ์์ ๋น์ฆ๋์ค ๊ท์น
โโโ Application/ # ์ ์ค์ผ์ด์ค, ์ ํ๋ฆฌ์ผ์ด์
์๋น์ค (์
๋ ฅ/์ถ๋ ฅ ํฌํธ ์ ์)
โโโ Infrastructure/ # ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌํ์ฒด, ์ธ๋ถ API ํด๋ผ์ด์ธํธ ๋ฑ (์ธํฐํ์ด์ค ์ด๋ํฐ)
โโโ Presentation/ # ์น ์ปจํธ๋กค๋ฌ, CLI ์ปค๋งจ๋ ๋ฑ (์ธํฐํ์ด์ค ์ด๋ํฐ)
โโโ Shared/ # ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ์ ํธ๋ฆฌํฐ, ์์ธ ๋ฑ
2. ํฌํธ์ ์ด๋ํฐ ํจํด (Hexagonal Architecture)
#ํด๋ฆฐ #์ํคํ ์ฒ๋ ์ข ์ข #ํฌํธ์ #์ด๋ํฐ #ํจํด(#Ports #and #Adapters #Pattern), ๋๋ #ํฅ์ฌ๊ณ ๋ #์ํคํ ์ฒ(#Hexagonal #Architecture)์ ํจ๊ป ์ค๋ช ๋ผ์.
#ํฌํธ(#Ports): #์ ์ค์ผ์ด์ค ๊ณ์ธต์์ ์ ์ํ๋ #์ธํฐํ์ด์ค๋ก, ์ธ๋ถ ์ธ๊ณ์์ ํต์ ๋ฐฉ๋ฒ์ ์ ์ํด์. (์:
UserRepositoryInterface)#์ด๋ํฐ(#Adapters): ์ด #ํฌํธ #์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ์ฌ ์ธ๋ถ ์ธ๊ณ(#๋ฐ์ดํฐ๋ฒ ์ด์ค, #์น #ํ๋ ์์ํฌ ๋ฑ)์ ๊ตฌ์ฒด์ ์ธ #๊ธฐ์ ๊ณผ ์ฐ๋ํ๋ ์ญํ ์ ํด์. (์:
DatabaseUserRepository๊ฐUserRepositoryInterface๋ฅผ ๊ตฌํ)
์ด ํจํด์ ํตํด #PHP #์ ํ๋ฆฌ์ผ์ด์ ์ #ํ๋ ์์ํฌ๋ #๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ธ๋ถ #์์กด์ฑ์ผ๋ก๋ถํฐ ๋ถ๋ฆฌ๋์ด, ํต์ฌ #๋๋ฉ์ธ #๋ก์ง์ #ํ ์คํธ๊ฐ ํจ์ฌ ์ฉ์ดํด์ง๊ณ , ์ธ๋ถ ๊ธฐ์ ๋ณ๊ฒฝ์ ๋ํ #์ ์ฐ์ฑ(#Flexibility)์ ํ๋ณดํ ์ ์์ด์.
์์ฝ
#ํด๋ฆฐ #์ํคํ ์ฒ๋ #PHP #์ ํ๋ฆฌ์ผ์ด์ ์ #๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๊ทธ ๊ฐ์น๊ฐ ๋์ฑ ๋น๋๋ #์ค๊ณ #ํจํด์ด์์. #์์กด์ฑ #๊ท์น์ ์๊ฒฉํ ์งํค๊ณ , #๊ณ์ธต๋ณ #์ฑ ์์ ๋ช ํํ ๋ถ๋ฆฌํจ์ผ๋ก์จ, #์ ์ง๋ณด์๊ฐ ์ฝ๊ณ #๋ณํ์ ๊ฐํ #์ํํธ์จ์ด๋ฅผ ๋ง๋ค ์ ์์ด์. ์ด๋ #์ต์๊ธ์ #PHP #๊ฐ๋ฐ์๊ฐ ์งํฅํด์ผ ํ #๊ฒฌ๊ณ ํ #์ํคํ ์ฒ #์ค๊ณ์ ํ์ค์ด๋ผ๊ณ ํ ์ ์์ด์.
ํด๋ฆฐ ์ํคํ ์ฒ, Clean Architecture, ์์กด์ฑ ๊ท์น, DIP, ์์กด์ฑ ์ญ์ ์์น, ์ํฐํฐ, ์ ์ค์ผ์ด์ค, ์ธํฐํ์ด์ค ์ด๋ํฐ, PHP, ์ํคํ ์ฒ ์ค๊ณ, ํฌํธ์ ์ด๋ํฐ, ํฅ์ฌ๊ณ ๋ ์ํคํ ์ฒ, ๋ฃจ์ ํธ์คํ
๋น ๋ฅธ์๋, ๊ฐํธํ์ฌ์ฉ, ์ฅ์ ์๋VPN, ์ฌ์ฉ์ด๋ ฅ์๋ ๊นจ๋ํ ์์ดํผ