[Spring] ๊ฐ์ฒด ์ง€ํ–ฅ ์›๋ฆฌ ์ ์šฉ - ์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ๊ฐœ๋ฐœ

2021. 9. 29. 08:00ใ†Back-End ์ž‘์—…์‹ค/Spring Framework

728x90
๋ฐ˜์‘ํ˜•

์•ˆ๋…•ํ•˜์„ธ์š”? ์ฃผ๋‹ˆํ•˜๋ž‘์ž…๋‹ˆ๋‹ค.

์ฃผ๋‹ˆํ•˜๋ž‘์€ ์•ž์—์„œ ์ฃผ๋ฌธ, ํšŒ์›, ํ• ์ธ(๊ณ ์ • ํ• ์ธ)์— ๋Œ€ํ•ด์„œ ์ˆœ์ˆ˜ ์ž๋ฐ”๋งŒ์„ ํ™œ์šฉํ•ด ์—ด์‹ฌํžˆ ๊ณต๋ถ€๋ฅผ ํ–ˆ๋˜ ๊ฒƒ์ด์—์š”.

์ด๋ฒˆ์—๋Š” ๊น€์˜ํ•œ ๊ฐ•์‚ฌ๋‹˜๊ป˜์„œ ํ• ์ธ์—์„œ ์ •๋ฅ  ํ• ์ธ์„ ํ•˜๋Š” ์ •์ฑ…์„ ๋งŒ๋“œ๋Š” ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ๋ ค์ฃผ์…จ์–ด์š”!

ํ•จ๊ป˜ ๊ณต๋ถ€ ํ•ด ๋ณด์‹ค๊ฒŒ์š”!

 

 

๐Ÿ“‹ ๋ชฉ์ฐจ


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 ์ฝ”๋“œ ์ถ”๊ฐ€

 

RateDiscountPolicy.java

 

์ด Method๋Š” DiscountPolicy๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌํ˜„์ฒด์ด๊ณ , ๊ตฌ์ฒดํ™”๋Š” discount์ธ ๊ฒƒ์ด์—์š”.

discount์—์„œ๋Š” Member ๊ฐ์ฒด์™€ ๊ตฌ์ž…๊ฐ€๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„ Member ๋“ฑ๊ธ‰์ด VIP๋ผ๋ฉด ๊ตฌ์ž…๊ฐ€์˜ 10์„ ๊ณฑํ•œ ๋’ค ๋‚˜๋ˆ„๊ธฐ 100์„ ํ•˜์—ฌ 10% ํ• ์ธ์„ ๋ฐ›๋„๋ก ํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•˜๊ณ , VIP๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ํ• ์ธ์ด ์—†๋„๋ก ๊ตฌํ˜„ ํ•œ ๊ฒƒ์ด์—์š”.

 

         ๐Ÿ‘‰ Test ์ฝ”๋“œ

 

๋ฐ˜์‘ํ˜•

 

 

 

    ๐Ÿ“์ƒˆ๋กœ์šด ํ• ์ธ ์ •์ฑ… ์ ์šฉ๊ณผ ๋ฌธ์ œ์ 

์œ„์— ์ถ”๊ฐ€ํ•œ ์ •๋ฅ  ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉํ•˜๋ ค๋ฉด Client์ธ 'OrderServiceImpl.java'์˜ ์ฝ”๋“œ ๋‚ด์šฉ๋„ ๊ณ ์ณ์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

์ถœ์ฒ˜: ์ธํ”„๋Ÿฐ - ๊น€์˜ํ•œ ๊ฐ•์‚ฌ : ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค.

  1. ๊ฐœ๋ฐœ์ž๋Š” ์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ์ถฉ์‹คํ•˜๊ฒŒ ๋ถ„๋ฆฌํ–ˆ๋Š”๊ฐ€? Yes
  2. ๋‹คํ˜•์„ฑ๋„ ํ™œ์šฉํ•˜๊ณ , Interface์™€ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ๋ถ„๋ฆฌํ–ˆ๋Š”๊ฐ€? Yes
  3. 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๋ฒˆ ์‹คํ–‰

 

 

 

์ถœ์ฒ˜ : ์ธํ”„๋Ÿฐ - ๊น€์˜ํ•œ ๊ฐ•์‚ฌ๋‹˜์˜ ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ ๊ฐ•์˜

์ด ๊ธ€์€ ๊ฐ•์˜ ๋‚ด์šฉ๊ณผ ๊ฐ•์˜ ์ž๋ฃŒ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ '์ฃผ๋‹ˆํ•˜๋ž‘'์ด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๋‚ด์šฉ ์ž„์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

 


 

 

 

์ฃผ๋‹ˆํ•˜๋ž‘์˜ ๊ธ€์ด ๋งˆ์Œ์— ๋“œ์…จ๋‚˜์š”? ๊ตฌ๋…๊ณผ ๊ณต๊ฐ! ๊ทธ๋ฆฌ๊ณ , ๋Œ“๊ธ€ ๊ทธ๋ฆฌ๊ณ  ๋ฐฉ๋ช…๋ก์€ ์ฃผ๋‹ˆํ•˜๋ž‘์—๊ฒŒ ๋งŽ์€ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค

 

 

 

728x90
๋ฐ˜์‘ํ˜•