nyximos.log

[Spring] ๋‹ค์–‘ํ•œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ• ๋ณธ๋ฌธ

Programming/Spring

[Spring] ๋‹ค์–‘ํ•œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ•

nyximos 2022. 1. 14. 11:52

๐Ÿคน‍โ™‚๏ธ ๋‹ค์–‘ํ•œ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž… ๋ฐฉ๋ฒ•

์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์€ 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  1. ์ƒ์„ฑ์ž ์ฃผ์ž…
  2. ์ˆ˜์ •์ž ์ฃผ์ž… (setter ์ฃผ์ž…)
  3. ํ•„๋“œ ์ฃผ์ž…
  4. ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ฃผ์ž…

1. ์ƒ์„ฑ์ž ์ฃผ์ž…

์ด๋ฆ„ ๊ทธ๋Œ€๋กœ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…

์ƒ์„ฑ์ž ํ˜ธ์ถœ์‹œ์ ์— ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋œ๋‹ค.

๋ถˆ๋ณ€, ํ•„์ˆ˜ ์˜์กด๊ด€๊ณ„์— ์‚ฌ์šฉ๋œ๋‹ค.

๐Ÿ˜ฎโ˜ ์ƒ์„ฑ์ž๊ฐ€ ๋”ฑ 1๊ฐœ ์žˆ์œผ๋ฉด @Autowired๋ฅผ ์ƒ๋žตํ•ด๋„ ์ž๋™ ์ฃผ์ž… ๋œ๋‹ค. (์Šคํ”„๋ง ๋นˆ์—๋งŒ ํ•ด๋‹น)

2. ์ˆ˜์ •์ž ์ฃผ์ž…(setter ์ฃผ์ž…)

ํ•„๋“œ ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ˆ˜์ •์ž ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…

์„ ํƒ, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์˜์กด๊ด€๊ณ„์— ์‚ฌ์šฉ๋œ๋‹ค.

์ž๋ฐ”๋นˆ ํ”„๋กœํผํ‹ฐ ๊ทœ์•ฝ์˜ ์ˆ˜์ •์ž ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๐Ÿ“Œ ์ž๋ฐ”๋นˆ JavaBean

JavaBeans Convention์— ๋”ฐ๋ผ ์ž‘์„ฑ๋œ ์ž๋ฐ” ํด๋ž˜์Šค๐Ÿ™†‍โ™€๏ธ ์ปดํฌ๋„ŒํŠธ ๐Ÿ™…‍โ™€๏ธ 

 

๐Ÿ“Œ ์ž๋ฐ”๋นˆ ํ”„๋กœํผํ‹ฐ JavaBean Property

JavaBean์— ์ €์žฅ๋˜์žˆ๋Š” ๊ฐ’

 

๐Ÿ“Œ ์ž๋ฐ”๋นˆ ํ”„๋กœํผํ‹ฐ ๊ทœ์•ฝ

ํ•„๋“œ์˜ ๊ฐ’์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  getter, setter ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ฝ๋Š” ๊ทœ์น™

naming convention์„ ์ง€ํ‚ค์ž! →  get/set+๋ฉค๋ฒ„๋ณ€์ˆ˜(๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘)

 

๋‹ค๋ฅธ ๊ทœ์•ฝ๋„ ์•Œ์•„๋ณด์ž

๐Ÿ“ŒJavaBean Convention

1) ์ž๋ฐ”๋นˆ ํด๋ž˜์Šค์—๋Š” ๊ธฐ๋ณธ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

2) ์ž๋ฐ”๋นˆ ํด๋ž˜์Šค๋Š” ๊ธฐ๋ณธ ํŒจํ‚ค์ง€๊ฐ€ ์•„๋‹Œ ํŠน์ • ์ง€์ •ํ•œ ํŒจํ‚ค์ง€์— ์ €์žฅ๋˜์–ด์•ผ ํ•œ๋‹ค.

3) ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์ž! ๋”ฐ๋ผ์„œ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์˜ ์ ‘๊ทผ์ œ์–ด์ž๋Š” private๋กœ ์„ ์–ธํ•œ๋‹ค.

4) ๋ฉค๋ฒ„ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด getter, setter ๋ฉ”์„œ๋“œ๋ฅผ public์œผ๋กœ ์ง€์ •ํ•œ๋‹ค.

5) ์ง๋ ฌํ™”(Serializable )๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.(์„ ํƒ)→ ๋นˆ์˜ ์ƒํƒœ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์ €์žฅ, ๋ณต์›ํ•œ๋‹ค.

  ๐Ÿค”์ง๋ ฌํ™”๋ž€? ๊ฐ์ฒด๋ฅผ ์ž…์ถœ๋ ฅ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ์ฒด ๋ฉค๋ฒ„๋“ค์„ ๋ฐ”์ดํŠธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜์‹œํ‚ค๋Š” ๊ฒƒ

3. ํ•„๋“œ ์ฃผ์ž…

ํ•„๋“œ์— ๋ฐ”~๋กœ ์ฃผ์ž…

์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์„œ ์ข‹์ง€๋งŒ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ํž˜๋“ค๋‹ค. ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜์ž!

1) ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ์ฝ”๋“œ์™€ ๊ด€๊ณ„์—†๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ

2) ์Šคํ”„๋ง ์„ค์ •์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” @Configuration ๊ฐ™์€ ๊ณณ 

4. ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ฃผ์ž…

์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฃผ์ž…

ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ž˜ ์‚ฌ์šฉ ์•ˆํ•œ๋‹ค ๊ณ ํ•œ๋‹ค ~

 

 

๐Ÿ‘ฉ‍๐ŸŽค ์˜ต์…˜ ์ฒ˜๋ฆฌ

์Šคํ”„๋ง ๋นˆ์ด ์—†์–ด๋„ ๋Œ์•„๊ฐ€๊ฒŒ ํ•ด์•ผํ•  ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ

@Autowired์˜ required ์˜ต์…˜์˜ ๊ธฐ๋ณธ๊ฐ’์ด true๋ผ์„œ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์–ด ์˜ค๋ฅ˜๊ฐ€ ๋‚ ๋•Œ๊ฐ€ ์žˆ๋‹ค.

์ž๋™ ์ฃผ์ž… ๋Œ€์ƒ์„ ์˜ต์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž

 

์ž๋™ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์œผ๋ฉด ~~

  1. @Autowired(required=false) : ์ˆ˜์ •์ž ๋ฉ”์„œ๋“œ ์ž์ฒด๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜์ง€ ์•Š๋Š”๋‹ค.
  2. org.springframework.lang.@Nullable : null์ด ์ž…๋ ฅ๋œ๋‹ค.
  3. Optional<> : Optional.empty๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค.

 

 

๐Ÿ‘ฉ‍๐Ÿ”ฌ ์ƒ์„ฑ์ž ์ฃผ์ž… ์„ ํƒ

๊ณผ๊ฑฐ์—๋Š” ์ˆ˜์ •์ž ์ฃผ์ž…๊ณผ ํ•„๋“œ ์ฃผ์ž…์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.

์ตœ๊ทผ์—๋Š” DI ํ”„๋ ˆ์ž„์›Œํฌ ๋Œ€๋ถ€๋ถ„์ด ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ํ•˜๋Š”๋ฐ

์ด์œ ๋Š” ๋ถˆ๋ณ€, ๋ˆ„๋ฝ, final ํ‚ค์›Œ๋“œ ๋•Œ๋ฌธ์ด๋‹ค.

1. ๋ถˆ๋ณ€

๋Œ€๋ถ€๋ถ„์˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์€ ํ•œ๋ฒˆํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ์‹œ์ ๊นŒ์ง€ ์˜์กด๊ด€๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•  ์ผ์ด ์—†๋‹ค. ๋Œ€๋ถ€๋ถ„ ๋ณ€ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

์ˆ˜์ •์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด setXX ๋ฉ”์„œ๋“œ๋ฅผ public์œผ๋กœ ์—ด์–ด๋‘์ž.

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

2. ๋ˆ„๋ฝ

ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์ฝ”๋“œ๋ฅผ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ•  ๋•Œ, ์ˆ˜์ •์ž ์˜์กด๊ด€๊ณ„์ธ ๊ฒฝ์šฐ

@Autowired๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ ์•ˆ์—์„œ ๋™์ž‘ํ•  ๋•Œ ์˜์กด๊ด€๊ณ„ ์—†์œผ๋ฉด ์˜ค๋ฅ˜๋ฐœ์ƒํ•œ๋‹ค. 

(์ง€๊ธˆ์€ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์ฝ”๋“œ๋กœ๋งŒ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰ํ•œ๋‹ค.)

์˜์กด๊ด€๊ณ„๊ฐ€ ์—†์œผ๋ฉด Null Point Exception์ด ๋ฐœ์ƒํ•˜๋Š”๋ฐ

 

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฃผ์ž… ๋ฐ์ดํ„ฐ๋ฅผ ๋ˆ„๋ฝํ–ˆ์„๋•Œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์ œ์ผ ์ข‹์€ ์˜ค๋ฅ˜๋Š” ์ปดํŒŒ์ผ ์˜ค๋ฅ˜~ ๐Ÿงš‍โ™€๏ธ

 

3. final

์ƒ์„ฑ์ž ์ฃผ์ž… ์‚ฌ์šฉ์‹œ ํ•„๋“œ์— final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋”ฐ.

๊ทธ๋ž˜์„œ ์ปดํŒŒ์ผ ์‹œ์ ์— ์ƒ์„ฑ์ž์—์„œ ๊ฐ’์ด ์„ค์ •๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๋ฅผ ๋ง‰์•„์ค€๋‹ค.

java: variable discountPolicy might not have been initialized

๐Ÿ˜ฏ ์ƒ์„ฑ์ž ์ดํ›„์— ๋‚˜๋จธ์ง€ ์ฃผ์ž…๋ฐฉ์‹์ด ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ƒ์„ฑ์ž ์ฃผ์ž…๋งŒ final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค!

 

 

๐ŸŒถ ๋กฌ๋ณต๊ณผ ์ตœ์‹  ํŠธ๋žœ๋“œ

๋ง‰์ƒ ๊ฐœ๋ฐœํ•˜๋ฉด ๋Œ€๋ถ€๋ถ„ ๋ถˆ๋ณ€์ด๋ผ์„œ ์ƒ์„ฑ์ž์— final์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๊ณ ํ•œ๋‹ค.

์ด๊ฑธ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๋Š”๊ฒŒ ๋กฌ๋ณต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

๋กฌ๋ณต์—์„œ ์ œ๊ณตํ•˜๋Š” @RequiredArgsConstructor๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด

final ํ•„๋“œ๋ฅผ ๋ชจ์•„์„œ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค๊ณ  ํ•œ๋‹ค.๐Ÿ‘

 

 

๐Ÿคฏ ์กฐํšŒ ๋นˆ์ด 2๊ฐœ ์ด์ƒ

@Autowired๋Š” ํƒ€์ž… Type์œผ๋กœ ์กฐํšŒํ•œ๋‹ค.

ํƒ€์ž…์œผ๋กœ ์กฐํšŒํ•˜๋ฉด ์„ ํƒ๋œ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ผ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

NoUniqueBeanDefinitionException ์˜ค๋ฅ˜!

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

ํ•˜์œ„ ํƒ€์ž…์œผ๋กœ ์ง€์ •ํ•  ์‹œ DIP๋ฅผ ์œ„๋ฐฐํ•˜๊ณ  ์œ ์—ฐ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.

๋˜‘๊ฐ™์€ ํƒ€์ž…์˜ ์Šคํ”„๋ง ๋นˆ์ด 2๊ฐœ ์žˆ์„ ๋•Œ๋„ ํ•ด๊ฒฐ์ด ์•ˆ๋œ๋‹ค. 

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ์„ธ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. @Autowired ํ•„๋“œ ๋ช… ๋งค์นญ
  2. @Qualifier → @Qualifier๋ผ๋ฆฌ ๋งค์นญ ๋นˆ ์ด๋ฆ„ ๋งค์นญ
  3. @Primary ์‚ฌ์šฉ

1. @Autowired ํ•„๋“œ๋ช…

1) ํƒ€์ž… ๋งค์นญ 

2) ํƒ€์ž… ๋งค์นญ์˜ ๊ฒฐ๊ณผ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ผ๋•Œ ํ•„๋“œ๋ช…, ํŒŒ๋ผ๋ฏธํ„ฐ๋ช…์œผ๋กœ ๋นˆ ์ด๋ฆ„ ๋งค์นญ

 

2. @Qualifier

๋นˆ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ถ”๊ฐ€ ๊ตฌ๋ถ„์ž๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค.

1) ๋นˆ ๋“ฑ๋กํ•  ๋•Œ @Qualifier๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค.

2) ์ฃผ์ž…ํ•  ๋•Œ @Qualifier("๋“ฑ๋กํ•œ ์ด๋ฆ„")์„ ์ ์–ด์ค€๋‹ค.

3) @Qualifier ๋ผ๋ฆฌ ๋งค์นญ

4) ๋นˆ ์ด๋ฆ„ ๋งค์นญ

5) NoSuchBeanDefinitionException ๋ฐœ์ƒ

 

3. @Primary

@Autowired ์‹œ์— ์—ฌ๋Ÿฌ๋นˆ์ด ๋งค์นญ๋˜๋ฉด @Primary๊ฐ€ ์šฐ์„ ๊ถŒ์„ ๊ฐ€์ง„๋‹ค. 

@Primary๋Š” ๊ธฐ๋ณธ๊ฐ’์ฒ˜๋Ÿผ ๋™์ž‘๋˜๋ฏ€๋กœ @Qualifier๊ฐ€ ๋” ์šฐ์„ ๊ถŒ์ด ๋†’๋‹ค.

 

๐Ÿ‘ฉ‍๐Ÿญ ์• ๋…ธํ…Œ์ด์…˜ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ

์•„๋ฌด๋ ‡๊ฒŒ๋‚˜ ์“ฐ์ง€๋ง๊ณ  ๊ณตํ†ต์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๋ญ”์ง€ ๊ผญ ํ•„์š”ํ•œ์ง€ ์ž˜ ์ƒ๊ฐํ•ด๋ณด๊ณ  ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•˜์ž.

@interface ์• ๋„ˆํ…Œ์ด์…˜๋ช… {
	ํƒ€์ž… ์š”์†Œ์ด๋ฆ„(); // ์• ๋„ˆํ…Œ์ด์…˜์˜ ์š”์†Œ ์„ ์–ธ
    ...
}

 

  1. ํƒ€์ž…์„ @interface๋กœ ์ •์˜
  2. ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฉค๋ฒ„๋“ค์˜ ์ ‘๊ทผ ์ œ์–ด์ž๋Š” public์ด๋‚˜ default๋กœ ์ง€์ •
  3. annotation ์ถ”๊ฐ€
  4. ์š”์†Œ ์ถ”๊ฐ€

 

๐Ÿ“Œ Annotation ์š”์†Œ์˜ ๊ทœ์น™

  • ์š”์†Œ์˜ ํƒ€์ž…์€ ๊ธฐ๋ณธํ˜•, String, enum, annotation, Class๋งŒ ํ—ˆ์šฉ๋œ๋‹ค.
  • () ์•ˆ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.
  • ์˜ˆ์™ธ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์—†๋‹ค.
  • ์š”์†Œ๋ฅผ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ •์˜ํ•  ์ˆ˜ ์—†๋‹ค.

 

๐Ÿ“Œ Annotation

JDK1.5๋ฒ„์ „ ์ด์ƒ์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค.

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

 

built-in annotation๊ณผ meta annotation์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

 

built-in annotation

Java ์ฝ”๋“œ์—์„œ ์ ์šฉ๋˜๋Š” Annotation

  • @Overried : ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์•Œ๋ฆฐ๋‹ค.
  • @Deprecated : ์•ž์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š” ๋Œ€์ƒ์—๊ฒŒ ๋ถ™์ธ๋‹ค.
  • @SupperssWarnings : ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํŠน์ • ๊ฒฝ๊ณ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๊ฒŒ ํ•ด์ค€๋‹ค.

 

meta annotation

๋‹ค๋ฅธ Annotation์„ ์ •์˜ํ•˜๊ธฐ ์œ„ํ•œ Annotation

  • @Target : annotation์ด ์ ์šฉ๊ฐ€๋Šฅํ•œ ๋Œ€์ƒ์„ ์ง€์ •
  • @Retention : annotation์ด ์œ ์ง€๋˜๋Š” ๋ฒ”์œ„ ์ง€์ •
  • @Documented : annotation ์ •๋ณด๊ฐ€ javadoc์œผ๋กœ ์ž‘์„ฑ๋œ ๋ฌธ์„œ์— ํฌํ•จ๋˜๊ฒŒ ํ•œ๋‹ค.
  • @Inherited : annotation์ด ์ž์† ํด๋ž˜์Šค์— ์ƒ์†๋˜๋„๋ก ํ•œ๋‹ค.
  • @Repeatable : annotation์„ ๋ฐ˜๋ณตํ•ด์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

 

 

 ๐Ÿ‘ฉ‍๐Ÿณ ์กฐํšŒํ•œ ๋นˆ์ด ๋ชจ๋‘ ํ•„์š”ํ•  ๋•Œ, List, Map

์Šคํ”„๋ง ๋นˆ์ด ๋‹ค ํ•„์š”ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค.

๊ทธ๋Ÿด๋•Œ๋Š” Map์œผ๋กœ ๋ชจ๋‘ ์ฃผ์ž…๋ฐ›๊ณ . ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜์—ฌ map์—์„œ ์Šคํ”„๋ง ๋นˆ์„ ์ฐพ์•„ ์‹คํ–‰ํ•œ๋‹ค.

public int discount(Member member, int price, String discountCode) {
     DiscountPolicy discountPolicy = policyMap.get(discountCode);
     
     System.out.println("discountCode = " + discountCode);
     System.out.println("discountPolicy = " + discountPolicy);
     
     return discountPolicy.discount(member, price);
 }

 

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

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

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

 

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

ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class, DiscountService.class);

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋Š” ์ƒ์„ฑ์ž์— ํด๋ž˜์Šค ์ •๋ณด๋ฅผ ๋ฐ›๋Š”๋‹ค.

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

 

1) new AnnotationConfigApplicationContext()๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ!

2) AutoAppConfig.class, DiscountService.class ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„˜๊ธฐ๋ฉด์„œ ํ•ด๋‹น ํด๋ž˜์Šค ์ž๋™์œผ๋กœ ์Šคํ”„๋ง ๋นˆ ๋“ฑ๋ก

 

 

 ๐Ÿฆน‍โ™€๏ธ ์ž๋™, ์ˆ˜๋™์˜ ์˜ฌ๋ฐ”๋ฅธ ์‹ค๋ฌด ์šด์˜ ๊ธฐ์ค€

  1. ์ž๋™ ๋นˆ ๋“ฑ๋ก์„ ์‚ฌ์šฉํ•ด๋„ OCP, DIP๋ฅผ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ž๋™ ๊ธฐ๋Šฅ์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜์ž!
  2. ์ง์ ‘ ๋“ฑ๋กํ•˜๋Š” ๊ธฐ์ˆ  ์ง€์› ๊ฐ์ฒด๋Š” ์ˆ˜๋™์œผ๋กœ ๋“ฑ๋กํ•˜์ž!
  3. ๋‹คํ˜•์„ฑ์„ ์ ๊ทน ํ™œ์šฉํ•˜๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์€ ์ˆ˜๋™ ๋“ฑ๋ก์„ ๊ณ ๋ คํ•˜์ž!
    → ์ž๋™์œผ๋กœ ํ• ๊ฑฐ๋ฉด ํŠน์ • ํŒจํ‚ค์ง€์— ๋ฌถ๊ธฐ

 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์—…๋ฌด ๋กœ์ง๊ณผ ๊ธฐ์ˆ  ์ง€์› ๋กœ์ง์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

 

1) ์—…๋ฌด ๋กœ์ง ๋นˆ

controller(์›น ์ง€์›), service(ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง), repository(๋ฐ์ดํ„ฐ ๊ณ„์ธต์˜ ๋กœ์ง์„ ์ฒ˜๋ฆฌ)

๋ณดํ†ต ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋จ

์œ ์‚ฌํ•œ ํŒจํ„ด์ด ์žˆ์œผ๋‹ˆ ์ž๋™ ๊ธฐ๋Šฅ์„ ์ ๊ทน ์‚ฌ์šฉํ•˜์ž → ๋ฌธ์ œ ํŒŒ์•… ์‰ฌ์›€

 

2) ๊ธฐ์ˆ  ์ง€์› ๋นˆ

๊ธฐ์ˆ ์ ์ธ ๋ฌธ์ œ, ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌ(AOP) ์ฒ˜๋ฆฌ ์‹œ์— ์ฃผ๋กœ ์‚ฌ์šฉ

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ, ๊ณตํ†ต ๋กœ๊ทธ ์ฒ˜๋ฆฌ ๋“ฑ ์—…๋ฌด๋กœ์ง์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ํ•˜๋ถ€ ๊ธฐ์ˆ ์ด๋‚˜ ๊ณตํ†ต ๊ธฐ์ˆ 

์—…๋ฌด ๋กœ์ง์— ๋น„ํ•ด ์ˆ˜๊ฐ€ ์ ๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „๋ฐ˜์— ๊ฑธ์ณ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค.

→ ์ˆ˜๋™ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•˜์—ฌ ์„ค์ • ์ •๋ณด์— ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•˜์ž

 

 

 

์ฐธ์กฐ

 

๋‚จ๊ถ์„ฑ, ์ž๋ฐ”์˜ ์ •์„ ๊ธฐ์ดˆํŽธ, ๋„์šฐ์ถœํŒ, 2019

๊น€์˜ํ•œ, ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ https://inf.run/ryWP 

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., ์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์„ฑ์žฅํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜์–ด๋ณด์„ธ์š”! ๐Ÿ“ข

www.inflearn.com

์ž๋ฐ”๋นˆ - https://en.wikipedia.org/wiki/JavaBeans

์ž๋ฐ”๋นˆ ๊ทœ์•ฝ - https://dololak.tistory.com/133

Annotation - https://mangkyu.tistory.com/130