[Spring] ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ•

2021. 10. 7. 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

 

 

๐Ÿ“Œ ๋‹ค์–‘ํ•œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ•


์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์€ ํฌ๊ฒŒ 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์ฒซ์งธ. ์ƒ์„ฑ์ž ์ฃผ์ž…

๋‘˜์งธ. Setter ์ฃผ์ž…

์…‹์งธ. Field ์ฃผ์ž…

๋„ท์งธ. ์ผ๋ฐ˜ Method ์ฃผ์ž…

 

    ๐Ÿ“ ์ƒ์„ฑ์ž ์ฃผ์ž…

์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

ํŠน์ง•์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ์ƒ์„ฑ์ž ํ˜ธ์ถœ์‹œ์ ์— ๋”ฑ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋ฉฐ, ๋ถˆ๋ณ€ ํ˜น์€ ํ•„์ˆ˜ ์˜์กด๊ด€๊ณ„์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ต๋‹ˆ๋‹ค.

 

 

์œ„์™€ ๊ฐ™์ด ์ƒ์„ฑ์ž๊ฐ€ ํ•œ ๊ฐœ๋งŒ ์กด์žฌํ•œ๋‹ค๋ฉด @Autowired๋Š” ์ƒ๋žต ๊ฐ€๋Šฅํ•˜๋‹ต๋‹ˆ๋‹ค! ์ฐธ๊ณ ๋กœ ์ด๊ฑด Spring Bean์—๋งŒ ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

    ๐Ÿ“ Setter ์ฃผ์ž…

์ˆ˜์ •์ž ์ฃผ์ž…์ด๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ˆ˜์ •์ž๋ผ๋Š” ๋‹จ์–ด๋Š” ๋“ค์–ด๋ณธ ์ ์ด ์—†๋Š”๊ฒƒ์ด์—์š”.

Setter์ฃผ์ž…์˜ ํŠน์ง•์€ ์„ ํƒ ํ˜น์€ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์˜์กด ๊ด€๊ณ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ณ , Java Bean Property ๊ทœ์•ฝ์˜ Setter Method ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

๐Ÿ’ก ์ฐธ๊ณ  :
1. @Autowired์˜ ๊ธฐ๋ณธ ๋™์ž‘์€ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์œผ๋ฉด Exception์„ ํ„ฐํŠธ๋ฆฐ๋‹ค.
    ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์–ด๋„ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” @Autowired(required = false)๋กœ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

2. Java Property, Java์—์„œ๋Š” ์˜›๋‚ ๋ถ€ํ„ฐ Filed์˜ ๊ฐ’์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ , Setter์™€ Getter๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„
   ์ฝ๊ฑฐ๋‚˜, ์ˆ˜์ •ํ•˜๋Š” ๊ทœ์น™์„ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ์ด๊ฒƒ์„ Java Bean Property ๊ทœ์•ฝ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

 

 

 

 

    ๐Ÿ“ Field ์ฃผ์ž…

ํ•„๋“œ๋ฅผ ํ†ตํ•ด์„œ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์„ ํ•„๋“œ ์ฃผ์ž…์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์ด ๋ฐฉ์‹์˜ ํŠน์ง•์€ Code๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜์ง€๋งŒ, ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— Test ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ํž˜๋“ค๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

๋˜ํ•œ, DI Framwork๊ฐ€ ์—†๋‹ค๋ฉด ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋˜๋„๋ก ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์€ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ์ด์—์š”.

Application์˜ ์‹ค์ œ Code๊ณผ ๊ด€๊ณ„ ์—†๋Š” Test Code

Spring Configuration์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” @Configuration ๊ฐ™์€ ๊ณณ์—์„œ๋งŒ ํŠน๋ณ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹์ด๋ž๋‹ˆ๋‹ค.

 

 

 

๐Ÿ’ก ์ฐธ๊ณ  :

1. ์ˆœ์ˆ˜ Java Test Code์—๋Š” ๋‹น์—ฐํžˆ @Autowired๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. @SpringBootTest์ฒ˜๋Ÿผ
    Spring Container๋ฅผ Test์— ํ†ตํ•ฉํ•œ ๊ฒฝ์šฐ์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ


2. ์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด @Bean ์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜์— ์˜์กด๊ด€๊ณ„๋Š” ์ž๋™์œผ๋กœ ์ฃผ์ž…. ์ˆ˜๋™ ๋“ฑ๋ก ์‹œ ์ž๋™ ๋“ฑ๋ก๋œ Bean์˜
    ์˜์กด ๊ด€๊ณ„๊ฐ€ ํ•„์š”ํ•  ๋•Œ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ
 

 

 

 

 

    ๐Ÿ“ ์‚ฌ์šฉ์ž ์ •์˜(์ผ๋ฐ˜) Method ์ฃผ์ž…

์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“  Method๋ฅผ ํ†ตํ•ด ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ธ ๊ฒƒ์ด์—์š”.

ํŠน์ง•์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ Field๋ฅผ ์ฃผ์ž… ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•ด์š”.

 

 

 

๐Ÿ’ก ์ฐธ๊ณ  :

์˜์กด ๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž…์€ Spring Container๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” Spring Bean์ด์–ด์•ผ ๋™์ž‘
Spring Bean์ด ์•„๋‹Œ Class์—์„œ @Autowired Code๋ฅผ ์ ์šฉํ•ด๋„ ์•„๋ฌด ๊ธฐ๋Šฅ๋„ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ

 

 

 

 

๐Ÿ“Œ Option ์ฒ˜๋ฆฌ


์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•  Bean์ด ์—†๋‹ค๊ณ  ํ•ด๋„ ๋™์ž‘ ์‹œํ‚ค๊ณ  ์‹ถ์„ ๋•Œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋Ÿฐ๋ฐ, @Autowired๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด required Option์˜ Default Value๊ฐ€ true๋กœ ๋˜์–ด ์žˆ์–ด์„œ ์ž๋™ ์ฃผ์ž… ๋Œ€์ƒ์ด ์—†์œผ๋ฉด Exception์ด ํ„ฐ์ง€๋Š” ๊ฒƒ์ด์—์š”.

 

์ž๋™ ์ฃผ์ž… ๋Œ€์ƒ์„ Option์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ต๋‹ˆ๋‹ค.

  1. @Autowired(required=false) : ์˜์กด ๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์„ ๊ฒฝ์šฐ Setter ์ž์ฒด๊ฐ€ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.
  2. org.springframwork.lang.@Nullable : ์ž๋™ ์ฃผ์ž… ๋Œ€์ƒ์ด ์—†๋‹ค๋ฉด null์ด ์ž…๋ ฅ๋œ๋‹ค.
  3. Optional<> : ์ž๋™ ์ฃผ์ž… ๋Œ€์ƒ์ด ์—†์œผ๋ฉด Optional.empty๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค.

 

 

 

์œ„์—์„œ ์‚ฌ์šฉํ•œ Member Instance๋Š” Spring Bean์ด ์•„๋‹Œ ๊ฒƒ์ด์—์š”.

๋”ฐ๋ผ์„œ setNoBean1()์€ @Autowired(requred=false)๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด Method ์ž์ฒด๊ฐ€ ์•„์˜ˆ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ด์—์š”.

 

 

๐Ÿ“– Test ๊ฒฐ๊ณผ

 

 

 

 

๐Ÿ’ก ์ฐธ๊ณ  :

@Nullable, Optional์€ Spring ์ „๋ฐ˜์— ๊ฑธ์ณ ์ง€์›.
์ด๊ฒƒ์€ ์ƒ์„ฑ์ž ์ž๋™ ์ฃผ์ž…์—์„œ ํŠน์ • Field์—๋งŒ ์‚ฌ์šฉ๋„ ๊ฐ€๋Šฅ

 

๐Ÿ‘จ‍๐Ÿซ ๊น€์˜ํ•œ ๊ฐ•์‚ฌ๋‹˜์˜ ์กฐ์–ธ

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์„ ํƒํ•˜๋ผ!

๊ณผ๊ฑฐ Setter ์ฃผ์ž…๊ณผ Field ์ฃผ์ž…์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋‹ค๋งŒ, ์ตœ๊ทผ์—๋Š” Spring์„ ํฌํ•จํ•œ DI Framwork ๋Œ€๋ถ€๋ถ„์ด ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅํ•œ๋‹ค. ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ๋ถˆ๋ณ€์ด๋ฉฐ, ์„ธ๋ถ€ ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

์ฒซ์งธ : ๋Œ€๋ถ€๋ถ„ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์€ ํ•œ๋ฒˆ ์‹คํ–‰๋˜๋ฉด Application ์ข…๋ฃŒ ์‹œ์ ๊นŒ์ง€ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•  ์ผ์ด ์—†์œผ๋ฉฐ,                 ์˜คํžˆ๋ ค ๋Œ€๋ถ€๋ถ„ ์˜์กด๊ด€๊ณ„๋Š” Application์ด ์ข…๋ฃŒ ๋ ๋•Œ๊นŒ์ง€ ๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด 99%์ •๋„ ๋œ๋‹ค.
         ์ฆ‰, ๋ถˆ๋ณ€ํ•ด์•ผ ํ•œ๋‹ค.

๋‘˜์งธ : Setter ์ฃผ์ž… ์‚ฌ์šฉ ์‹œ setXxx Method๋ฅผ public์œผ๋กœ ์—ด์–ด๋‘์–ด์•ผ ํ•˜๋ฉฐ, ์ด๋Š” ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ํ˜‘์—…ํ•  ๋•Œ๋‚˜,
         ๋‹ค๋ฅธ Client๊ฐ€ ์›์น˜ ์•Š๋Š” ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„ํ—˜ํ•˜๋‹ค.

์…‹์งธ : ๋ˆ„๊ตฐ๊ฐ€ ์‹ค์ˆ˜๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ๊ณ , ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ๋˜๋Š” Method๋ฅผ ์—ด์–ด๋‘๋Š” ๊ฒƒ์€ ์ข‹์€ ์„ค๊ณ„๊ฐ€ ์•„๋‹ˆ๋‹ค.

๋„ท์งธ : ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๋”ฑ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ, ์ด ํ›„ ํ˜ธ์ถœ๋˜๋Š” ์ผ์ด ์—†๊ธฐ์— ๋ถˆ๋ณ€ํ•˜๊ฒŒ
        ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค. 


 

 

    ๐Ÿ“ ๋ˆ„๋ฝ

Framwork ์—†์ด ์ˆœ์ˆ˜ Java Code๋ฅผ ๋‹จ์œ„ Test ํ•˜๋Š” ๊ฒฝ์šฐ ์•„๋ž˜์™€ ๊ฐ™์ด Setter ์˜์กด ๊ด€๊ณ„์ธ ๊ฒฝ์šฐ๋ผ๋ฉด ์–ด๋–จ๊นŒ์š”?

 

 

@Autowired๊ฐ€ framwork ์•ˆ์—์„œ ๋™์ž‘ํ•  ๋• ์˜์กด๊ด€๊ณ„๊ฐ€ ์—†์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋‚˜, ์•„๋ž˜ Code๋Š” Framwork ์—†์ด ์ˆœ์ˆ˜ Java Code๋กœ๋งŒ ๋‹จ์œ„ Test๋ฅผ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

์œ„์˜ Test ๊ฒฐ๊ณผ๋Š” ์–ด๋–ป๊ฒŒ ๋‚˜์™”์„๊นŒ์š”? ๋ฐ”๋กœ NPE(Null Point Exception)์ด ํ„ฐ์ง€๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ ์ด์œ ๋Š” memberRepository, discountPolicy ๋ชจ๋‘ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์ด ๋ˆ„๋ฝ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋ž๋‹ˆ๋‹ค.

 

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž… Data๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์„ ๋•Œ, Compile Error๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๊ทธ๋ฆฌ๊ณ , IDE์—์„œ ๋ฐ”๋กœ ์–ด๋–ค ๊ฐ’์„ ํ•„์ˆ˜๋กœ ์ฃผ์ž…ํ•ด์•ผ ํ•˜๋Š”์ง€ ์•Œ๋ ค์ค€๋‹ต๋‹ˆ๋‹ค!

 

 

    ๐Ÿ“ Final Keyword

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด Field์— final Keyword๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ž˜์„œ ์ƒ์„ฑ์ž์—์„œ ํ˜น์‹œ๋ผ๋„ ๊ฐ’์ด ์„ค์ •๋˜์ง€ ์•Š๋Š” Error๋ฅผ Compile ์‹œ์ ์—์„œ ๋ง‰์•„์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

 

 

์ƒ์„ฑ์ž Body๋ฅผ ์ž์„ธํžˆ ๋ณด๋ฉด ํ•„์ˆ˜ Field์ธ discountPolicy์— ๊ฐ’์„ ์„ค์ •ํ•ด์ฃผ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์ด ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด์—์š”.

 

 

Compile Error๋Š” ์‚ฌ๋ž‘์ด๊ณ , ์„ ๋ฐฐ ๊ฐœ๋ฐœ์ž๋“ค์— ๋ฐฐ๋ ค์ธ ๊ฒƒ์ด์—์š”.

 

๐Ÿ’ก ์ฐธ๊ณ  :

Setter ์ฃผ์ž…์„ ํฌํ•จ ๋‚˜๋จธ์ง€ ์ฃผ์ž… ๋ฐฉ์‹์€ ๋ชจ๋‘ ์ƒ์„ฑ์ž ์ดํ›„์— ํ˜ธ์ถœ๋œ๋‹ค.
๋•Œ๋ฌธ์— Field์— final Keyword๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
์˜ค์ง ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์—์„œ๋งŒ final Keyword๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์ •๋ฆฌํ•˜์ž๋ฉด

์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์ง€๋งŒ, Framwork๋ฅผ ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์ˆœ์ˆ˜ Java์˜ ํŠน์ง•์„ ์ž˜ ์‚ด๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ธ ๊ฒƒ์ด์—์š”.

๊ธฐ๋ณธ์œผ๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๊ณ , ํ•„์ˆ˜ ๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ Setter ์ฃผ์ž… ๋ฐฉ์‹์„ ์ฐจ์„ ์ฑ…์œผ๋กœ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. ์ฆ‰, ๋‘˜ ๋‹ค ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด์ง€์š”.

ํ•ญ์ƒ ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ๊ทธ๋ฆฌ๊ณ , ๊ฐ€๋” ์ฐจ์„ ์ฑ…์ด ํ•„์š”ํ•˜๋‹ค๋ฉด Setter ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ต๋‹ˆ๋‹ค.

Field ์ฃผ์ž…์€ ๊ทธ๋ƒฅ ์ด๋Ÿฐ๊ฒŒ ์žˆ๊ตฌ๋‚˜ ์ •๋„๋งŒ ์•Œ๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

๋ฐ˜์‘ํ˜•

 

๐Ÿ“Œ Lombok๊ณผ ์ตœ์‹  Trand


๊ฐ•์‚ฌ๋‹˜๊ป˜์„œ๋Š” ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด ๋Œ€๋ถ€๋ถ„ ๋‹ค ๋ถˆ๋ณ€ ์‚ฌํ•ญ์ด๊ณ , ๊ทธ๋ž˜์„œ Field์— final Keyword๋ฅผ ๋ถ™์ด๊ฒŒ ๋œ๋‹ค๊ณ  ํ•˜์…จ์–ด์š”.

๊ทธ๋Ÿฐ๋ฐ, ์ƒ์„ฑ์ž๋„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ , ์ฃผ์ž… ๋ฐ›์€ ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋Š” Code๋„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ , ๋„˜๋‚˜ ํ• ๊ฒŒ ๋งŽ์€ ๊ฒƒ์ด์—์š”.

Field ์ฃผ์ž…์„ ์ข€ ๋” ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ด ์žˆ์„๊นŒ์š”?

 

๊ทธ๋Ÿด ๋•Œ ๋“ฑ์žฅํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ Lombok์ธ ๊ฒƒ์ด์—์š”.

Lombok Library๊ฐ€ ์ œ๊ณตํ•˜๋Š” @RequiredArgsConstructor ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด final์ด ๋ถ™์€ Field๋ฅผ ๋ชจ์•„ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

 

 

Lombok์ด Java์˜ Annotion Processor๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ Compile ์‹œ์ ์— ์ƒ์„ฑ์ž Code๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด ์ฃผ๋Š” ๊ฒƒ์ด์—์š”. ์‹ค์ œ Class๋ฅผ ์—ด์–ด๋ณด๋ฉด ์ƒ์„ฑ์ž๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์žˆ๋‹ต๋‹ˆ๋‹ค.

 

 

์ •๋ฆฌํ•˜์ž๋ฉด

 

์ตœ๊ทผ ์ƒ์„ฑ์ž๋ฅผ ๋”ฑ ํ•œ๊ฐœ๋ฅผ ๋‘๊ณ , @Autowired๋ฅผ ์ƒ๋žตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— Lombok Library์˜ @RequiredArgsConstructor๋ฅผ ํ•จ๊ป˜ ์“ด๋‹ค๋ฉด ์œ„์˜ ๊ธฐ๋Šฅ์€ ๋‹ค ์“ธ ์ˆ˜ ์žˆ๊ณ , Code ๋˜ํ•œ ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ๋˜๋Š” ํšจ๊ณผ๋ฅผ ๋ˆ„๋ฆด ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

    ๐Ÿ“ Lombok ์ ์šฉ ๋ฐฉ๋ฒ•

         ๐Ÿ‘‰ build.gradle

 

 

  1. [Macbook]
    preferences => plugin => lombok ๊ฒ€์ƒ‰ ๋ฐ ์„ค์น˜ (IDE ์žฌ์‹œ์ž‘ ํ•„์š”)
  2. [Windows]
    File => Settings => plugin => lombok ๊ฒ€์ƒ‰ ๋ฐ ์„ค์น˜ (IDE ์žฌ์‹œ์ž‘ ํ•„์š”)
  3. ์ž„์˜ Test๋ฅผ ๋งŒ๋“  ๋’ค @Getter, @Setter๊ฐ€ ๋™์ž‘ํ•˜๋ฉด ์ •์ƒ

 

 

 

 

 

๐Ÿ“Œ ์กฐํšŒ ๋นˆ 2๊ฐœ ์ด์ƒ - ๋ฌธ์ œ


@Autowired๋Š” ์ž๋ฃŒํ˜• Type์œผ๋กœ ์กฐํšŒ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

์ž๋ฃŒํ˜• Type์œผ๋กœ ์กฐํšŒ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜ Code์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด์—์š”. (๋‹จ, ์‹ค์ œ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ ์ œ๊ณต)

 

AnnotationConfigApplicationContext.getBean(AppConfig.class);

 

์ž๋ฃŒํ˜• Type์œผ๋กœ ์กฐํšŒ๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด ์„ ํƒ๋œ Bean์ด 2๊ฐœ ์ด์ƒ์ผ ๋•Œ Exception์ด ํ„ฐ์ง€๋Š” ๊ฒƒ์ด์—์š”.

 

 

์œ„์™€ ๊ฐ™์ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ž๋™ ์ฃผ์ž…์œผ๋กœ ํ•˜๊ฒŒ ๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

 

 

๋ฐ”๋กœ๋ฐ”๋กœ NoUniqueBeanDefinitionException์ด ํ„ฐ์ง€๋Š” ๊ฒƒ์ด์—์š”.

 

NoUniqueBeanDefinitionException: No qualifying bean of type 
'hello.core.discount.DiscountPolicy' available: expected single matching bean 
but found 2: fixDiscountPolicy,rateDiscountPolicy

 

์œ„์˜ ๋‚ด์šฉ์„ ํ•ด์„ ํ•ด๋ณด๋ฉด ํ•˜๋‚˜์˜ Bean์ด ์žˆ์„ ์ค„ ์•Œ์•˜๋Š”๋ฐ, fixDiscountPolicy์™€ rateDiscountPolicy 2๊ฐœ๋ฅผ ๋ฐœ๊ฒฌํ•ด ๋ฒ„๋ ธ๋‹ค๊ณ  ํ•˜๋„ค์š”.

 

์ด ๋•Œ, ํ•˜์œ„ ์ž๋ฃŒํ˜• Type์œผ๋กœ ์ง€์ •ํ• ์ˆ˜๋„ ์žˆ์œผ๋‚˜, ํ•˜์œ„ ์ž๋ฃŒํ˜• Type์œผ๋กœ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์€ DIP ์œ„๋ฐ˜ ์‚ฌํ•ญ์ด๊ณ , ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๊ฒƒ์ด์—์š”. ์ด๋ฆ„๋งŒ ๋“œ๋ฅด๊ณ , ์™„์ „ํžˆ ๋˜‘๊ฐ™์€ Type์˜ Spring Bean 2๊ฐœ๊ฐ€ ์žˆ์„ ๋•Œ๋Š” ๋˜ ํ•ด๊ฒฐ๋„ ์•ˆ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

Spring Bean์„ ์ˆ˜๋™ ๋“ฑ๋กํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ, ์˜์กด ๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž…์—์„œ ํ•ด๊ฒฐํ•˜๋Š” ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

๐Ÿ“Œ @Autowired Field Name, @Qualifier, @Primary


์กฐํšŒ ๋Œ€์ƒ Bean์ด 2๊ฐœ ์ด์ƒ์ผ ๋• ๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ์ž๋™ ์ฃผ์ž…์—์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?

์ฒซ์งธ : @Aurowired Field Name Matching

๋‘˜์งธ : @Qualifier => @Qualifier๋ผ๋ฆฌ Matching => Bean Name Matching

์…‹์งธ : @Primary ์‚ฌ์šฉ

 

 

    ๐Ÿ“ @Autowired Field Name Matching

@Autowired๋Š” ์ž๋ฃŒํ˜• Type Matching์„ ๋จผ์ € ํ•œ ๋’ค์— ์—ฌ๋Ÿฌ Bean์ด ์žˆ์œผ๋ฉด Field Name, ๋งค๊ฐœ ๋ณ€์ˆ˜ ์ด๋ฆ„์œผ๋กœ Bean Name์„ ์ถ”๊ฐ€ Matching ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Field Name์ด rateDiscountPolicy์ด๊ธฐ ๋•Œ๋ฌธ์— ์ •์ƒ ์ฃผ์ž… ๋˜๋Š” ๊ฒƒ์ด์—์š”.

ํ•„๋“œ ์ด๋ฆ„ ๋งค์นญ์€ ๋จผ์ € ์ž๋ฃŒํ˜• ํƒ€์ž… ๋งค์นญ์„ ์‹œ๋„ํ•œ ๋’ค ๊ทธ ๊ฒฐ๊ณผ์— ๋”ฐ๋ผ ์—ฌ๋Ÿฌ ๋นˆ์ด ์žˆ์„ ๋•Œ ์ถ”๊ฐ€๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด์—์š”. 

 

 

์ •๋ฆฌํ•˜์ž๋ฉด

@Autowired๋Š” ์ž๋ฃŒํ˜• ํƒ€์ž… ๋งค์นญ์„ ํ•˜๋ฉฐ, ๋งค์นญ ๊ฒฐ๊ณผ๊ฐ€ 2๊ฐœ ์ด์ƒ์ผ ๋•Œ ํ•„๋“œ ์ด๋ฆ„, ๋งค๊ฐœ ๋ณ€์ˆ˜(ํŒŒ๋ผ๋ฏธํ„ฐ) ์ด๋ฆ„์œผ๋กœ ๋นˆ ์ด๋ฆ„์„ ๋งค์นญํ•˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

    ๐Ÿ“ @Qualifier

@Qualifier๋Š” ์ถ”๊ฐ€ ๊ตฌ๋ถ„์ž๋ฅผ ๋ถ™์—ฌ์ฃผ๋Š” ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

์ฆ‰, ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…์„ ํ•  ๋•Œ ์ถ”๊ฐ€์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด์—์š”. ์ด ์นœ๊ตฌ๋Š” ๋นˆ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ž๋‹ˆ๋‹ค.

 

 

์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ๋นˆ ๋“ฑ๋ก์„ ํ•  ๋•Œ @Qualifier๋ฅผ ๋ถ™์—ฌ์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด๊ณ , ์ฃผ์ž…์‹œ์— ๋“ฑ๋กํ•œ ์ด๋ฆ„์„ ์ ์–ด์ฃผ๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

 

         ๐Ÿ‘‰ ์ƒ์„ฑ์ž ์ž๋™ ์ฃผ์ž… ์˜ˆ์‹œ

 

 

 

         ๐Ÿ‘‰ Setter ์ž๋™ ์ฃผ์ž… ์˜ˆ์‹œ

 

 

 

๋งŒ์•ฝ @Qualifier๋กœ ์ฃผ์ž… ํ•  ๋•Œ @Qualifier("mainDiscountPolicy")๋ฅผ ๋ชป ์ฐพ๊ฒŒ ๋œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด mainDiscountPolicy๋ผ๋Š” ์ด๋ฆ„์˜ ์Šคํ”„๋ง ๋นˆ์„ ์ถ”๊ฐ€๋กœ ์ฐพ๋Š” ๊ฒƒ์ด์—์š”.

 

๐Ÿ‘จ‍๐Ÿซ ๊น€์˜ํ•œ ๊ฐ•์‚ฌ๋‹˜์˜ ์กฐ์–ธ

@Qualifier๋Š” @Qualifier๋ฅผ ์ฐพ๋Š” ์šฉ๋„๋กœ๋งŒ ์‚ฌ์šฉํ•ฉ์‹œ๋‹ค!

 

์•„๋ž˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ์ˆ˜๋™ ๋นˆ ๋“ฑ๋ก์‹œ์—๋„ @Qualifier๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

 

 

์ •๋ฆฌํ•˜์ž๋ฉด

 

์ฒซ์งธ : @Qualifier๋ผ๋ฆฌ ๋งค์นญ

๋‘˜์งธ : ๋นˆ ์ด๋ฆ„ ๋งค์นญ

์…‹์งธ : NoSuchBeanDefinitionException ๋ฐœ์ƒ

 

 

 

    ๐Ÿ“ @Primary ์‚ฌ์šฉ

@Primary๋Š” ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋˜๋Š” ๊ฒƒ์ด์—์š”.

@Autowired ์‹œ ์—ฌ๋Ÿฌ ๋นˆ์ด ๋งค์นญ๋˜๋ฉด @Primary๊ฐ€ ๋ถ™์–ด์žˆ๋Š” ๊ณณ์ด ์ตœ์šฐ์„ ๊ถŒ์„ ๊ฐ–๋Š” ๊ฒƒ์ด์—์š”.

 

 

์œ„์™€ ๊ฐ™์ด ํ–ˆ๋‹ค๋ฉด FixDiscountPolicy๋ณด๋‹ค RateDiscountPolicy๊ฐ€ ์šฐ์„ ๊ถŒ์„ ๊ฐ–๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด์—์š”.

 

๊ทธ๋ ‡๋‹ค๋ฉด @Primary์™€ @Qualifier ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ์š”?@Qulifier์˜ ๋‹จ์ ์€ ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž… ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชจ๋“  Code์— @Qualifier๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—์š”.

 

 

ํ•˜.์ง€.๋งŒ @Primary๋Š” ์ด๋Ÿด ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์ง€์š”!

 

 

         ๐Ÿ‘‰ @Primary, @Qualifier ํ™œ์šฉ

์ฝ”๋“œ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” Main DB์˜ Connection์„ ํš๋“ํ•˜๋Š” ์Šคํ”„๋ง ๋นˆ์ด ์žˆ๊ณ , ์ฝ”๋“œ์—์„œ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์œผ๋กœ ๊ฐ€๋” ํ•˜์šฉํ•˜๋Š” Sub DB์˜ Connection์„ ํš๋“ํ•˜๋Š” ๋นˆ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, Main DB์˜ Connection์„ ํš๋“ํ•˜๋Š” ์Šคํ”„๋ง ๋นˆ์ธค @Primary๋ฅผ ์ ์šฉํ•ด์„œ ์กฐํšŒํ•˜๋Š” ๊ณณ์—์„œ @Qulifier ์ง€์ • ์—†์ด ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒํ•˜๊ณ , Sub DB Connection Bean ํš๋“ ์‹œ์—๋Š” @Qualifier๋ฅผ ์ง€์ •ํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ํš๋“ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

๋ฌผ๋ก  ์ด ๋•Œ Main DB์˜ ์Šคํ”„๋ง ๋นˆ์„ ๋“ฑ๋กํ•  ๋•Œ, @Qualifier๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ต๋‹ˆ๋‹ค!

 

๊ทธ๋ ‡๋‹ค๋ฉด ๋‘˜ ์ค‘ ๋ˆ„๊ฐ€ ์šฐ์„ ๊ถŒ์„ ๊ฐ€์งˆ๊นŒ์š”?

@Primary๋Š” Default Value์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด๊ณ , @Qulifier๋Š” ๋งค์šฐ ์ƒ์„ธํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด์—์š”. 

์Šคํ”„๋ง์€ ์ž๋™๋ณด๋‹ค ์ˆ˜๋™์ด ๋„“์€ ๋ฒ”์œ„์˜ ์„ ํƒ๊ถŒ ๋ณด๋‹ค๋Š” ์ข์€ ๋ฒ”์œ„์˜ ์„ ํƒ๊ถŒ์ด ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฒƒ์ด์—์š”. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ๋Š” @Qualifier๊ฐ€ ์šฐ์„ ๊ถŒ์ด ๋†’๋‹ต๋‹ˆ๋‹ค!

 

 

 

๐Ÿ“Œ ์กฐํšŒํ•œ ๋นˆ์ด ๋ชจ๋‘ ํ•„์š”ํ•  ๋•? List์™€ Map!


์˜๋„์ ์œผ๋กœ ํ•ด๋‹น ์ž๋ฃŒํ˜• ํƒ€์ž…์˜ ์Šคํ”„๋ง ๋นˆ์ด ๋ชจ๋‘ ๋‹ค ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋„ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

์˜ˆ๋ฅผ ๋“ค์–ด ํ• ์ธ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ• ์ธ์˜ ์ข…๋ฅ˜ (๊ณ ์ •ํ˜•, ํ™•๋ฅ ํ˜•)์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜์—ฌ ์ „๋žต ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

16 ~ 30๋ฒˆ์งธ Line 32 ~ 49๋ฒˆ์งธ Line

 

์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด DiscountService๋Š” Map์œผ๋กœ ๋ชจ๋“  DiscountOPolicy๋ฅผ ์ฃผ์ž… ๋ฐ›๋Š” ๊ฒƒ์ด์—์š”.

์ด ๋•Œ, fixDiscountPolicy, rateDiscountPolicy๊ฐ€ ์ฃผ์ž… ๋˜๋Š” ๊ฒƒ์ด์—์š”.

discount()๋Š” discountCode๋กœ "fixDiscountPolicy"๊ฐ€ ๋„˜์–ด์˜ค๋ฉด map์—์„œ fixDiscountPolicy ์Šคํ”„๋ง ๋นˆ์„ ์ฐพ์•„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด์—์š”. ๋ฌผ๋ก ! "rateDiscountPolicy"๊ฐ€ ๋„˜์˜ค๋ฉด rateDiscountPolicy๋ฅผ ์ฐพ์•„ ์‹คํ–‰ํ•˜๊ฒ ์ง€์š”.

 

Map<String, DiscountPolicy>๋Š” map Key์— ์Šคํ”„๋ง ๋นˆ์˜ ์ด๋ฆ„์„ ๋„ฃ์–ด์ฃผ๊ณ , ๊ทธ ๊ฐ’์œผ๋กœ DiscountPolicy ๊ฐ์ฒด ์ž๋ฃŒํ˜• ํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•œ ๋ชจ๋“  ์Šคํ”„๋ง ๋นˆ์„ ๋‹ด์•„์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

List<DiscountPolicy>๋Š” DiscountPolicy ๊ฐ์ฒด ์ž๋ฃŒํ˜• ํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•œ ๋ชจ๋“  ์Šคํ”„๋ง ๋นˆ์„ ๋‹ด์•„์ฃผ๋Š” ๊ฒƒ์ด์—์š”.

๋งŒ์•ฝ ํ•ด๋‹นํ•˜๋Š” ์ž๋ฃŒํ˜• ํƒ€์ž…์˜ ์Šคํ”„๋ง ๋นˆ์ด ์—†์œผ๋ฉด, ๋นˆ ์ปฌ๋ ‰์…˜์ด๋‚˜ Map์„ ์ฃผ์ž…ํ•œ๋‹ต๋‹ˆ๋‹ค.

 

๐Ÿ’ก์ฐธ๊ณ  : ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ƒ์„ฑ์ž์— ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๋ฐ›๋Š”๋‹ค. ์—ฌ๊ธฐ์— ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๋„˜๊ธฐ๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ์ž๋™ ๋“ฑ๋ก๋œ๋‹ค.

new AnnotationConfigApplicationContext(AutoAppConfig.class,DiscountService.class);

์œ„ ์ฝ”๋“œ๋Š” 2๊ฐ€์ง€๋กœ ๋‚˜๋ˆ„์–ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ฒซ์งธ : new AnnotionConfigApplicationContext()๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ
๋‘˜์งธ : AutoAppConfig.class, DiscountService.class๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„˜๊ธฐ๋ฉด์„œ ํ•ด๋‹น ํด๋ž˜์Šค๋ฅผ ์ž๋™์œผ๋กœ ์Šคํ”„๋ง
        ๋นˆ์œผ๋กœ ๋“ฑ๋ก

๊ฒฐ๊ตญ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด์„œ, ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ์— ๋™์‹œ์— AutoAppConfig, DiscountService๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ์ž๋™ ๋“ฑ๋ก

 

 

 

 

๐Ÿ“Œ ์ž๋™, ์ˆ˜๋™์˜ ์˜ฌ๋ฐ”๋ฅธ ์‹ค๋ฌด ์šด์˜ ๊ธฐ์ค€


    ๐Ÿ“ ํŽธ๋ฆฌํ•œ ์ž๋™ ๊ธฐ๋Šฅ์ด Default!

์–ด๋–ค ๊ฒฝ์šฐ์— ์ปดํฌ๋„ŒํŠธ ์Šค์บ”๊ณผ ์ž๋™ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๊ณ , ์–ด๋–ค ๊ฒฝ์šฐ์— ์„ค์ • ์ •๋ณด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์ˆ˜๋™์œผ๋กœ ๋นˆ์„ ๋“ฑ๋กํ•˜๊ณ , ์˜์กด๊ด€๊ณ„๋„ ์ˆ˜๋™์œผ๋กœ ์ฃผ์ž…ํ• ๊นŒ์š”?

๊ฒฐ๊ณผ์ ์œผ๋กœ ์Šคํ”„๋ง์ด ๋‚˜์˜ค๊ณ , ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ์ž๋™์„ ์„ ํ˜ธํ•˜๋Š” ์ถ”์„ธ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์Šคํ”„๋ง์€ @Component ๋ฟ ์•„๋‹ˆ๋ผ, @Controller, @Service, @Repository์ฒ˜๋Ÿผ Layer(๊ณ„์ธต)์— ๋งž์ถ”์–ด ์ผ๋ฐ˜์ ์ธ Application Logic์„ ์ž๋™์œผ๋กœ Scanํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

๊ฑฐ๊ธฐ์— ์ตœ๊ทผ ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ ์Šค์บ”์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ , ์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ๋‹ค์–‘ํ•œ ์Šคํ”„๋ง ๋นˆ๋“ค๋„ ์กฐ๊ฑด์ด ๋งž์œผ๋ฉด ์ž๋™์œผ๋กœ ๋“ฑ๋ก ๋˜๋„๋ก ์„ค๊ณ„ ํ•œ ๊ฒƒ์ด์—์š”.

์„ค์ • ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Application์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ถ€๋ถ„๊ณผ ์‹ค์ œ ๋™์ž‘ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ด์ƒ์ ์ด๋‚˜, ๊ฐœ๋ฐœ์ž ์ž…์žฅ์—์„œ ์Šคํ”„๋ง ๋นˆ์„ ํ•˜๋‚˜ ๋“ฑ๋กํ•  ๋•Œ, @Component๋งŒ ๋„ฃ์–ด์ฃผ๋ฉด ๋๋‚˜๋Š” ์ผ์„ @Configuration์ด ๋ถ™์–ด ์žˆ๋Š” ์„ค์ • ์ •๋ณด์— ๊ฐ€์„œ @Bean์„ Method๋งˆ๋‹ค ํ•˜๋‚˜ํ•˜๋‚˜ ๋ถ™์ด๊ณ , ์ธ์Šคํ„ด์Šค(๊ฐ์ฒด)๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ฃผ์ž… ๋Œ€์ƒ์„ ์ผ์ผ์ด ์ ์–ด์ฃผ๋Š” ๊ณผ์ •์€ ํ˜„ํƒ€๊ฐ€ ์˜ค๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—์š”.

๋˜ ๊ด€๋ฆฌํ•  ์Šคํ”„๋ง ๋นˆ์ด ๋งŽ์•„์„œ ์„ค์ • ์ •๋ณด๊ฐ€ ์ปค์ง€๊ฒŒ ๋œ๋‹ค๋ฉด ์„ค์ • ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ ์ž์ฒด๋„ ๊ต‰์žฅํ•œ ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๊ฒŒ ๋  ๊ฒƒ์ด๋ž๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ๊ฒฐ์ •์ ์œผ๋กœ ์ž๋™ ๋นˆ ๋“ฑ๋ก์„ ์‚ฌ์šฉํ•ด๋„ OCP, DIP๋ฅผ ์œ„๋ฐ˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

         ๐Ÿ‘‰ ์ˆ˜๋™ ๋นˆ ๋“ฑ๋ก์„ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„ ๋•Œ

Application์€ ํฌ๊ฒŒ ์—…๋ฌด ๋กœ์ง๊ณผ ๊ธฐ์ˆ  ์ง€์› ๋กœ์ง์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

    • ์—…๋ฌด ๋กœ์ง ๋นˆ : Web์„ ์ง€์›ํ•˜๋Š” Controller, ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์žˆ๋Š” Service, Data Layer์˜ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” Repository ๋“ฑ์ด ๋ชจ๋‘ ์—…๋ฌด ๋กœ์ง์œผ๋กœ ๋ณดํ†ต ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜, ๋ณ€๊ฒฝ๋˜๋Š” ๊ณณ์ด๋‹ค.
      • ์—…๋ฌด ๋กœ์ง์€ ์ˆซ์ž๋„ ๋งค์šฐ ๋งŽ๊ณ , ํ•œ๋ฒˆ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜๋ฉด Controller, Service, Repository์ฒ˜๋Ÿผ ์–ด๋Š์ •๋„ ์œ ์‚ฌ ํŒจํ„ด์ด ์กด์žฌ. ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ž๋™ ๊ธฐ๋Šฅ์ด ์œ ๋ฆฌํ•˜๋ฉฐ, ๋ณดํ†ต ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์–ด๋–ค ๊ณณ์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•˜๊ธฐ ์‰ฌ์šด ๋ถ€๋ถ„์ด๋‹ค.
    • ๊ธฐ์ˆ  ์ง€์› ๋นˆ : ๊ธฐ์ˆ ์ ์ธ ๋ฌธ์ œ, ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ(AOP - ์ด๊ฒƒ์„ ์ž˜ ๋ชจ๋ฅด์‹ ๋‹ค๋ฉด [Spring Boot] AOP์— ๊ด€์‹ฌ์„ ์ฃผ์„ธ์š”!)๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉ. DB ์—ฐ๊ฒฐ, ๊ณตํ†ต Log ์ฒ˜๋ฆฌ์™€ ๊ฐ™์€ ์—…๋ฌด ๋กœ์ง์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋ถ€ ๊ธฐ์ˆ  ํ˜น์€ ๊ณตํ†ต ๊ธฐ์ˆ ๋“ค
      • ๊ธฐ์ˆ  ์ง€์› ๋กœ์ง์€ ์—…๋ฌด ๋กœ์ง๊ณผ ๋น„๊ตํ•ด์„œ ๊ทธ ์ˆ˜๊ฐ€ ๋งค์šฐ ์ ๊ณ , ๋ณดํ†ต Application ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ณณ. ๋˜ํ•œ, ์—…๋ฌด ๋กœ์ง์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ, ์–ด๋””๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ธฐ์ˆ  ์ง€์› ๋กœ์ง์€ ์ ์šฉ์ด ์ž˜ ๋˜๊ณ  ์žˆ๋Š”์ง€ ์•„๋‹Œ์ง€ ํŒŒ์•…ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๊ธฐ์ˆ  ์ง€์› ๋กœ์ง๋“ค์€ ์ˆ˜๋™ ๋นˆ ๋“ฑ๋ก์ด ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
        • ๊ฐ™์€ ์ฃผ์ œ๋ฅผ ๊ฐ–์€ Class๋“ค์„ ํ•œ Package์— ์ •๋ฆฌํ•˜๊ธฐ
        • ์ตœ์ƒ์œ„ ์œ„์น˜ (Root Path)์— ์„ค์ • ์ •๋ณด๋“ค์„ ์œ„์น˜ ์‹œํ‚ค๊ธฐ.

 

Application์— ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ธฐ์ˆ  ์ง€์› ์ธ์Šคํ„ด์Šค๋Š” ์ˆ˜๋™ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ์„ค์ • ์ •๋ณด์— ๋ฐ”๋กœ ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌํ•œ ๊ฒƒ์ด์—์š”.

 

 

         ๐Ÿ‘‰ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ค‘ ๋‹คํ˜•์„ฑ์„ ์ ๊ทน ํ™œ์šฉํ•  ๋•Œ

์˜์กด ๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž…์—์„œ ์œ„์— ๊ธฐ์ˆ ํ•œ [๐Ÿ“Œ ์กฐํšŒํ•œ ๋นˆ์ด ๋ชจ๋‘ ํ•„์š”ํ•  ๋•? List์™€ Map!] ์ด ๋ถ€๋ถ„์— ๋‹ค์‹œ ๊ด€์‹ฌ์„ ์ฃผ์„ธ์š”!

DiscountService๊ฐ€ ์˜์กด ๊ด€๊ณ„ ์ž๋™ ์ฃผ์ž…์œผ๋กœ Map<String, DiscountPolicy>์— ์ฃผ์ž…์„ ๋ฐ›๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด ์—ฌ๊ธฐ์— ์–ด๋–ค ๋นˆ๋“ค์ด ์ฃผ์ž…๋ ์ง€ ๊ฐ ๋นˆ๋“ค์˜ ์ด๋ฆ„์€ ๋ฌด์—‡์ผ์ง€ ์ฝ”๋“œ๋งŒ ๋ณด๊ณ  ํ•œ๋ฒˆ์— ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒƒ์ด์—์š”. ๋ฌผ๋ก  ๊ฐœ์ธ์ด ๊ฐœ๋ฐœํ–ˆ๋‹ค๋ฉด ์•Œ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ๋‚จ์ด ๊ฐœ๋ฐœํ•œ ์ฝ”๋“œ๋ฅผ ๋ฐ›๋Š”๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”?

์ด๋Ÿด ๊ฒฝ์šฐ ์ž๋™ ๋“ฑ๋ก์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํŒŒ์•…์„ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์ฝ”๋“œ๋ฅผ ์˜ฎ๊ฒจ ๋‹ค๋‹ˆ๋ฉฐ, ํŒŒ์•…์„ ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์—์š”.

์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์ผ ๋•Œ, ์ˆ˜๋™ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜๊ฑฐ๋‚˜, ์ž๋™์œผ๋กœ ํ•œ๋‹ค๋ฉด ํŠน์ • ํŒจํ‚ค์ง€์— ๊ฐ™์ด ๋ฌถ์–ด ๋‘๋Š” ๊ฒƒ์ด ์ข‹์€ ๊ฒƒ์ด์—์š”.

ํ•ต์‹ฌ์€ ๋”ฑ ๋ณด๊ณ , ์ดํ•ด๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋‹Œ๊นŒ์š”!

 

์ด ๋ถ€๋ถ„์„ ๋ณ„๋„ ์„ค์ • ์ •๋ณด๋ฅผ ๋งŒ๋“ค๊ณ , ์ˆ˜๋™์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ์ด์—์š”.

 

 

์œ„ ์„ค์ • ์ •๋ณด๋งŒ ๋ด๋„ ํ•œ ๋ˆˆ์— ๋นˆ์˜ ์ด๋ฆ„์€ ๋ฌผ๋ก (rateDiscountPolicy, fixDiscountPolicy) ์–ด๋–ค ๋นˆ๋“ค์ด ์ฃผ์ž…๋ ์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”. (Method์˜ Body๋ถ€) ๊ทธ๋ž˜๋„ ๋นˆ ์ž๋™ ๋“ฑ๋ก์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ํŒŒ์•…ํ•˜๊ธฐ ์ข‹๊ฒŒ DiscountPolicy์˜ ๊ตฌํ˜„ ๋นˆ๋“ค๋งŒ ๋”ฐ๋กœ ๋ชจ์•„ ํŠน์ • Package์— ์ €์žฅํ•˜๋Š” ๊ฒƒ๋„ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด์—์š”.

 

๐Ÿ’ก ์ฐธ๊ณ  :

์Šคํ”„๋ง๊ณผ ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ์ˆ˜ ๋งŽ์€ ๋นˆ๋“ค์€ ์˜ˆ์™ธ.
์ด๋Ÿฐ ๋ถ€๋ถ„๋“ค์€ ์Šคํ”„๋ง ์ž์ฒด๋ฅผ ์ž˜ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง์˜ ์˜๋„๋Œ€๋กœ ์ž˜ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ค‘์š”.
์Šคํ”„๋ง ๋ถ€ํŠธ์˜ ๊ฒฝ์šฐ DataSource ๊ฐ™์€ DB Connection์— ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ  ์ง€์› ๋กœ์ง๊นŒ์ง€ ๋‚ด๋ถ€์—์„œ ์ž๋™์œผ๋กœ ๋“ฑ๋ก.
์ด๋Ÿฐ ๋ถ€๋ถ„์€ Manual์„ ์ฐธ๊ณ ํ•ด์„œ ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์˜๋„ํ•œ๋Œ€๋กœ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

๋ฐ˜๋ฉด ์Šคํ”„๋ง ๋ถ€ํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‚ด๊ฐ€ ์ง์ ‘ ๊ธฐ์ˆ  ์ง€์› ๊ฐ์ฒด๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•  ๋• ์ˆ˜๋™์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ฒŒ ์œ ๋ฆฌ

 

 

์ •๋ฆฌํ•˜์ž๋ฉด

 

ํŽธ๋ฆฌํ•œ ์ž๋™ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ผ๋‹จ ๊ธฐ๋ณธ!

์ง์ ‘ ๋“ฑ๋กํ•˜๋Š” ๊ธฐ์ˆ  ์ง€์› ๊ฐ์ฒด๋Š” ์ˆ˜๋™์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

๋‹คํ˜•์„ฑ์„ ์ ๊ทน ํ™œ์šฉํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์ˆ˜๋™ ๋“ฑ๋ก์„ ๊ณ ๋ฏผํ•ด๋ณด์ž!

 

(๋‹คํ˜•์„ฑ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ๊ณ  ์‹ถ์œผ์‹ ๋‹ค๋ฉด [Java] ๋‹คํ˜•์„ฑ(polymorphism)์— ๊ด€์‹ฌ์„ ์ฃผ์„ธ์š”!)

 

 


 

 

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

 

 

 

728x90
๋ฐ˜์‘ํ˜•

'Back-End ์ž‘์—…์‹ค > Spring Framework' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Spring] Bean Scope  (0) 2021.10.10
[Spring] Bean Life Cycle Call Back  (0) 2021.10.08
[Spring] Component Scan And Auto wired Start  (0) 2021.10.06
[JPQL] left ( outer ) join  (0) 2021.10.05
[JPA] @ManyToOne  (0) 2021.10.05