SRP (Single Responsibility Principle)
Last updated
Was this helpful?
Last updated
Was this helpful?
ํด๋์ค๋ ํ๋์ ์ฑ ์์ ๊ฐ์ ธ์ผ ํ๋ค. ์ฌ๊ธฐ์์ ์ฑ ์์ ๋ฌด์์ธ๊ฐ?
save/findById๋ ๊ฐ์ ๋ถ๋ฅ (DB์ ๊ด๋ จ๋ ๊ธฐ๋ฅ)
๊ฐ์ ์ฑ ์์ ๊ฐ๋ ๊ธฐ๋ฅ์ ์ถ๊ฐํด๋ ์ฑ ์์ ์๋ ๋ณํ์ง ์์
๊ฐ์ ๋ถ๋ฅ๋ก ๋๋ ์ ์ฑ ์์ด ๋ช ๊ฐ์ธ์ง ๊ฒฐ์ ๋๋ ๊ฒ
์ฌ๊ธฐ์์ ๋ถ๋ฅ๋,
๋ฉ์๋์ Client์ ์ํด ๊ฒฐ์ ๋๋ค. (๋ฉ์๋๋ฅผ ๋๊ฐ ์ฌ์ฉํ๋๊ฐ?)
๋๊ฐ ํด๋น ๋ฉ์๋์ ๋ณ๊ฒฝ์ ์ ๋ฐํ๋ ์ฌ์ฉ์์ธ๊ฐ?
๋ฉ์๋์ ๋ณ๊ฒฝ์ ์ ๋ฐํ๋ ์ฌ์ฉ์๋ฅผ ์กํฐ(Actor)๋ผ๊ณ ํ๋ค.
SRP๋ ์ฌ์ฉ์์ ๊ดํ ๊ฒ์ด๋ค.
์ฑ ์(Responsibility)์ ์ํํธ์จ์ด์ ๋ณ๊ฒฝ์ ์์ฒญํ๋ ํน์ ์ฌ์ฉ์๋ค์ ๋ํด ํด๋์ค/ํจ์๊ฐ ๊ฐ๋ ๊ฒ์ผ๋ก "๋ณ๊ฒฝ์ ๊ทผ์"์ผ๋ก ๋ณผ ์ ์๋ค.
์ฌ๊ธฐ์ Employee ํด๋์ค์ ๋ณ๊ฒฝ์ ์๊ตฌํ๋ ์ฌ์ฉ์ ๊ทธ๋ฃน์ ๋๋ ๋ณผ ์ ์๋ค. ์ด ์ฌ์ฉ์ ๊ทธ๋ฃน์ ์กํฐ(Actor)๊ฐ ๋๋ฉฐ ์๋ก ๋ค๋ฅธ ๋์ฆ(Needs)๊ฐ ์กด์ฌํ๊ธฐ์ ๊ฐ ์ฑ ์์ ์ ๋๋ ์ ์์ด์ผ ํ๋ค.
์ ์ ๋ค์ ๊ทธ๋ค์ด ์ํํ๋ ์ญํ (Role)์ ๋ฐ๋ผ ๋๋ ์ผ ํ๋ค.
์ ์ ๊ฐ ํน์ ์ญํ ์ ์ํํ ๋ ์กํฐ(Actor)๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์ฑ ์์ ๊ฐ์ธ์ด ์๋๋ผ ์กํฐ์ ์ฐ๊ฒฐ๋๋ค.
Employee ํด๋์ค์๋ 3๊ฐ์ ์กํฐ(Policy, Architect, Operations)๊ฐ ์๋ค.
๊ฐ์ฒด์งํฅ์์ ๊ฐ์กฐํ๋ "์ฑ ์์ ์ ํ ๋นํด์ผ ํ๋ค"์์์ ์ฑ ์์ ํน์ ์กํฐ์ ์๊ตฌ์ฌํญ์ ๋ง์กฑ์ํค๊ธฐ ์ํ ์ผ๋ จ์ ํจ์์ ์งํฉ์ด๋ฉฐ ์กํฐ์ ์๊ตฌ์ฌํญ ๋ณ๊ฒฝ์ด ์ผ๋ จ์ ํจ์๋ค์ ๋ณ๊ฒฝ ๊ทผ์์ด ๋๋ค.
Primary Value
์ง์์ ์ผ๋ก ๋ณํํ๋ ์๊ตฌ์ฌํญ์ ์์ฉํ๋ ๊ฒ
๋๋ถ๋ถ์ ์ํํธ์จ์ด๋ ํ์ฌ ์๊ตฌ์ฌํญ์ ์ ๋ง์กฑํ์ง๋ง ๋ณ๊ฒฝํ๊ธด ์ด๋ ต๋ค.
Secondary Value
ํ์ฌ ์ํํธ์จ์ด๊ฐ ์ฌ์ฉ์์ ํ์ฌ ์๊ตฌ์ฌํญ์ ๋ง์กฑํ๋๊ฐ?
์กํฐ๊ฐ ๋ณ๊ฒฝ์ ๊ทผ์์ด๋ฏ๋ก ์กํฐ๋ฅผ ์ ๊ด๋ฆฌํด์ผ ํ๋ค. ์์ Employee์์๋ Primary Value๋ฅผ ์ ๋ง์กฑํ๊ณ ์๋๊ฐ?
ํ๋์ ๋ชจ๋์ ์ฌ๋ฌ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ์ถฉ๋์ด ๋ฐ์ํ๋ค !!
Employee๋ ๋๋ฌด ๋ง์ ๊ฒ์ ์๊ณ ์๋ ์ํ์ด๋ค. ๊ฑฐ๋ํ Fan Out์ด ์กด์ฌํ๋ ๊ฒ์ด๋ค. ๋ง์ ํฌ ์์์ ๋ง์ ์ฑ ์์ ๊ฐ๊ฒ๋๋ฉฐ ๊ฐ๊ฐ์ ์ฑ ์์ Employee๊ฐ ๋ค๋ฅธ ํด๋์ค๋ค์ ์ฌ์ฉํ๋๋ก ํ๋ค.
์ฑ ์์ ์ต์ํํ์ฌ Fan Out์ ์ ํํ์.
Operations Actor๊ฐ ์๋ก์ด ๋ฆฌํฌํธ ๊ธฐ๋ฅ์ ํ์๋ก ํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์๋ก์ด ๋ฆฌํฌํธ ๊ธฐ๋ฅ๋ Employee ํด๋์ค์ ์ถ๊ฐํ๋ค๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊น?
์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ Employee ํด๋์ค์ ์ํฅ์ด Employee ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ํด๋์ค๋ค์ด ๋ค์ ์ปดํ์ผ๋๊ณ ๋ฐฐํฌ๋์ด์ผ ํ๋ค.
ํ๋์ ๋ชจ๋์ ๋ฐ๋์ ํ๋์ ๋ณ๊ฒฝ ์ฌ์ ๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
ํ๋์ ํด๋์ค๋ ํ ์ข ๋ฅ์ ํด๋ผ์ด์ธํธ์๊ฒ๋ง ์๋นํด์ผ ํ๋ค.
๋์ผํ ์ด์ ๋ก ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ๊ฒ๋ค์ ๋์ผ ๋ชจ๋์
๋ค๋ฅธ ์ด์ ๋ก ๋ณ๊ฒฝ๋์ด์ผ ํ๋ ๊ฒ๋ค์ ๋ค๋ฅธ ๋ชจ๋์
์ ์ค์ผ์ด์ค๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์์คํ ์ค๊ณํ ๋ ์กํฐ(Actor)๋ค์ ํ์ ํ๊ฒ ๋๋ค. ์ด ๋ SRP๋ฅผ ํตํด ๊ฐ ๋ชจ๋์ด ๋ฐ๋์ ํ๋์ ์ฑ ์์ ๊ฐ๋๋ก ์ ์งํ๋ฉฐ ์ฑ ์์ ๋ชจ๋์ ํ ๋นํด์ผ ํ๋ค.
OOP์์ ์์กด์ฑ์ ๋ค๋ฃจ๋ ์ ๋ต์ผ๋ก ํด๋-์ค๋ฅผ ์ธํฐํ์ด์ค(interface)์ ๊ตฌํ ํด๋์ค๋ก ๋ถ๋ฆฌํ๋ค.
์กํฐ๋ฅผ ํด๋์ค์์ ๋์ปคํ๋งํ๊ฒ ๋๋ค.
์กํฐ๋ค์ ๋ณ๊ฒฝ์ฌํญ์ด ์กด์ฌํ๋ค๊ณ ํ๋๋ผ๋ Employee ๋ผ๋ ์ธํฐํ์ด์ค์ ๋ณ๊ฒฝ์ด ์๋ค๋ฉด ๋ค๋ฅธ ์กํฐ๋ค์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
3๊ฐ์ ์ฑ ์์ ๊ฐ๋ 3๊ฐ์ ํด๋์ค๋ก ๋ถ๋ฆฌ
์กํฐ๋ค์ ๋ถ๋ฆฌ๋ 3๊ฐ์ ํด๋์ค์ ์์กด
ํ๋์ ์ฑ ์์ ๋ณ๊ฒฝ์ ๋ค๋ฅธ ์ฑ ์์ ์ํฅ์ ๋ฏธ์น์ง ์์
๋ฌธ์ ์
transitive dependency: Employee์ ๋ณ๊ฒฝ์ด ์ ์ฌ์ ์ผ๋ก ๋ชจ๋ ์กํฐ์๊ฒ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
Employee์ ๊ฐ๋ ์ด ๊ฐ๊ฐ์ ์กฐ๊ฐ์ผ๋ก ๋ถ๋ฆฌ๋์ด ๊ธฐ๋ฅ์ด ์ด๋์ ๊ตฌํ๋์ด์๋์ง ์ฐพ์ผ๋ฌ ๋ค๋ ์ผ ํจ.
1๋ฒ๊ณผ 2๋ฒ์ ํฉ์น ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํด๋ณด์.
ํด๋์ค๋ฅผ ์ธํฐํ์ด์ค๋ก ์ถ์ถ
1๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ 3๊ฐ์ ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌ
3๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํ
๋ชจ๋ ํจ์๋ค์ Facade Class์ ๋๊ณ , ๊ฐ ๊ธฐ๋ฅ์ ๋ง๋ ์กํฐ๋ค์๊ฒ ์์ํ๋ ํํ
์ด๋์ ๊ตฌํ๋์ด์๋์ง ์ฐพ๊ธฐ ์ฝ์ง๋ง, ์ฌ์ ํ ๊ธฐ๋ฅ๋ค์ ๋ํ ์ด๋ ํ ๋ณ๊ฒฝ์ด๋ผ๋ ์๋ค๋ฉด ๋ชจ๋ ์กํฐ๋ค์ ์ํฅ์ ๋ฏธ์น ์ ์๋ค.
๊ฐ๊ฐ์ ์ธํฐํ์ด์ค๋ฅผ ํ๋์ ํด๋์ค๋ก ๊ตฌํํ๋ ๋ฐฉ์
์กํฐ๋ค์ ์์ ํ decoupled
๋์ง๋ง, ์ด๋์ ๊ตฌํ๋์ด์๋์ง ์ฐพ๊ธฐ ์ด๋ ค์ฐ๋ฉฐ, ํ๋์ ํด๋์ค์ ๊ตฌํ๋์ด ๊ตฌํ์ coupled
์ฑ ์์ ์ฌ์ฉ์(์กํฐ)์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค.
SRP๋ ํ๋์ ๋ณ๊ฒฝ ์ฌ์ (์กํฐ)๋ง ๊ฐ์ ธ์ผ ํ๋ค๋ ์์น์ ๋งํ๋ค.
์ฑ ์์ ์ ๋๋๋ฉด ๋ณ๊ฒฝ์ ์ ์ฐํด์ง๋, ์ถฉ๋๊ณผ ํฌ ์์์ ์ค์ผ ์ ์๋ค.
์์กด์ฑ ์ญ์ , ํด๋์ค ๋ถ๋ฆฌ, ํผ์ฌ๋, ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ๋ฑ์ ๋ฐฉ๋ฒ์ผ๋ก SRP๋ฅผ ์ค์ฒํ ์ ์๋ค.
๋ค๋ง, ์ ์ ํ ์ฑ ์์ ๊ฐ์ง๊ฒ ํ๋ ๊ฒ์ ์ ๋ง ์ด๋ ค์ด ๋ถ์ผ์ด๋ค. ์ค์ ๊ฐ๊ฐ์ด ํ์!
ํด๋์ค๋ ํ๋์ ์กํฐ(๋ณ๊ฒฝ์ ๊ทผ์)๋ง์ ์ํด ์กด์ฌํด์ผ ํ๋ฉฐ, ์กํฐ๋ณ๋ก ์ฑ ์์ ๋ถ๋ฆฌํ๋ฉด ๋ณ๊ฒฝ์ ์ ์ฐํ ์ํํธ์จ์ด๊ฐ ๋๋ค.