[Spring Boot] [3] 1. ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง (1)
๐ฉ๐ปโ๐ผ ๋ฉด์ ์์๋ ๋ง์ด ๋ฌผ์ด๋ณด๋ ์ง๋ฌธ!
SOLID
ํด๋ฆฐ์ฝ๋๋ก ์ ๋ช
ํ ๋ก๋ฒํธ ๋งํด์ด ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น์ ์ ๋ฆฌ
SRP ๋จ์ผ ์ฑ ์ ์์น
: Single responsibility principle
- ํ ํด๋์ค๋ ํ๋์ ์ฑ ์๋ง ๊ฐ์ ธ์ผ ํ๋ค.
- ํ๋์ ์ฑ ์์ด๋ผ๋ ๊ฒ์ ๋ชจํธํ๋ค.
- ๋ฌธ๋งฅ๊ณผ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
- ํด ์๋ ์๊ณ , ์์ ์๋ ์๋ค.
- ์ค์ํ ๊ธฐ์ค์ ๋ณ๊ฒฝ์ด๋ค. ๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธ ํจ๊ณผ๊ฐ ์ ์ผ๋ฉด ๋จ์ผ ์ฑ ์ ์์น์ ์ ๋ฐ๋ฅธ ๊ฒ์ด๋ค.
- ์) UI ๋ณ๊ฒฝ, ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌ
โญ๏ธ OCP ๊ฐ๋ฐฉ-ํ์ ์์น
: Open/closed principle
- ์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค ์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
- โก๏ธ ๋คํ์ฑ ํ์ฉ
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ก์ด ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค์ด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํ
- ์ง๊ธ๊น์ง ๋ฐฐ์ด ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ๋ฅผ ์๊ฐํด๋ณด์.
OCP ๊ฐ๋ฐฉ-ํ์ ์์น _๋ฌธ์ ์
- MemberService ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํ
- MemberRepository m = new MemoryMemberRepository(); // ๊ธฐ์กด ์ฝ๋
- MemberRepository m = new JdbcMemberRepository(); // ๋ณ๊ฒฝ ์ฝ๋
- ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค!
- ๋ถ๋ช ๋คํ์ฑ์ ์ฌ์ฉํ์ง๋ง OCP ์์น์ ์งํฌ ์ ์๋ค.
- ๐ค ๊ทธ๋ ๋ค๋ฉด ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐ?
- ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์ค์ ์๊ฐ ํ์ํ๋ค.
LSP ๋ฆฌ์ค์ฝํ ์นํ ์์น
: Liskov substitution principle
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
- ๋คํ์ฑ์์ ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ค ์ง์ผ์ผ ํ๋ค๋ ๊ฒ, ๋คํ์ฑ์ ์ง์ํ๊ธฐ ์ ํ ์์น, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ ๋ฏฟ๊ณ ์ฌ์ฉํ๋ ค๋ฉด, ์ด ์์น์ด ํ์ํ๋ค.
- ๋จ์ํ ์ปดํ์ผ์ ์ฑ๊ณตํ๋ ๊ฒ์ ๋์ด์๋ ์ด์ผ๊ธฐ
- ์) ์๋์ฐจ ์ธํฐํ์ด์ค์ ์์ ์ ์์ผ๋ก ๊ฐ๋ผ๋ ๊ธฐ๋ฅ, ๋ค๋ก ๊ฐ๊ฒ ๊ตฌํํ๋ฉด LSP ์๋ฐ, ๋๋ฆฌ ๋๋ผ๋ ์์ผ๋ก ๊ฐ์ผํจ (๋ฌผ๋ก ์ด๋ฐ ๊ธฐ๋ฅ์ ๋ง๋ค์ด๋ ์ปดํ์ผ ์๋ฌ๊ฐ ๋์ง ์๊ฒ ์ง๋ง! ๊ทธ๋๋ ์์ผ๋ก ๊ฐ๋ผ๋ ๊ธฐ๋ฅ์ ์ง์ผ์ผ ํจ.)
ISP ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
: Interface segregation principle
- ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค.
(์ ๋นํ ํฌ๊ธฐ๋ก ์ ์ชผ๊ฐ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ๊ฒ. ๐)- ์๋์ฐจ ์ธํฐํ์ด์ค -> ์ด์ ์ธํฐํ์ด์ค, ์ ๋น ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌ
- ์ฌ์ฉ์ ํด๋ผ์ด์ธํธ -> ์ด์ ์ ํด๋ผ์ด์ธํธ, ์ ๋น์ฌ ํด๋ผ์ด์ธํธ๋ก ๋ถ๋ฆฌ
- ๋ถ๋ฆฌํ๋ฉด ์ ๋น ์ธํฐํ์ด์ค ์์ฒด๊ฐ ๋ณํด๋ ์ด์ ์ ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
- ์ธํฐํ์ด์ค๊ฐ ๋ช ํํด์ง๊ณ , ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
โญ๏ธ DIP ์์กด๊ด๊ณ ์ญ์ ์์น
: Dependency inversion principle
- ํ๋ก๊ทธ๋๋จธ๋ โ์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค.โ ์์กด์ฑ ์ฃผ์ ์ ์ด ์์น ์ ๋ฐ๋ฅด๋ ๋ฐฉ๋ฒ ์ค - ํ๋๋ค.
- ์ฝ๊ฒ ์ด์ผ๊ธฐํด์ ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ๋ง๊ณ , ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป
- ์์์ ์ด์ผ๊ธฐํ โผ๏ธ ์ญํ (Role)์ ์์กดํ๊ฒ ํด์ผ ํ๋ค๋ ๊ฒ๊ณผ ๊ฐ๋ค(๋ก๋ฏธ์ค๋ฅผ ๋งก์ ์๋น์ด ์ค๋ฆฌ์ฃ์ ๋งก์ ๊นํํฌ๋๋ง ์ฐ์ต์ ํ๋ฉด ์กํ๊ต๋ก ๊ต์ฒด๋์์ ๋ ๊ณต์ฐ์ ํ ์ ์์. ์ฆ ๋ก๋ฏธ์ค๋ ์ค๋ฆฌ์ฃ์ด ๋๊ตฌ๋ ์ญํ ์๋ง ์์กดํ์ฌ์ผ ํจ.). ๊ฐ์ฒด ์ธ์๋ ํด๋ผ์ด์ธํธ๊ฐ ์ธํฐํ์ด์ค์ ์์กดํด์ผ ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค! ๊ตฌํ์ฒด์ ์์กดํ๊ฒ ๋๋ฉด ๋ณ๊ฒฝ์ด ์์ฃผ ์ด๋ ค์์ง๋ค.
- ๊ทธ๋ฐ๋ฐ OCP์์ ์ค๋ช ํ MemberService๋ ์ธํฐํ์ด์ค์ ์์กดํ์ง๋ง, ๊ตฌํ ํด๋์ค๋ ๋์์ ์์กดํ๋ค.
- MemberService ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํ
- MemberRepository m = new MemoryMemberRepository();- โก๏ธ DIP ์๋ฐ
๐: ์คํ๋ง ์ด์ผ๊ธด๋ฐ ์ ๊ฐ์ฒด ์งํฅ ์ด์ผ๊ธฐ๋ฅผ ํ์์ฃ ?
์คํ๋ง์ด ์๋ ์์ ์,,?
- ์๋ ์ด๋ค ๊ฐ๋ฐ์๊ฐ ์ข์ ๊ฐ์ฒด ์งํฅ ๊ฐ๋ฐ์ ์ํด OCP, DIP ์์น์ ์งํค๋ฉด์ ๊ฐ๋ฐ์ ํ๋ ํ ์ผ์ด ๋๋ฌด ๋ง์๋ค. (๋ฐฐ
๐ณ๋ณด๋ค ๋ฐฐ๊ผฝ์ด ํฌ๋ค!) ๊ทธ๋์ ํ๋ ์์ํฌ๋ก ๋ง๋ค์ด๋ฒ๋ ธ๋ค.- ์์ํ๊ฒ ์๋ฐ๋ก OCP, DIP ์์น๋ค์ ์งํค๋ฉด์ ๊ฐ๋ฐ์ ํด๋ณด๋ฉด, ๊ฒฐ๊ตญ ์คํ๋ง ํ๋ ์์ํฌ๋ฅผ ๋ง๋ค๊ฒ ๋๋ค. (๋ ์ ํํ๋ DI ์ปจํ ์ด๋)
- DI ๊ฐ๋ ์ ๋ง๋ก ์ค๋ช ์ด ์ ์๋๋ฏ๋ก ์ฝ๋๋ก!!
โก๏ธ ์ด์ ์ ์คํ๋ง์ด ๋ง๋ค์ด์ก๋๊ฐ ์ฝ๋๋ก ์ดํดํด๋ณด์.
๐ (์ค๋ฌด ๊ณ ๋ฏผ)
ํ์ดํ !! ( ยฐฬฅฬฅฬฅฬฅฬฅฬฅฬฅฬฅโกอยฐฬฅฬฅฬฅฬฅฬฅฬฅฬฅฬฅ)