ํฐ์คํ ๋ฆฌ ๋ทฐ
๊น์ํ๋์ ์คํ๋ง ํต์ฌ ์๋ฆฌ ๊ธฐ๋ณธํธ ๊ฐ์๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
SOLID
ํด๋ฆฐ์ฝ๋๋ก ์ ๋ช ํ ๋ก๋ฒํธ ๋งํด์ด ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น์ ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํจ.
- SRP: ๋จ์ผ ์ฑ ์ ์์น(single responsibility principle)
- OCP: ๊ฐ๋ฐฉ-ํ์ ์์น (Open/closed principle)
- LSP: ๋ฆฌ์ค์ฝํ ์นํ ์์น (Liskov substitution principle)
- ISP: ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น (Interface segregation principle)
- DIP: ์์กด๊ด๊ณ ์ญ์ ์์น (Dependency inversion principle)
SRP ๋จ์ผ ์ฑ ์ ์์น
Single responsibility principle
- ํ ํด๋์ค๋ ํ๋์ ์ฑ
์๋ง์ ๊ฐ์ ธ์ผ ํ๋ค.
-> ์ฌ์ค ๋ชจํธํ๋ค - ํ๋์ ์ฑ
์์ด๋ผ๋ ๊ฒ์ ๋ชจํธํ๋ค.
- ์ฑ ์์ด ํด ์๋, ์์ ์๋ ์๋ค
- ๋ฌธ๋งฅ๊ณผ ์ํฉ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.
- ์ค์ํ ๊ธฐ์ค์ ๋ณ๊ฒฝ์ด๋ค. ๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธ ํจ๊ณผ๊ฐ ์ ์ผ๋ฉด ๋จ์ผ ์ฑ ์ ์์น์ ์ ๋ฐ๋ฅธ ๊ฒ
- ex) UI ๋ณ๊ฒฝ, ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌ
-> ๋ฒ์๋ฅผ ์ ์ ํ๊ฒ ์กฐ์ ํ๋ ๊ฒ์ด ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ๋ฌ๋ฏธ, ๋ณ๊ฒฝ์ด ์์ ๋ ํ๋์ ํด๋์ค์ ํ๋์ ๋ถ๋ถ๋ง ๊ณ ์น ์ ์๋ ์ค๊ณ๋ผ๋ฉด SRP๋ฅผ ์ ์งํจ ๊ฒ!
OCP ๊ฐ๋ฐฉ-ํ์ ์์น
Open/closed principle
- ์ํํธ์จ์ด ์์๋ ํ์ฅ์๋ ์ด๋ ค์์ผ๋ ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
- ํ์ฅ์ ํ๋ ค๋ฉด, ๋น์ฐํ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค. ๊ทธ๋ผ ์ด๊ฑด ์งํฌ ์ ์๋ ๊ฒ์ผ๊น?
- ์๋๋ค. ๋คํ์ฑ์ ํ์ฉํ๋ค๋ฉด ์ฝ๊ฒ ์ด๋ฅผ ์ดํดํ ์ ์๋ค.
- ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ์๋ก์ด ํด๋์ค๋ฅผ ํ๋ ๋ง๋ค์ด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๋ฐฉ์์ผ๋ก ํ์ฅํ๋ฉด ๋๋ค.
๋ฌธ์ ์
// MemberRepository reopsitory = new JDBCMemberRepository();
MemberRepository reopsitory = new JpaMemberRepository();
- ์์ ๊ฐ์ด ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด ๊ฒฐ๊ตญ ํด๋ผ์ด์ธํธ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค.
- ๋ถ๋ช ๋คํ์ฑ์ ์ฌ์ฉํ์ง๋ง, OCP ์์น์ ์งํฌ ์ ์๋ค.
- ์ด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผํ ๊น?
- ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์ค์ ์๊ฐ ํ์ํ๋ค.
- ์ฌ์ค ์คํ๋ง์์๋ ์ปจํ ์ด๋๋ฅผ ์ด์ฉํด์ ์ด๋ฅผ ํด๊ฒฐํ๋ค.
LSP ๋ฆฌ์ค์ฝํ ์นํ ์์น
Liskov substitution principle
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ๋จ๋ฆฌ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
- ๋คํ์ฑ์์ ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ค ์ง์ผ์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ๋คํ์ฑ์ ์ง์ํ๊ธฐ ์ํ ์์น, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ฅผ ๋ฏฟ๊ณ ์ฌ์ฉํ๋ ค๋ฉด ์ด ์์น์ด ํ์ํ๋ค.
- ๋จ์ํ ์ปดํ์ผ์ ์ฑ๊ณตํ๋ ๊ฒ์ ๋์ด์๋ ์ด์ผ๊ธฐ
-> ์๋์ฐจ๋ฅผ ๋ง๋๋๋ฐ ์ ์ ์ ๋ฐ์ผ๋ฉด ์์ผ๋ก ๊ฐ๋ ๊ธฐ๋ฅ์ ํ์ค์ผ๋ก ๋ง๋ค์๋ค๊ณ ์น์ ๊ทธ๋ฐ๋ฐ ์ ์ ์ ๋ฐ์ผ๋ฉด ๋ค๋ก ๊ฐ๋ ๊ธฐ๋ฅ์ผ๋ก ๋ง๋ค์๋ค๊ณ ํด๋ณด์. ์ปดํ์ผ ์์ ๋ฌธ์ ๋ ๋์ง ์์ง๋ง LSP ์์น์ ์ด๊ธ๋ ๊ฒ์ด ๋๋ค.
์ด๋ฅผ ์ ๋ฆฌํ๋ฉด ์๋์ ๊ฐ๋ค. - ์) ์๋์ฐจ ์ธํฐํ์ด์ค์ ์์ ์ ์์ผ๋ก ๊ฐ๋ผ๋ ๊ธฐ๋ฅ, ๋ค๋ก ๊ฐ๊ฒ ๊ตฌํํ๋ฉด LSP ์๋ฐ, ๋๋ฆฌ๋๋ผ๋ ์์ผ๋ก ๊ฐ์ผํ๋ค.
ISP ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
Interface segregation principle
- ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค.
- ์๋์ฐจ ์ธํฐํ์ด์ค -> ์ด์ ์ธํฐํ์ด์ค, ์ ๋น ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌ
- ์ฌ์ฉ์ ํด๋ผ์ด์ธํธ -> ์ด์ ์ ํด๋ผ์ด์ธํธ, ์ ๋น์ฌ ํด๋ผ์ด์ธํธ๋ก ๋ถ๋ฆฌ
- ๋ถ๋ฆฌํ๋ฉด ์ ๋น ์ธํฐํ์ด์ค ์์ฒด๊ฐ ๋ณํด๋ ์ด์ ์ ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์์
- ์ธํฐํ์ด์ค๊ฐ ๋ช ํํด์ง๊ณ , ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค. -> ๋ฉ์ด๋ฆฌ๊ฐ ์์์ง๊ธฐ ๋๋ฌธ
- ์คํ๋ง์ ์ ๋ง ์ฒ ์ ํ๊ฒ ์ธํฐํ์ด์ค๊ฐ ๋ถ๋ฆฌ๋์ด ์๋ค๊ณ ํจ.
DIP ์์กด๊ด๊ณ ์ญ์ ์์น
Dependency inversion principle
- ํ๋ก๊ทธ๋๋จธ๋ "์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค." ์์กด์ฑ ์ฃผ์ ์ ์ด ์์น์ ๋ฐ๋ฅด๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ค.
- ์ฝ๊ฒ ์ด์ผ๊ธฐํด์ ๊ตฌํ ํด๋์ค์ ์์กดํ์ง ๋ง๊ณ , ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป!
- ex) ์ญํ (Role)์ ์์กดํ๊ฒ ํด์ผํ๋ค๋ ๋ง(๋ฐฐ์ฐ์ ๋ฐฐ์ญ, ๋ฐฐ์ฐ๊ฐ ๋ฐฐ๊ปด๋ ๋ฐฐ์ญ์ ๋ณํ์ง ์์)๊ณผ ๊ฐ๋ค.
- ๊ฐ์ฒด ์ธ์๋ ํด๋ผ์ด์ธํธ๊ฐ ์ธํฐํ์ด์ค์ ์์กดํด์ผ ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์์. ๊ตฌํ์ฒด์ ์์กดํ๊ฒ ๋๋ฉด ๋ณ๊ฒฝ์ด ์์ฃผ ์ด๋ ค์์ง!!!!
์๋ ์ฝ๋์ MemberService๋ ์ธํฐํ์ด์ค์ ์์กดํ์ง๋ง, ๊ตฌํ ํด๋์ค๋ ๋์์ ์์กดํ๋ค.
- ์์กดํ๋ค = ํด๋น ํด๋์ค๊ฐ ๊ทธ ์ฝ๋์ ๋ํด ์๊ณ ์๋ค.
- ๋ฐ๋ผ์ DIP ์๋ฐ!
- MemberService ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํํ๊ณ ์์...
@Service
class MemberService {
MemberRepository repository = new JpaMemberRepository();
}
์ ๋ฆฌ
- ๊ฐ์ฒด ์งํฅ์ ํต์ฌ์ ๋คํ์ฑ
- ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌํ๋ผ.
- ์ ์ฐํ๊ฒ ๋ณ๊ฒฝํ ์ ์๋๋ก ๋ง๋๋ ๊ฒ์ด ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ๋ค.
- ์ด์์ ์ผ๋ก ๋ชจ๋ ์ค๊ณ์ ์ธํฐํ์ด์ค๋ฅผ ๋ถ์ฌํ์.
- ํ์ง๋ง, ๋คํ์ฑ๋ง์ผ๋ก๋ ์ฝ๊ฒ ๋ถํ์ ๊ฐ์ ๋ผ์ฐ๋ฏ์ด ๊ฐ๋ฐํ ์ ์๋ค..
- ๋คํ์ฑ๋ง์ผ๋ก ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํจ๊ป ๋ณ๊ฒฝ๋๋ค.
- ๋คํ์ฑ๋ง์ผ๋ก๋ OCP, DIP๋ฅผ ์งํฌ ์ ์๊ณ , ๋ญ๊ฐ ๋ ํ์ํ๋ค
- ๊ทธ๊ฒ์ด ๋ฐ๋ก ์คํ๋ง!! ์คํ๋ง์ DI๋ฅผ ํตํด ๋คํ์ฑ + OCP, DIP๋ฅผ ๊ฐ๋ฅํ๊ฒ ์ง์ํ๋ค.
๋ฐ์ํ
'BackEnd' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ฆ ๋ ์ค๋ฅด๋ gRPC ํบ์๋ณด๊ธฐ (2) | 2022.12.04 |
---|---|
Nginx 403 (13 Permission denied) ํด๊ฒฐํ๊ธฐ (0) | 2021.10.30 |
JWT (0) | 2021.06.26 |
HTTP ๋ฉ์๋ (0) | 2021.05.28 |
HTTP ์ํ์ฝ๋ (0) | 2021.05.22 |
๊ณต์ง์ฌํญ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ
- Total
- Today
- Yesterday
TAG
- ๋ฐฑ์ค
- ์ถ์ ์ง๋
- rate limit
- golang oomkilled
- ์ข์ ๊ฐ๋ฐ์ ๋๊ธฐ
- ํ(Heap)
- ์ฝ๋ฉํ ์คํธ
- ์๊ณ ๋ฆฌ์ฆ
- ํธ๋์ญ์ ๊ฒฉ๋ฆฌ ์์ค
- kotlin s3 upload
- grpc client
- ์ฅ์ ํ๊ณ
- 2024ํ๊ณ
- Aws Reinvent 2023
- ์คํ/ํ
- ๊น์ด/๋๋น ์ฐ์ ํ์(DFS/BFS)
- AWS re:Invent 2023
- mysql ์คํ ๊ณํ
- HTTP
- ์ข์ ๊ฐ๋ฐ์
- ์ข์ ์์ง๋์ด
- Golang
- Go
- ๋ฑ ํฌ์๋ฌ๋ ๊ฐ๋ฐ์
- ํ๋ก๊ทธ๋๋จธ์ค
- ์ข์ ์ฝ๋๋ ๋ฌด์์ธ๊ฐ?
- 2023 ๊ฐ๋ฐ์ ํ๊ณ
- mysql
- ํด์
- 2023 ํ๊ณ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
๊ธ ๋ณด๊ดํจ