[Spring] OCP์™€ DIP ๊ณ ๋ คํ•˜๊ธฐ

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

728x90
๋ฐ˜์‘ํ˜•

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

์˜ค๋Š˜์€ Spring์˜ ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„์—์„œ OCP์›์น™๊ณผ DIP๋ฅผ ์ข€ ๋” ๊ณต๋ถ€ ํ•ด ๋ณด๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ด ๋‚ด์šฉ์€ ์ธํ”„๋Ÿฐ - ๊น€์˜ํ•œ ๊ฐ•์‚ฌ๋‹˜์˜ ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ๊ณต๋ถ€ํ•˜๋ฉด์„œ ์ •๋ฆฌ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด ๊ฐ•์˜์— ๋Œ€ํ•œ Code๋Š” ์—ฌ๊ธฐ์— ์ค€๋น„ ํ•ด ๋‘˜๊ฒŒ์š”!


 

๐Ÿ“‹ ๋ชฉ์ฐจ


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

 

 

 


 

 

๐Ÿ“Œ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์„ค๊ณ„


  1. ํšŒ์›
    • ํšŒ์›์„ ๊ฐ€์ž…ํ•˜๊ณ , ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํšŒ์›์€ ์ผ๋ฐ˜๊ณผ VIP ๋‘ ๊ฐ€์ง€ ๋“ฑ๊ธ‰์ด ์žˆ๋‹ค.
    • ํšŒ์› ๋ฐ์ดํ„ฐ๋Š” ์ž์ฒด DB๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ณ , ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ์–ด๋–ค DB๋ฅผ ์“ธ์ง€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ Data๋ฅผ ์ฒ˜๋ฆฌํ• ์ง€ ์ •ํ•ด์ง€์ง€ ์•Š์•˜๋‹ค.
  2. ์ฃผ๋ฌธ๊ณผ ํ• ์ธ ์ •์ฑ…
    • ํšŒ์›์€ ์ƒํ’ˆ์„ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํšŒ์› ๋“ฑ๊ธ‰์— ๋”ฐ๋ผ ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ• ์ธ ์ •์ฑ…์€ ๋ชจ๋“  VIP๋Š” 1,000์›์„ ํ• ์ธ ํ•ด ์ฃผ๋Š” ๊ณ ์ • ๊ธˆ์•ก ํ• ์ธ์„ ์ ์šฉํ•ด๋‹ฌ๋ผ๊ณ , ์š”์ฒญ ๋ฐ›์•˜๋‹ค.
      (๋‹จ, ๋‚˜์ค‘์— ์ •์ฑ…์€ ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.)
    • ํ• ์ธ ์ •์ฑ…์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ํšŒ์‚ฌ์˜ ๊ธฐ๋ณธ ํ• ์ธ ์ •์ฑ…์„ ์•„์ง ์ •ํ•˜์ง€ ๋ชปํ–ˆ๊ณ , ์˜คํ”ˆ ์ง์ „๊นŒ์ง€ ๊ณ ๋ฏผ์„ ๋ฏธ๋ฃจ๊ณ  ์‹ถ๋‹ค. ์ตœ์•…์˜ ๊ฒฝ์šฐ ํ• ์ธ์„ ์ ์šฉํ•˜์ง€ ์•Š์„์ˆ˜๋„ ์žˆ๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ๋‚ด์šฉ์œผ๋กœ ์ฝ”๋”ฉ์„ ํ•˜๋ฉด์„œ ์ด๋ฒˆ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ ํ•ด ๋ณด๋„๋ก ํ• ๊ฒŒ์š”. ๋จผ์ €, DB๋„ ์ •ํ•ด์ง€์ง€ ์•Š์•˜๊ณ , ํ• ์ธ ์ •์ฑ… ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์˜คํ”ˆ ์ง์ „๊นŒ์ง€ ๋ฏธ๋ฃจ๊ณ  ์‹ถ๋‹ค๊ณ  ํ•ด์š”! ๊ทธ๋Ÿผ ๋„๋Œ€์ฒด ๊ฐœ๋ฐœ์„ ํ•˜๋ผ๋Š” ๊ฑธ๊นŒ์š”? ๋ง๋ผ๋Š”๊ฑธ๊นŒ์š”?

๋ฐ”๋กœ ์ด ๋•Œ, ๊ฐ์ฒด ์ง€ํ–ฅ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•œ๋‹ค๋ฉด ๊ทธ๋ฆฌ๊ณ , DIP์™€ OCP ์›์น™์„ ์ง€ํ‚จ๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋Š” ๊ฑฑ์ • ๊ฑฐ๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ž๋‹ˆ๋‹ค!

 

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Interface๋ฅผ ๋งŒ๋“ค๊ณ , ๊ตฌํ˜„์ฒด๋ฅผ ์–ธ์ œ๋“ ์ง€ ๊ฐˆ์•„๋ผ์šธ ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋ฅผ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

Interface๋Š” ์—ญํ• ! ๊ตฌํ˜„์ฒด๋Š” ๊ทธ ์—ญํ• ์„ ๊ตฌํ˜„ ํ•˜๋Š” ๊ฒƒ!

 

๐Ÿ’ก ์ฐธ๊ณ ๋กœ ์ด๋ฒˆ ๊ณต๋ถ€์—์„œ๋Š” Spring์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , ์˜ค๋กœ์ง€ ์ˆœ์ˆ˜ ์ž๋ฐ”๋กœ๋งŒ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ์ด์—์š”!

 

 

    ๐Ÿ“ํšŒ์› ๋„๋ฉ”์ธ ์„ค๊ณ„

  • ํšŒ์› ๋„๋ฉ”์ธ ์š”๊ตฌ์‚ฌํ•ญ
    • ํšŒ์›์„ ๊ฐ€์ž…ํ•˜๊ณ , ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํšŒ์›์€ ์ผ๋ฐ˜๊ณผ VIP ๋‘ ๊ฐ€์ง€ ๋“ฑ๊ธ‰์œผ๋กœ ๋‚˜๋‰œ๋‹ค.
    • ํšŒ์› ๋ฐ์ดํ„ฐ๋Š” ์ž์ฒด DB๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ณ , ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

         ๐Ÿ‘‰ ํšŒ์› ๋„๋ฉ”์ธ ํ˜‘๋ ฅ ๊ด€๊ณ„

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

 

 

         ๐Ÿ‘‰ ํšŒ์› ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

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

 

 

         ๐Ÿ‘‰ ํšŒ์› ๊ฐ์ฒด ๋‹ค์ด์–ด๊ทธ๋žจ

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

 

ํšŒ์› ์„œ๋น„์Šค ๊ฐ์ฒด ์ด๋ฆ„ : MemberServiceImpl

์—ฌ๊ธฐ์„œ Impl์€ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๊ตฌํ˜„์ฒด๊ฐ€ ํ•˜๋‚˜์ผ ๋•Œ๋Š” ๊ด€๋ก€์ƒ ํด๋ž˜์Šค๋ช…์— ์ด๊ฒƒ์„ ๋ถ™ํ˜€์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

    ๐Ÿ“ํšŒ์› ๋„๋ฉ”์ธ ๊ฐœ๋ฐœ

         ๐Ÿ‘‰ ํšŒ์› Entity

  • ํšŒ์› ๋“ฑ๊ธ‰

 

๋ฐ˜์‘ํ˜•

 

  • ํšŒ์› Entity

 

 

 

         ๐Ÿ‘‰ ํšŒ์› ์ €์žฅ์†Œ

  • ํšŒ์› ์ €์žฅ์†Œ ์ธํ„ฐํŽ˜์ด์Šค

 

 

  • Memory ํšŒ์› ์ €์žฅ์†Œ ๊ตฌํ˜„์ฒด

 

DB์— ๋Œ€ํ•ด์„œ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ• ์ง€ ์•„์ง ๊ฒฐ์ • ๋˜์ง€ ์•Š์•˜๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ด๋ ‡๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ๊ฐœ๋ฐœ์€ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๊ทธ๊ฑด ๋‹จ์ˆœํ•˜๊ฒŒ Memory๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํšŒ์› ์ €์žฅ์†Œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๐Ÿ’ก์ฐธ๊ณ :
[HashMap]์€ ๋™์‹œ์„ฑ Issue๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฐ๊ฒฝ์šฐ [CocurrentHashMap]์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋™์‹œ์„ฑ Issue๋ž€?
๋จผ์ € ์ด๊ฒƒ์„ ์ด์•ผ๊ธฐ ์ „์— Thread(์Šค๋ ˆ๋“œ)๋ฅผ ์ดํ•ดํ•ด์•ผ ํ•˜๊ณ , ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.

ํ”„๋กœ์„ธ์Šค๋ž€? ์ผ๋ฐ˜์ ์œผ๋กœ ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ ํ•œ๋‹ค. ์ด ํ”„๋กœ๊ทธ๋žจ์ด ์‹ค์ œ๋กœ ์‹คํ–‰๋˜์–ด, Memory๋‚˜ CPU์™€ ๊ฐ™์€ ์ž์›์„ ํ• ๋‹น ๋ฐ›์œผ๋ฉด ์ด๊ฒƒ์„ ํ”„๋กœ์„ธ์Šค๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

์Šค๋ ˆ๋“œ๋ž€? ์œ„์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ํ•˜๋‚˜์˜ ๋‹จ์œ„๋ฅผ ๋งํ•œ๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž‘๋™ํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

์Šค์„ธ๋“œ๋Š” ์ž‘์—…์˜ ํ•œ ๋‹จ์œ„๋กœ ํ”„๋กœ์„ธ์Šค๋Š” ๋…์ž์ ์ธ Memory๋ฅผ ํ• ๋‹น ๋ฐ›์•„ ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๋ผ๋ฆฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋กœ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์นจ๋ฒ”ํ•˜์ง€ ๋ชปํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์— ์žˆ๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋“ค์€ ์„œ๋กœ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด๋ถ€์— ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ์ž์›์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ™์€ ์ž์›์„ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ธํ•ด ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ผ์„ ๊ฐ™์€ ์ž์›์„ ๋‘๊ณ  ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ์ด ๋•Œ๋ฌธ์— ๊ณง ๋ณ‘๋ ฌ์„ฑ์˜ ํ–ฅ์ƒ์„ ๋„๋ชจํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๋‹จ์ ๋„ ์กด์žฌํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ํ•˜๋‚˜์˜ ์ž์›์„ ๊ณต์œ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ž์›์„ ๋‘๊ณ  ๋™์‹œ์„ฑ ๋ฌธ์ œ, ๋ฐ๋“œ๋ฝ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋“ค์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฌธ์ œ ์—†๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

 

 

         ๐Ÿ‘‰ ํšŒ์› ์„œ๋น„์Šค

  • ํšŒ์› ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค

 

 

  • ํšŒ์› ์„œ๋น„์Šค ๊ตฌํ˜„์ฒด

 

์œ„์™€ ๊ฐ™์ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์„๊นŒ์š”?

๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ ๋‹ค๋ฅธ ์ €์žฅ์†Œ๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ OCP ์›์น™๊ณผ DIP๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด์š”.

OCP์™€ DIP์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋ชจ๋ฅด์‹ ๋‹ค๋ฉด ์—ฌ๊ธฐ์— ๊ด€์‹ฌ์„ ์ฃผ์„ธ์š”!

์œ„ ์ฝ”๋“œ 9๋ฒˆ์งธ ์ค„์„ ๋ณด๋ฉด ์˜์กด๊ด€๊ณ„๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌํ˜„์ฒด๊นŒ์ง€ ๋ชจ๋‘ ์˜์กดํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์•ž์—์„œ๋Š” MemberRepository๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์˜์กดํ•˜๋‚˜, ๋’ค์—์„œ๋Š” new๋ฅผ ํ†ตํ•ด MemoryMemberRepository๋ฅผ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ์ด๊ฒŒ ๋ฐ”๋กœ ๋ฌธ์ œ์ธ ๊ฒƒ์ด์—์š”!

 

         ๐Ÿ‘‰ ํšŒ์› ๋„๋ฉ”์ธ - ํšŒ์› ๊ฐ€์ž… Test

 

 

์œ„์— Test Code๋Š” JUnit์„ ํ†ตํ•œ Test์ธ ๊ฒƒ์ด์—์š”.

 

 

 

    ๐Ÿ“์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ ์„ค๊ณ„

  1. ์ฃผ๋ฌธ๊ณผ ํ• ์ธ ์ •์ฑ…
    • ํšŒ์›์€ ์ƒํ’ˆ์„ ์ฃผ๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํšŒ์› ๋“ฑ๊ธ‰์— ๋”ฐ๋ผ ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ• ์ธ ์ •์ฑ…์œผ๋กœ ๋ชจ๋“  VIP๋Š” 1,000์›์„ ํ• ์ธํ•ด์ฃผ๋Š” ๊ณ ์ • ๊ธˆ์•ก ํ• ์ธ์„ ์ ์šฉํ•ด๋‹ฌ๋ผ๊ณ  ํ•œ๋‹ค. (๋‚˜์ค‘์— ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ)
    • ํ• ์ธ ์ •์ฑ…์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ํšŒ์‚ฌ์˜ ๊ธฐ๋ณธ ํ• ์ธ ์ •์ฑ…์„ ์•„์ง  ์ •ํ–ˆ๊ณ , ์˜คํ”ˆ ์ง์ „๊นŒ์ง€ ๊ณ ๋ฏผ์„ ๋ฏธ๋ฃจ๊ณ  ์‹ถ๋‹ค.
      ์ตœ์•…์˜ ๊ฒฝ์šฐ ํ• ์ธ์„ ์ ์šฉํ•˜์ง€ ์•Š์„์ˆ˜๋„ ์žˆ๋‹ค.

 

 

 

         ๐Ÿ‘‰ ์ฃผ๋ฌธ ๋„๋ฉ”์ธ ํ˜‘๋ ฅ, ์—ญํ•  ์ฑ…์ž„

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

์œ„์˜ ๊ทธ๋ฆผ์—์„œ Client๋Š” Spring MVC์˜ ๊ฒฝ์šฐ์—” Controller๋กœ ๋ณผ ์ˆ˜ ์žˆ๊ณ , JAVA์˜ ๊ฒฝ์šฐ Main()๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

  1. ์ฃผ๋ฌธ ์ƒ์„ฑ : Client๋Š” ์ฃผ๋ฌธ ์„œ๋น„์Šค์— ์ฃผ๋ฌธ ์ƒ์„ฑ์„ ์š”์ฒญํ•œ๋‹ค.
  2. ํšŒ์› ์กฐํšŒ : ํ• ์ธ์„ ์œ„ํ•ด์„œ๋Š” ํšŒ์› ๋“ฑ๊ธ‰์ด ํ•„์š”ํ•˜๋ฏ€๋กœ, ์ฃผ๋ฌธ ์„œ๋น„์Šค๋Š” ํšŒ์› ์ €์žฅ์†Œ์—์„œ ํšŒ์›์„ ์ €์žฅํ•œ๋‹ค.
  3. ํ• ์ธ ์ ์šฉ : ์ฃผ๋ฌธ ์„œ๋น„์Šค๋Š” ํšŒ์› ๋“ฑ๊ธ‰์— ๋”ฐ๋ฅธ ํ• ์ธ ์—ฌ๋ถ€๋ฅผ ํ• ์ธ ์ •์ฑ…์— ์œ„์ž„ํ•œ๋‹ค.
  4. ์ฃผ๋ฌธ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜ : ์ฃผ๋ฌธ ์„œ๋น„์Šค๋Š” ํ• ์ธ ๊ฒฐ๊ณผ๋ฅผ ํฌํ•จํ•œ ์ฃผ๋ฌธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

 

         ๐Ÿ‘‰ ์ฃผ๋ฌธ ๋„๋ฉ”์ธ ์ „์ฒด

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

 

 

์—ญํ• ๊ณผ ๊ตฌํ˜„์„ ๋ถ„๋ฆฌํ•ด์„œ ์ž์œ ๋กญ๊ฒŒ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ž˜์•ผ ํšŒ์› ์ €์žฅ์†Œ๋Š” ๋ฌผ๋ก ์ด๊ณ , ํ• ์ธ ์ •์ฑ…๋„ ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

 

 

         ๐Ÿ‘‰ ์ฃผ๋ฌธ ๋„๋ฉ”์ธ ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

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

 

 

 

 

         ๐Ÿ‘‰ ์ฃผ๋ฌธ ๋„๋ฉ”์ธ ๊ฐ์ฒด ๋‹ค์ด์–ด๊ทธ๋žจ1

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

 

ํšŒ์›์„ Memory์—์„œ ์กฐํšŒํ•˜๊ณ , ์ •์•ก ํ• ์ธ ์ •์ฑ…(๊ณ ์ • ๊ธˆ์•ก)์„ ์ง€์›ํ•ด๋„ ์ฃผ๋ฌธ ์„œ๋น„์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

๊ฒฐ๊ตญ ์—ญํ• ๋“ค์˜ ํ˜‘๋ ฅ ๊ด€๊ณ„๋ฅผ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ ๊ฒƒ์ด์—์š”. ์ด๊ฒƒ์ด ๋ฌด์Šจ ๋ง์ด๋ƒ๋ฉด ์ €์žฅ์†Œ๋ฅผ Memory์—์„œ DB๋กœ ๋ณ€๊ฒฝํ•˜๊ณ , ํ• ์ธ ์ •์ฑ…์„ ์ •์•ก์—์„œ ์ •๋ฅ ๋กœ ๋ณ€๊ฒฝํ•ด๋„ ์ฃผ๋ฌธ ์„œ๋น„์Šค ๊ตฌํ˜„์ฒด๋ฅผ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ด์•ผ๊ธฐ์ธ ๊ฒƒ์ด์—์š”.

 

 

         ๐Ÿ‘‰ ์ฃผ๋ฌธ ๋„๋ฉ”์ธ ๊ฐ์ฒด ๋‹ค์ด์–ด๊ทธ๋žจ2

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

 

 

ํšŒ์›์„ Memory๊ฐ€ ์•„๋‹Œ ์‹ค์ œ DB์—์„œ ์กฐํšŒํ•˜๊ณ , ์ •๋ฅ  ํ• ์ธ ์ •์ฑ…(์ฃผ๋ฌธ ๊ทธ๋žจ์— ๋”ฐ๋ผ % ํ• ์ธ)์œผ๋กœ ๋ฐฉ์‹์„ ๋ฐ”๊พธ์–ด๋„ ์ฃผ๋ฌธ ์„œ๋น„์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒƒ์ด์—์š”. ๋‹ค์‹œ ํ•œ๋ฒˆ ์–ธ๊ธ‰ํ•˜์ง€๋งŒ ํ˜‘๋ ฅ ๊ด€๊ณ„๋ฅผ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”!

 

 

 

 

    ๐Ÿ“์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ ๊ฐœ๋ฐœ

         ๐Ÿ‘‰ ํ• ์ธ ์ •์ฑ… ์ธํ„ฐํŽ˜์ด์Šค

 

 

         ๐Ÿ‘‰ ์ •์•ก ํ• ์ธ ์ •์ฑ… ๊ตฌํ˜„์ฒด

 

 

์œ„์˜ 13๋ฒˆ์งธ ์ค„ if๋ฌธ์„ ๋ถ„์„ํ•ด ๋ณด๋ฉด ํšŒ์›์˜ ๋“ฑ๊ธ‰์ด VIP๋ผ๋ฉด 'discountFixAmount'๋ณ€์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ 1000์›์„ ํ• ์ธ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๊ณ , ์•„๋‹ˆ๋ฉด ํ• ์ธ์ด ์—†๊ฒŒ '0'์„ ๋ฐ˜ํ™˜ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

 

         ๐Ÿ‘‰ ์ฃผ๋ฌธ Entity

package hello.core.order;

public class Order {
    private Long memberId;
    private String itemName;
    private int itemPrice;
    private int discountPrice;

    public int calculatePrice() {
        return itemPrice - discountPrice;
    }

    public Order(Long memberId, String itemName, int itemPrice, int discountPrice) {
        this.memberId = memberId;
        this.itemName = itemName;
        this.itemPrice = itemPrice;
        this.discountPrice = discountPrice;
    }

    public Long getMemberId() {
        return memberId;
    }

    public void setMemberId(Long memberId) {
        this.memberId = memberId;
    }

    public String getItemName() {
        return itemName;
    }

    public void setItemName(String itemName) {
        this.itemName = itemName;
    }

    public int getItemPrice() {
        return itemPrice;
    }

    public void setItemPrice(int itemPrice) {
        this.itemPrice = itemPrice;
    }

    public int getDiscountPrice() {
        return discountPrice;
    }

    public void setDiscountPrice(int discountPrice) {
        this.discountPrice = discountPrice;
    }

    @Override
    public String toString() {
        return "Order{" +
                "memberId=" + memberId +
                ", itemName='" + itemName + '\'' +
                ", itemPrice=" + itemPrice +
                ", discountPrice=" + discountPrice +
                '}';
    }
}

 

 

 

 

         ๐Ÿ‘‰ ์ฃผ๋ฌธ ์„œ๋น„์Šค ๊ตฌํ˜„์ฒด

 

order ์„œ๋น„์Šค์— ์ž…์žฅ์—์„œ ํ• ์ธ์— ๋Œ€ํ•ด์„œ๋Š” ๋ชฐ๋ผ๋„ ๋˜๋Š” ๊ฒƒ์ด์—์š”. '์•Œ์•„์„œ ๊ณ„์‚ฐํ•˜๊ณ , ๋‚˜ํ•œํ…Œ ๊ฒฐ๊ณผ๋งŒ ์ค˜!' ๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๊ฒƒ์ด์—์š”.

์ฃผ๋ฌธ ์ƒ์„ฑ ์š”์ฒญ์ด ์˜ค๋ฉด, ํšŒ์› ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ณ  (16๋ฒˆ์งธ ์ค„), ๊ณ ์ • ๊ธˆ์•ก ํ• ์ธ ์ •์ฑ…์„ ์ ์šฉ(18๋ฒˆ์งธ ์ค„)ํ•œ ๋’ค ์ฃผ๋ฌธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด์—์š”. 

๋ฉ”๋ชจ๋ฆฌ ํšŒ์› ๋ ˆํฌ์ง€ํ† ๋ฆฌ์™€ ๊ณ ์ • ๊ธˆ์•ก ํ• ์ธ ์ •์ฑ…์„ ๊ตฌํ˜„์ฒด๋กœ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์ง€์š”!

 

 

 

 

    ๐Ÿ“์ฃผ๋ฌธ๊ณผ ํ• ์ธ ๋„๋ฉ”์ธ Test

         ๐Ÿ‘‰ ์ฃผ๋ฌธ๊ณผ ํ• ์ธ ์ •์ฑ… Test

 

 

 

์ •์ƒ์ ์œผ๋กœ ์ž˜ ์‹คํ–‰ ๋˜๋„ค์š”!

 

 


 

 

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

 

728x90
๋ฐ˜์‘ํ˜•