2021. 9. 29. 08:00ใBack-End ์์ ์ค/Spring Framework
์๋ ํ์ธ์? ์ฃผ๋ํ๋์ ๋๋ค.
์ฃผ๋ํ๋์ ์์์ ์ฃผ๋ฌธ, ํ์, ํ ์ธ(๊ณ ์ ํ ์ธ)์ ๋ํด์ ์์ ์๋ฐ๋ง์ ํ์ฉํด ์ด์ฌํ ๊ณต๋ถ๋ฅผ ํ๋ ๊ฒ์ด์์.
์ด๋ฒ์๋ ๊น์ํ ๊ฐ์ฌ๋๊ป์ ํ ์ธ์์ ์ ๋ฅ ํ ์ธ์ ํ๋ ์ ์ฑ ์ ๋ง๋๋ ๋ฒ์ ๋ํด์ ์๋ ค์ฃผ์ จ์ด์!
ํจ๊ป ๊ณต๋ถ ํด ๋ณด์ค๊ฒ์!
๐ ๋ชฉ์ฐจ
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
๐ ์๋ก์ด ํ ์ธ ์ ์ฑ ๊ฐ๋ฐ
๊ธฐ์กด์ ์ฐ๋ฆฌ๋ ๊ณ ์ ํ ์ธ ์ ์ฑ ์ผ๋ก ์ฝ๋ฉ์ ํ๋ ๊ฒ์ด์์. ํ์ง๋ง, ๊ณ ๊ฐ์ฌ์ ์ ์ฑ ๋ณ๊ฒฝ์ผ๋ก ์ ๋ฅ ํ ์ธ ์ ์ฑ ์ ๋์ ํด์ผ ํ๋ ๊ฒ์ด์์.
๐ RateDiscountPolicy ์ถ๊ฐ
๐ RateDiscountPolicy ์ฝ๋ ์ถ๊ฐ
์ด Method๋ DiscountPolicy๋ฅผ ๊ตฌํํ๋ ๊ตฌํ์ฒด์ด๊ณ , ๊ตฌ์ฒดํ๋ discount์ธ ๊ฒ์ด์์.
discount์์๋ Member ๊ฐ์ฒด์ ๊ตฌ์ ๊ฐ๋ฅผ ์ ๋ ฅ ๋ฐ์ Member ๋ฑ๊ธ์ด VIP๋ผ๋ฉด ๊ตฌ์ ๊ฐ์ 10์ ๊ณฑํ ๋ค ๋๋๊ธฐ 100์ ํ์ฌ 10% ํ ์ธ์ ๋ฐ๋๋ก ํ์ฌ ๋ฐํํ๊ณ , VIP๊ฐ ์๋๋ผ๋ฉด 0์ ๋ฐํํ์ฌ ํ ์ธ์ด ์๋๋ก ๊ตฌํ ํ ๊ฒ์ด์์.
๐ Test ์ฝ๋
๐์๋ก์ด ํ ์ธ ์ ์ฑ ์ ์ฉ๊ณผ ๋ฌธ์ ์
์์ ์ถ๊ฐํ ์ ๋ฅ ํ ์ธ ์ ์ฑ ์ ์ ์ฉํ๋ ค๋ฉด Client์ธ 'OrderServiceImpl.java'์ ์ฝ๋ ๋ด์ฉ๋ ๊ณ ์ณ์ผ ํ๋ ๊ฒ์ด์์.
์์ ์ฝ๋๋ฅผ ์๊ฐํด๋ณด๋ฉด ์๋์ ๊ฐ์ ๋ฌธ์ ์ ์ด ์์์ ์ ์ ์๋ต๋๋ค.
- ๊ฐ๋ฐ์๋ ์ญํ ๊ณผ ๊ตฌํ์ ์ถฉ์คํ๊ฒ ๋ถ๋ฆฌํ๋๊ฐ? Yes
- ๋คํ์ฑ๋ ํ์ฉํ๊ณ , Interface์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฆฌํ๋๊ฐ? Yes
- OCP, DIP ๊ฐ์ ๊ฐ์ฒด์งํฅ ์ค๊ณ ์์น์ ์ถฉ์คํ ์ค์ ํ๋๊ฐ?
- ๊ฒ๋ณด๊ธฐ์ ๊ทธ๋ ์ง๋ง, ์ฌ์ค No!
DIP: ์ฃผ๋ฌธ ์๋น์ค ํด๋ผ์ด์ธํธ(OrderServiceImpl)์ DiscountPolicy Interface์ ์์กดํ๋ฉด์ DIP๋ฅผ ์งํค์ง ์์๋์?
Class ์์กด ๊ด๊ณ๋ฅผ ๋ถ์ํด ๋ณผ๊ฒ์! ์ถ์(Interface)๋ฟ๋ง ์๋๊ณ , ๊ตฌ์ฒด(๊ตฌํ) Class๋ ์์กด(new RateDiscountPolicy)ํ๊ณ ์๋ค๋ ์ฌ์ค ๋ณด์ด์๋์?
- ์ถ์(Interface) ์์กด : DiscountPolicy
- ๊ตฌ์ฒด(๊ตฌํ) Class ์์กด : FixDiscountPlicy, RateDiscountPolicy
OCP: ๋ณ๊ฒฝ์ ๋ถ๊ฐํ๊ณ , ํ์ฅ ํ ์ ์๋๋ก ํ์ด์!
ํ์ง๋ง, ์ง๊ธ ์ฝ๋๋ ๊ธฐ๋ฅ์ ํ์ฅํด์ ๋ณ๊ฒฝํ๋ฉด, Client ์ฝ๋์ ์ํฅ์ ์ค ์ ๋ฐ์ ์๋ ๊ฒ์ด์์. ๋๋ฌธ์ OCP๋ ์๋ฐ์ด๋๋๋ค!
๊ทธ๋ ๋ค๋ฉด ์? Client ์ฝ๋์ ๋ณ๊ฒฝ์ ํด์ผ ํ๋ ๊ฒ์ผ๊น์? ๋ค์์ Class Diagram์ธ ๊ฒ์ด์์.
๐ ๊ธฐ๋ํ ์์กด๊ด๊ณ
์ฐ๋ฆฌ๋ ์ง๊ธ๊น์ง ๋จ์ํ DiscountPolicy ์ฆ, ์ธํฐํ์ด์ค๋ง ์์กดํ๋ค๊ณ ์๊ฐํ์์ด์! ํ.์ง.๋ง
๐ ์ค์ ์์กด๊ด๊ณ
์์ธํ ๋ณด๋ฉด Client์ธ 'OrderServiceImpl'์ด 'DiscountPolicy'์ 'FixDiscountPolicy'๋ฅผ ๋ชจ๋ ์์กดํ๊ณ ์๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ ๊ฒ์ด์์. ์ฆ, ๊ตฌ์ฒด Class๋ ํจ๊ป ์์กดํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ DIP ์๋ฐ์ด๋๋๋ค!
์ด๋ ๊ฒ ๋๋ฉด 'FixDiscountPolicy'๋ฅผ 'RateDiscountPolicy'๋ก ๋ณ๊ฒฝํ๋ ์๊ฐ 'OrderServiceImpl'์ ์ฝ๋๋ ๋ณ๊ฒฝ์ด ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ OCP ๋ํ ์๋ฐ ์ธ ๊ฒ์ด์์.
์ฐ๋ฆฌ๋ DIP ์๋ฐ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ถ์(Interface)์๋ง ์์กดํ๋๋ก ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒ์ด์์.
๐ Interface๋ง ์์กดํ๋๋ก ์ฝ๋ ๋ณ๊ฒฝ
์์ ๊ฐ์ด ๋ณ๊ฒฝ์ ํ๊ฒ ๋๋ฉด ์ด๋ค ๋ฌธ์ ๊ฐ ์์๊น์? ๊ตฌํ์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์คํ์ด ๋์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด์์.
๊ทธ๋์ ์ค์ ์คํ์ ํ๋ฉด NPE(Null Point Exception)์ด ๋ฐ์ํ๋ ๊ฒ์ด์์.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ด๋ค ๋ค๋ฅธ ๊ณณ์์ Client์ธ 'OrderServiceImpl'์ 'DiscountPolicy'์ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ๋์ ์์ฑํ๊ณ , ์ฃผ์ ํด์ฃผ์ด์ผ ํ๋ ๊ฒ์ด์์.
๐๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ
์! Application์ ํ๋์ ๊ณต์ฐ์ด๋ผ ์๊ฐํด ๋ณผ๊ฒ์! ๊ฐ๊ฐ์ Interface๋ฅผ ๋ฐฐ์ญ(๋ฐฐ์ฐ์ ์ญํ )์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ , ๊ตฌํ์ฒด๋ฅผ ๊ฐ๊ฐ์ ๋ฐฐ์ฐ๋ค์ด๋ผ๊ณ ๊ฐ์ ํ ๋ ์ค์ ๋ฐฐ์ญ์ ๋ง๋ ๋ฐฐ์ฐ๋ฅผ ์ ํํ๋ ๊ฒ์ ๋๊ฐ ํด์ผ ๋ ๊น์?
๋ง์ฝ ๋ก๋ฏธ์ค์ ์ค๋ฆฌ์ฃ ๊ณต์ฐ์ ๊ฐ์ ํ๋ฉด ๋ก๋ฏธ์ค ์ญํ ๊ณผ ์ค๋ฆฌ์ฃ ์ญํ ์ ๋๊ฐ ํ ์ง๋ ๋ฐฐ์ฐ๋ค์ด ์ ํ๋ ๊ฒ์ด ์๋์์.
์ฐ๋ฆฌ๊ฐ ๊ธฐ์กด์ ์์ฑํ๋ ์ฝ๋๋ ๋ง์น ๋ก๋ฏธ์ค ์ญํ (Interface)๋ฅผ ํ๋ ๋ฐฐ์ฐ(๊ตฌํ์ฒด)์๊ฒ ์ค๋ฆฌ์ฃ ์ญํ ์ ํ ๋ฐฐ์ฐ๋ฅผ ๊ตฌํด์ค๋ผ๊ณ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์น์ธ ๊ฒ์ด์์. ๊ทธ๋ ๊ฒ ๋๋ฉด ๋ก๋ฏธ์ค ์ญํ ์ ๋ฐฐ์ฐ๋ ๊ณต์ฐ๋ ํด์ผ ํ๊ณ , ๋ฐฐ์ฐ๋ ์ฐพ์์ผ ํ๊ณ , ์ ๋ฌด์ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆด ๊ฒ์ด์์.
๋ฐ๋ผ์ ๋ฐฐ์ฐ๋ ๋ณธ์ธ์ ์ญํ ์ธ ์ฐ๊ธฐ์๋ง ์ง์คํ๊ฒ ํด์ผ ํ๋ ๊ฒ์ด์์.
๊ทธ๋ฆฌ๊ณ , ์ด๋ค ์๋ ๋ฐฐ์ฐ๊ฐ ๋ํ๋๋๋ผ๋ ๋ณธ์ฐ์ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํด์ผ ํ๋ ๊ฒ์ด์์.
๊ณต์ฐ์ ๊ตฌ์ฑํ๊ณ , ๋ด๋น ๋ฐฐ์ฐ๋ฅผ ์ญ์ธํ๊ณ , ์ญํ ์ ๋ง๋ ๋ฐฐ์ฐ๋ฅผ ์ฐพ๋ ๊ฒ์ ๊ณต์ฐ ๊ธฐํ์๋ผ๋ ์ญํ ์ด ๋์์ผ ํ๋ ๊ฒ์ด์์.
์ฝ๋์์๋ ๊ณต์ฐ ๊ธฐํ์ ๊ฐ์ ๊ฒ์ ๋ง๋ค๊ณ , ๋ฐฐ์ฐ์ ๊ณต์ฐ ๊ธฐํ์์ ์ฑ ์์ ํ์คํ ๋ถ๋ฆฌํ๋ฉด ๋๋ ๊ฒ์ด์์.
๐ AppConfig
์์ Class๋ Application์ ์ค์ ๋์์ ํ์ํ ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ์ญํ ์ธ ๊ฒ์ด์์. ์ฆ, ๋ฐฐ์ฐ๋ฅผ ์ญ์ธํ๋ ์ผ์ด์ง์.
- MemberServiceImpl
- MemoryMemberRepository
- OrderServiceImpl
- FixDiscountPolicy
AppConfig๋ ์์ฑํ ๊ฐ์ฒด ์ธ์คํด์ค์ ์ฐธ์กฐ(๋ ํผ๋ฐ์ค)๋ฅผ ์์ฑ์๋ฅผ ํตํด์ ์ฃผ์ (์ฐ๊ฒฐ) ํด ์ฃผ๋ ๊ฒ์ด์์.
'MemberServiceImpl' -> 'MemoryMemberRepository'
'OrderServiceImpl' -> 'MemoryMemberRepository', 'FixDiscountPolicy'
๐ MemberServiceImpl - ์์ฑ์ ์ฃผ์
์ค๊ณ๋ฅผ ๋ณ๊ฒฝํ๋ฏ๋ก, 'MemberServiceImpl'์ 'MemoryMemberRepository'๋ฅผ ์์กดํ์ง ์๊ฒ ๋ ๊ฒ์ด์์.
๋ค๋ง, 'MemberRepository'๋ผ๋ Interface๋ง ์์กดํ๊ฒ ๋ ๊ฒ์ด์์.
'MemberServiceImpl' ์ ์ฅ์์ ์์ฑ์๋ฅผ ํตํด ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๊ฐ ๋ค์ด์ฌ์ง(์ฃผ์ ๋ ์ง)๋ ์ ์ ์๋ ๊ฒ์ด์์.
'MemberServiceImpl'์ ์์ฑ์๋ฅผ ํตํด ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ์ง๋ ์ค์ง ์ธ๋ถ(AppConfig)์์ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ด์ฃ .
'MemberServiceImpl'์ ์ด์ ๋ถํฐ ์์กด๊ด๊ณ์ ๋ํ ๊ณ ๋ฏผ์ ์ธ๋ถ์ ๋งก๊ธฐ๊ณ , ์์ ์ ์ผ์ธ ์คํ์๋ง ์ง์คํ๋ฉด ๋๋ ๊ฒ์ด์์.
๐ Class Diagram
๊ฐ์ฒด ์์ฑ๊ณผ ์ฐ๊ฒฐ์ 'AppConfig'๊ฐ ๋ด๋นํ๋ ๊ฒ์ด์์.
DIP ์์ฑ : 'MemberServiceImpl'์ 'MemberRepository'์ธ ์ถ์์๋ง ์์กดํ๋ฉด ๋๋ ๊ฒ์ด์์. ์ด์ ๊ตฌ์ฒด Class๋ฅผ ๋ชฐ๋ผ๋ ๋์!
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ : ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์ฐ๊ฒฐํ๋ ์ญํ ๊ณผ ์คํํ๋ ์ญํ ์ด ๋ช ํํ๊ฒ ๋ถ๋ฆฌ๋ ๊ฒ์ด์์.
๐ ํ์ ๊ฐ์ฒด ์ธ์คํด์ค Diagrame
'appConfig' ๊ฐ์ฒด๋ 'memoryMemberRepository' ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ๊ทธ ์ฐธ์กฐ๊ฐ์ 'memberServiceImpl'์ ์์ฑํ๋ฉด์ ์์ฑ์๋ก ์ ๋ฌํ๋ ๊ฒ์ด์์.
Client์ธ 'memberServiceImpl' ์ ์ฅ์์ ๋ณด๋ฉด ์์กด ๊ด๊ณ๋ฅผ ๋ง์น ์ธ๋ถ์์ ์ฃผ์ ํด์ฃผ๋ ๊ฒ ๊ฐ๋ค๊ณ ํ์ฌ DI(Dependency Injection) ์ฆ, ์์กด๊ด๊ณ ์ฃผ์ ํน์ ์์กด์ฑ ์ฃผ์ ์ด๋ผ๊ณ ํ๋ ๊ฒ์ด์์.
๐ OrderServiceImpl - ์์ฑ์ ์ฃผ์
ํ๋(17๋ฒ์งธ ์ค)์ ๋ณด๋ฉด ์ด์ ๋ ์ด์ OrderServiceImpl์ FixDiscountPolicy๋ฅผ ์์กดํ์ง ์๋ ๊ฒ์ด์์.
interface์ธ ์ถ์ DiscountPolicy์๋ง ์์กดํ๊ณ ์๋ต๋๋ค!
OrderServiceImpl ์ ์ฅ์์ ์์ฑ์๋ฅผ ํตํด ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๊ฐ ๋ค์ด์ฌ์ง (์ฃผ์ ๋ ์ง) ์ ์ ์๋ ๊ฒ์ด์์.
OrderServiceImpl์ ์์ฑ์๋ฅผ ํตํด ์ด๋ค ๊ตฌํ ๊ฐ์ฒด๋ฅผ ์ฃผ์ ํ ์ง๋ ์ค์ง ์ธ๋ถ(AppConfig)์์ ๊ฒฐ์ ํ๋ต๋๋ค!
์ด๋ก์จ OrderServiceImpl์๋ MemoryMemberRepository, FixDiscountPolicy ๊ฐ์ฒด์ ์์กด๊ด๊ณ๊ฐ ์ฃผ์ ๋๋ ๊ฒ์ด์์.
๐ ์ฌ์ฉ Class - MemberApp(Main())
๐ ์ฌ์ฉ Class - OrderApp(Main())
๐ Test ์ฝ๋ ์์
@BeforEach : Test Code์์ ๊ฐ Test ์คํ ์ ๋จผ์ ํธ์ถ๋๋๋ก ํ๋ ๊ฒ์ผ๋ก, Test๊ฐ N๊ฐ์ด๋ฉด N๋ฒ ์คํ
์ถ์ฒ : ์ธํ๋ฐ - ๊น์ํ ๊ฐ์ฌ๋์ ์คํ๋ง ํต์ฌ ์๋ฆฌ ๊ฐ์
์ด ๊ธ์ ๊ฐ์ ๋ด์ฉ๊ณผ ๊ฐ์ ์๋ฃ๋ฅผ ๋ฐํ์ผ๋ก '์ฃผ๋ํ๋'์ด ์ดํดํ๊ธฐ ์ฝ๊ธฐ ์ํด ์์ฑํ ๋ด์ฉ ์์ ์๋ ค๋๋ฆฝ๋๋ค.
์ฃผ๋ํ๋์ ๊ธ์ด ๋ง์์ ๋์
จ๋์? ๊ตฌ๋
๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋๊ธ ๊ทธ๋ฆฌ๊ณ ๋ฐฉ๋ช
๋ก์ ์ฃผ๋ํ๋์๊ฒ ๋ง์ ํ์ด ๋ฉ๋๋ค
'Back-End ์์ ์ค > Spring Framework' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] Ioc, DI Container (0) | 2021.10.01 |
---|---|
[Spring] AppConfig ๋ฆฌํฉํฐ๋ง (0) | 2021.09.30 |
[Spring] OCP์ DIP ๊ณ ๋ คํ๊ธฐ (4) | 2021.09.18 |
[Spring] ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง (0) | 2021.09.12 |
[Spring] ์ข์ ๊ฐ์ฒด ์งํฅ ์ค๊ณ์ 5๊ฐ์ง ์์น (SOLID) (0) | 2021.09.11 |