2021. 9. 11. 08:00ใBack-End ์์ ์ค/Spring Framework
์๋ ํ์ธ์? ์ฃผ๋ํ๋ ์ ๋๋ค.
์ค๋์ Spring์ SOLID์ ๋ํด์ ๊ณต๋ถ ํด ๋ณด๋๋ก ํ๋ ๊ฒ์ด์์.
์ด ๋ด์ฉ์ ์ธํ๋ฐ - ๊น์ํ ๊ฐ์ฌ๋์ ์คํ๋ง ํต์ฌ ์๋ฆฌ๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ ๋ฆฌ ํ์์ต๋๋ค.
๐ ๋ชฉ์ฐจ
01. [Spring] ์คํ๋ง ํต์ฌ ์๋ฆฌ
02. [Spring] ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID)
03. [Spring] ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง
04. [Spring] OCP์ DIP ๊ณ ๋ คํ๊ธฐ
05. [Spring] ๊ฐ์ฒด ์งํฅ ์๋ฆฌ ์ ์ฉ - ์๋ก์ด ํ ์ธ ์ ์ฑ
๊ฐ๋ฐ
06. [Spring] AppConfig ๋ฆฌํฉํฐ๋ง
07. [Spring] Ioc, DI Container
08. [Spring] ์คํ๋ง ์ปจํ
์ด๋ ์์ฑ
09. [Spring] ์ฑ๊ธํค ์ปจํ
์ด๋
10. [Spring] Component Scan And Auto wired Start
11. [Spring] ์์กด๊ด๊ณ ์ฃผ์
๋ฐฉ๋ฒ
12. [Spring] Bean Life Cycle Call Back
13. [Spring] Bean Scope
๐ SOLID๋?
๐Clean Code๋ก ์ ๋ช ํ ๋ก๋ฒํธ ๋งํด์ด ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 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) : ๋จ์ผ ์ฑ ์ ์์น
- ํ ๊ฐ์ Class๋ ํ๋์ ์ฑ
์๋ง ๊ฐ์ ธ์ผ ํ๋ค.
ํ์ง๋ง, ํ๋์ ์ฑ ์์ด๋ผ๋ ๊ฒ์ด ๋งค์ฐ ๋ชจํธํ๋ค.- ์ด๊ฒ์ ํด ์๋ ์๊ณ , ์์ ์๋ ์๋ค.
- ๋ฌธ๋งฅ๊ณผ ์ํฉ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
- ์ค์ํ ๊ธฐ์ค์ ๋ณ๊ฒฝ์ด๋ค. ๋ณ๊ฒฝ์ด ์์ ๋ ํ๊ธ ํจ๊ณผ๊ฐ ์ ์ผ๋ฉด ๋จ์ผ ์ฑ
์ ์์น์ ์ ๋ฐ๋๋ค๊ณ ๋ณธ๋ค.
- ์:) UI ๋ณ๊ฒฝ, ๊ฐ์ฒด์ ์์ฑ๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌ
- Layer๋ฅผ ๋๋๋ ์ด์ ๋ ๋จ์ผ ์ฑ ์ ์์น์ ์งํค๊ธฐ ์ํจ
๐ OCP (Open/Closed Principle) : ๊ฐ๋ฐฉ - ํ์ ์์น (๋งค์ฐ ์ค์)
- Software ์์๋ ํ์ฅ์๋ ์ด๋ ค ์์ผ๋, ๋ณ๊ฒฝ์๋ ๋ซํ ์์ด์ผ ํ๋ค.
[Spring] ์คํ๋ง ํต์ฌ ์๋ฆฌ์ ์์ฑํด ๋ ์๋์ฐจ๊ฐ K3์์ ํ ์ฌ๋ผ๋ก ์ด์ ์๊ฐ ์ฐจ๋ฅผ ์๋ก ์ฌ๋๋ผ๋ ์ด์ ์๋ ๊ทธ๋ฅ ์ด์ ํ ์ ์๋ค. - ํ์ฅ์ ํ๋๋ฐ, ์ด๋ป๊ฒ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์์ ์๊ฐ ์์๊น?
- ๋คํ์ฑ์ ํ์ฉ
- Interface๋ฅผ ๊ตฌํํ ์๋ก์ด Class๋ฅผ ํ๋ ๋ง๋ค์ด์ ์๋ก์ด ๊ธฐ๋ฅ ๊ตฌํ
- ์ญํ ๊ณผ ๊ตฌํ์ ๋ถ๋ฆฌ๋ก ์๊ฐ. ์ฆ, Interface Code๋ ๋ณ๊ฒฝํ์ง ์๊ณ , ์๋ก์ด ๊ตฌํ์ฒด๋ฅผ ํตํด ํ์ฅํ ์ ์๋ค.
public class MemberService {
private MemberRepository memberRepository = new MemoryMemberRepository();
} // Class ๋
public class MemberService {
// private MemberRepository memberRepository = new MemoryMemberRepository();
private MemberRepository memberRepository = new JdbcMemberRepository();
} // Class ๋
๋ฌธ์ ์
- MemberService Client๊ฐ ๊ตฌํ Class๋ฅผ ์ง์ ์ ํ
- MemberRepository m = new MemberMemberRepository(); => ๊ธฐ์กด ์ฝ๋
- MemberRepository m = new JdbcMemberRepository(); => ๋ณ๊ฒฝ ์ฝ๋
- ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ๋ ค๋ฉด Client Code๊ฐ ๋ณ๊ฒฝ๋์ด์ผ ํ๋ค.
- ๋ถ๋ช
๋คํ์ฑ์ ์ฌ์ฉํ์ผ๋, OCP ์์น์ ์งํฌ ์ ์๋ ๋ฌธ์ ๋ฐ์
- ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์ค์ ์๊ฐ ํ์
์ด๊ฒ์ Spring Container๊ฐ DI๋ฅผ ํตํด ์ฒ๋ฆฌ
- ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ์ด์ฃผ๋ ๋ณ๋์ ์กฐ๋ฆฝ, ์ค์ ์๊ฐ ํ์
๐ LSP (Liskov Substitution Principle) : ๋ฆฌ์ค์ฝํ ์นํ ์์น
์ด๋ค Interface์ ๋ํ ๊ตฌํ์ฒด๊ฐ ์์ ๋, ์๋ฅผ ๋ค์ด ์๋์ฐจ Interface๋ฅผ ๊ตฌํํ ์๋ฐ๋ผ์ ์ ์ ๊ธฐ๋ฅ์ด ์์ผ๋ก ๊ฐ๋ค์ด์ง๋ง, ๋ค๋ก ๊ฐ ์ ์๊ฒ๋ ํ ์ ์๋ต๋๋ค. ์ด๋ ๊ฒ ํด๋ ๋ฌธ์ ๋ ์์ผ๋, ์ ์ ์ ๋ฐ์ผ๋ฉด ์์ผ๋ก ๊ฐ๋ค๊ฐ ๊ท์ฝ์ด๋ผ๋ฉด ์ด ๊ท์ฝ์ ๋ฌด์กฐ๊ฑด ์ง์ผ์ผ ๋๋ค์ ๋ํ ๊ฒ์ด์์!
- ํ๋ก๊ทธ๋จ์ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ์ ๊นจ์ง ์์ผ๋ฉด์ ํ์ ํ์ ์ ์ธ์คํด์ค๋ก ๋ฐ๊ฟ ์ ์์ด์ผ ํ๋ค.
- ๋คํ์ฑ์์ ํ์ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ท์ฝ์ ๋ค ์ง์ผ์ผ ํ๋ค๋ ๊ฒ, ๋คํ์ฑ์ ์ง์ํ๊ธฐ ์ํ ์์น, ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌํ์ฒด๋ฅผ ๋ฏฟ๊ณ ์ฌ์ฉํ๋ ค๋ฉด? ์ด ์์น์ด ํ์
- ๋จ์ํ ์ปดํ์ผ์ ์ฑ๊ณตํ๋ ๊ฒ์ ๋์ด์๋ ๋ถ๋ถ
๐ ISP (Interface Segregation Principle) : ์ธํฐํ์ด์ค ๋ถ๋ฆฌ ์์น
- ํน์ ํด๋ผ์ด์ธํธ๋ฅผ ์ํ ์ธํฐํ์ด์ค ์ฌ๋ฌ ๊ฐ๊ฐ ๋ฒ์ฉ ์ธํฐํ์ด์ค ํ๋๋ณด๋ค ๋ซ๋ค.
- ์๋์ฐจ ์ธํฐํ์ด์ค -> ์ด์ ์ธํฐํ์ด์ค, ์ ๋น ์ธํฐํ์ด์ค๋ก ๋ถ๋ฆฌ
- ์ฌ์ฉ์ ํด๋ผ์ด์ธํธ - > ์ด์ ์ ํด๋ผ์ด์ธํธ, ์ ๋น์ฌ ํด๋ผ์ด์ธํธ๋ก ๋ถ๋ฆฌ
์ด๋ ๊ฒ ๊ตฌํ ์ ์ด์ฉ์ ํด๋ผ์ด์ธํธ์ ์ ๋น์ฌ ํด๋ผ์ด์ธํธ๋ฅผ ๋ถ๋ฆฌํด์ ์ ๋น์ฌ ํด๋ผ์ด์ธํธ(์ ๋น ์ธํฐํ์ด์ค ์์ฒด ๋ณ๊ฒฝ)์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋๋ผ๋ ์ด์ฉ์ ํด๋ผ์ด์ธํธ์ ์ํฅ์ ์ฃผ์ง ์์ ์ ์๋ค. - ์ธํฐํ์ด์ค๊ฐ ๋ช ํํด์ง๊ณ , ๋์ฒด ๊ฐ๋ฅ์ฑ์ด ๋์์ง๋ค.
๐DIP (Dependency Inversion Principle) : ์์กด๊ด๊ณ ์ญ์ ์์น (๋งค์ฐ ์ค์)
- ํ๋ก๊ทธ๋๋จธ๋ "์ถ์ํ์ ์์กดํด์ผ์ง, ๊ตฌ์ฒดํ์ ์์กดํ๋ฉด ์๋๋ค." ์์กด์ฑ ์ฃผ์
์ ์ด ์์น์ ๋ฐ๋ฅด๋ ๋ฐฉ๋ฒ ์ค ํ๋
- ํด๋ผ์ด์ธํธ(Service Layer ๋ฑ)์ด ์ธํฐํ์ด์ค(MemberRepository ๋ฑ)๋ง ๋ฐ๋ผ๋ด์ผ์ง ๊ตฌํ์ฒด๋ ๋ชฐ๋ผ์ผ ํ๋ค.
- ์ฝ๊ฒ ์ด์ผ๊ธฐํด์ ๊ตฌํ์ฒด์ ์์กดํ์ง ๋ง๊ณ , ์ธํฐํ์ด์ค์ ์์กดํ๋ผ๋ ๋ป
- ์ญํ (Role)์ ์์กดํ๊ฒ ํด์ผ ํ๋ค๋ ์ด์ผ๊ธฐ. ์ฆ, ๊ฐ์ฒด ์ธ์๋ ํด๋ผ์ด์ธํธ๊ฐ ์ธํฐํ์ด์ค์ ์์กดํด์ผ ์ ์ฐํ๊ฒ ๊ตฌํ์ฒด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
๊ตฌํ์ฒด์ ์์กดํ๊ฒ ๋๋ฉด ๋ณ๊ฒฝ์ด ์์ฃผ ์ด๋ ค์์ง๋ค.- ์ ๋ฆฌํ์๋ฉด ๋ก๋ฏธ์ค ์ญํ ์ ์๋น ๋ฐฐ์ฐ๋์ด ์ค๋ฆฌ์ฃ ์ญํ ์ ๊นํํฌ ๋ฐฐ์ฐ๋์ด๋ ์ฐ์ตํ๊ณ , ํธํก์ ๋ง์ถ์๋ค๋ฉด ๊นํํฌ ๋ฐฐ์ฐ๋ ์ธ์ ๋์ฒด๊ฐ ๋ถ๊ฐํ๋ค. ์๋น ๋ฐฐ์ฐ๋์ ์ค๋ฆฌ์ฃ ์ญํ ๋ง ์๊ณ , ์๊ธฐ ๊ฒ์ ์ฐ์ตํ๋ฉด ๋์ง ๋ค๋ฅธ ๋ฐฐ์ฐ๋ค์ ์ผ์ผ์ด ์ ํ์๊ฐ ์๋ค.
- OCP์์ ๊ณต๋ถํ MemberService๋ ์ธํฐํ์ด์ค์ ์์กดํ๋, ๊ตฌํ ํด๋์ค๋ ๋์์ ์์กดํ๋ค.
- MemberService ํด๋ผ์ด์ธํธ๊ฐ ๊ตฌํ ํด๋์ค๋ฅผ ์ง์ ์ ํ
- MemberRepository(์ธํฐํ์ด์ค) m = new MemoryMemberRepository(); (๊ตฌํ์ฒด)
์ธํฐํ์ด์ค์ ๊ตฌํ์ฒด๋ฅผ ๋ชจ๋ ์์กดํ๊ณ ์๊ธฐ ๋๋ฌธ์ DIP ์๋ฐ
- MemberRepository(์ธํฐํ์ด์ค) m = new MemoryMemberRepository(); (๊ตฌํ์ฒด)
- DIP ์๋ฐ์ด๋?
- ์ถ์ํ(์ธํฐํ์ด์ค)์ ์์กดํด์ผ์ง ๊ตฌ์ฒดํ(๊ตฌํ์ฒด)์ ์์กดํ๋ฉด ์๋๋ค.
๐์ ๋ฆฌ
- ๊ฐ์ฒด ์งํฅ์ ํต์ฌ์ ๋คํ์ฑ
- ๋คํ์ฑ ๋ง์ผ๋ก ์ฝ๊ฒ ๋ถํ์ ๊ฐ์ ๋ผ์ฐ๋ฏ ๊ฐ๋ฐํ ์ ์๋ค.
- ๋คํ์ฑ ๋ง์ผ๋ก๋ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ณ๊ฒฝํ ๋ ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํจ๊ป ๋ณ๊ฒฝํด์ผ ํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
- ์ฆ, ๋คํ์ฑ ๋ง์ผ๋ก๋ OPC, DIP๋ฅผ ์งํฌ ์ ์๋ค.
์ฃผ๋ํ๋์ ๊ธ์ด ๋ง์์ ๋์
จ๋์? ๊ตฌ๋
๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋๊ธ ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ช
๋ก์ ์ฃผ๋ํ๋์๊ฒ ๋ง์ ํ์ด ๋ฉ๋๋ค
'Back-End ์์ ์ค > Spring Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] OCP์ DIP ๊ณ ๋ คํ๊ธฐ (4) | 2021.09.18 |
---|---|
[Spring] ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง (0) | 2021.09.12 |
[Spring] ์คํ๋ง ํต์ฌ ์๋ฆฌ (0) | 2021.09.10 |
[๋์ ๊ธฐ์ !] JPA์ Querydsl (0) | 2021.08.25 |
[๋์ ๊ธฐ์ !] ํ ์คํธ ์ฝ๋ (0) | 2021.08.24 |