Chapter 7 - KOO-YS/toby-spring GitHub Wiki


์Šคํ”„๋ง ํ•ต์‹ฌ ๊ธฐ์ˆ ์˜ ์‘์šฉ


Goals

  • ์Šคํ”„๋ง์˜ ๋ชจ๋“  ๊ธฐ์ˆ ์€ ๊ฒฐ๊ตญ ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ์–ธ์–ด์˜ ์žฅ์ ์„ ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋„๋ก ๋„์™€์ฃผ๋Š” ๊ฒƒ
  • ์ง€๊ธˆ๊นŒ์ง€ ์‚ดํŽด๋ดค๋˜ ์„ธ ๊ฐ€์ง€ ๊ธฐ์ˆ ์„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ํ™œ์šฉํ•ด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋ณด๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง์˜ ๊ฐœ๋ฐœ์ฒ ํ•™๊ณผ ์ถ”๊ตฌํ•˜๋Š” ๊ฐ€์น˜, ์Šคํ”„๋ง ์‚ฌ์šฉ์ž์—๊ฒŒ ์š”๊ตฌ๋˜๋Š” ๊ฒŒ ๋ฌด์—‡์ธ์ง€ ์‚ดํŽด๋ณด๊ธฐ

๐ŸŒฑ Branch chapter07 folder ์‚ฌ์šฉ


7.1 SQL๊ณผ DAO์˜ ๋ถ„๋ฆฌ



๐ŸŒฑ Branch chapter07/refactor7.1์— ์‹ค์Šต ์ ์šฉ



๋ชฉํ‘œ : SQL์„ DAO์—์„œ ๋ถ„๋ฆฌ์ž‘์—… ๋„์ „

  1. XML ์„ค์ •์„ ์ด์šฉํ•œ ๋ถ„๋ฆฌ
    • SQL์„ ์Šคํ”„๋ง์˜ XML ์„ค์ • ํŒŒ์ผ๋กœ ๋นผ๋‚ด๋Š” ๊ฒƒ
    • ์Šคํ”„๋ง์—์„œ๋Š” String ๊ฐ’์„ ์™ธ๋ถ€์—์„œ DI ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์†์‰ฝ๊ฒŒ SQL ๋ถ„๋ฆฌ ๊ฐ€๋Šฅ
    • But, ๋งค๋ฒˆ ์ƒˆ๋กœ์šด SQL์ด ํ•„์š”ํ•  ๋•Œ ๋งˆ๋‹ค ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  DI๋ฅผ ์œ„ํ•œ ๋ณ€์ˆ˜์™€ setter๋„ ์ƒ์„ฑ
  2. SQL ๋งต ํ”„๋กœํผํ‹ฐ ๋ฐฉ์‹
    • SQL์„ ํ•˜๋‚˜์˜ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋‹ด์•„๋‘๋Š” ๋ฐฉ๋ฒ•
    • ๋งต์œผ๋กœ ๋งŒ๋“ค์–ด๋‘๋ฉด ์ƒˆ๋กœ์šด SQL์ด ํ•„์š”ํ•  ๋•Œ ์„ค์ •์—๋งŒ ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ๋˜๋‹ˆ ์ž‘์—…๋Ÿ‰์ด ์ค„๊ณ  ์ฝ”๋“œ ๊ฐ„๋‹จ
    • But, ์‹ค์ˆ˜๊ฐ€ ์žˆ์–ด๋„ ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์—๋Š” ์˜ค๋ฅ˜๋ฅผ ํ™•์ธํ•˜๊ธฐ ํž˜๋“ฆ
    ์Šคํ”„๋ง์˜ ์„ค์ •ํŒŒ์ผ ์•ˆ์— SQL์„ ๋‘๊ณ  ์ด๋ฅผ DI ํ•ด์„œ DAO๊ฐ€ ์‚ฌ์šฉํ•  ๋•Œ ๋ฌธ์ œ์ 
    • SQL๊ณผ DI ์„ค์ • ์ •๋ณด๊ฐ€ ์„ž์—ฌ ์žˆ์œผ๋ฉด ์ง€์ €๋ถ„ํ•˜๊ณ  ๊ด€๋ฆฌ ํž˜๋“ฆ
    • SQL์„ ๊ผญ ์Šคํ”„๋ง์˜ ๋นˆ ์„ค์ • ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ด XML์— ๋‹ด์•„๋‘˜ ํ•„์š”๊ฐ€ ์—†๋‹ค
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋Š” ๋ณ€๊ฒฝ์ด ๋งค์šฐ ์–ด๋ ต๋‹ค

    ๊ฒฐ๋ก  : ๋…๋ฆฝ์ ์ธ SQL ์ œ๊ณต ์„œ๋น„์Šค๊ฐ€ ํ•„์š”

  3. SQL ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค
    • ์–ด๋–ค ๊ธฐ์ˆ ์ ์ธ ์กฐ๊ฑด์ด๋‚˜ ์ œ์•ฝ์‚ฌํ•ญ๋„ ๋‹ด๊ฒจ์žˆ์ง€์•Š๋‹ค
    • SQL์„œ๋น„์Šค์˜ ๊ธฐ๋Šฅ : SQL์— ๋Œ€ํ•œ ํ‚ค ๊ฐ’์„ ์ „๋‹ฌํ•˜๋ฉด ๊ทธ์— ํ•ด๋‹นํ•˜๋Š” SQL์„ ๋Œ๋ ค์ฃผ๋Š” ๊ฒƒ
    ๋ชจ๋“  DAO๋Š” SQL์„ ์–ด๋””์— ์ €์žฅํ•ด๋‘๊ณ  ๊ฐ€์ ธ์˜ค๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์ „ํ˜€ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค

7.2 ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ถ„๋ฆฌ์™€ ์ž๊ธฐ์ฐธ์กฐ ๋นˆ



๐ŸŒฑ Branch chapter07/refactor7.2์— ์‹ค์Šต ์ ์šฉ -> ์‹ค์Šต ์ œ์™ธ



XML ํŒŒ์ผ ๋งคํ•‘

JAXB (Java Architecture for XML Binding)
  • XML์— ๋‹ด๊ธด ์ •๋ณด๋ฅผ ํŒŒ์ผ์—์„œ ์ฝ์–ด์˜ค๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ์จ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•
  • java.xml.bind ํŒจํ‚ค์ง€ ์•ˆ์—์„œ JAXB ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ์ด์šฉ
  • XML ๋ฌธ์„œ์˜ ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•œ ์Šคํ‚ค๋งˆ๋ฅผ ์ด์šฉํ•ด์„œ ๋งคํ•‘ํ•  ์˜ค๋ธŒ์ ํŠธ์˜ ํด๋ž˜์Šค๊นŒ์ง€ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋„ ์ œ๊ณต
์–ธ๋งˆ์ƒฌ๋ง (unmarshalling)
  • JAXB์—์„œ XML ๋ฌธ์„œ๋ฅผ ์ฝ์–ด์„œ ์ž๋ฐ”์˜ ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ์นญํ•จ

  • ๋ฐ˜๋Œ€๋กœ ๋ฐ”์ธ๋”ฉ ์˜ค๋ธŒ์ ํŠธ๋ฅผ XML ๋ฌธ์„œ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋งˆ์ƒฌ๋ง์ด๋ผ๊ณ  ํ•œ๋‹ค

๋””ํดํŠธ ์˜์กด๊ด€๊ณ„

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

  • ์™ธ๋ถ€์—์„œ DI ๋ฐ›์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋™ ์ ์šฉ๋˜๋Š” ์˜์กด ๊ด€๊ณ„

  • ๋””ํดํŠธ์— ์ ์šฉํ•˜๊ณ  ์‹ถ์€ ์˜์กด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ƒ์„ฑ์ž ์•ˆ์— ์ง์ ‘ ๋งŒ๋“ค์–ด ์Šค์Šค๋กœ DI

  • ๋””ํดํŠธ ์˜์กด๊ด€๊ณ„ ์ฃผ์˜์ 
    • ์„ค์ •์„ ํ†ตํ•ด ๋‹ค๋ฅธ ๊ตฌํ˜„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด๋„ ๋””ํดํŠธ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ์ž์—์„œ "์ผ๋‹จ" ๋””ํดํŠธ ์˜์กด ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋‹ค ๋งŒ๋“ค์–ด๋ฒ„๋ฆฐ๋‹ค (๋น„๋ก ๋ฐ”๋กœ ๋Œ€์ฒด๋œ๋‹ค ํ•˜๋”๋ผ๋„!)
    • ์ž๋™ ์ƒ์„ฑ์˜ ๋ถ€๋‹ด์„ ๋ฌด์‹œํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ๋””ํดํŠธ ์˜์กด ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์•„์˜ˆ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์„ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉ
    • ex) @PostConstructor ์ดˆ๊ธฐํ™” ๋ฉ”์†Œ๋“œ๋ฅผ ์ด์šฉํ•ด ํ”„๋กœํผํ‹ฐ๊ฐ€ ์„ค์ •๋๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋””ํดํŠธ ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ

7.3 ์„œ๋น„์Šค ์ถ”์ƒํ™” ์ ์šฉ


JAXB ์™ธ์—๋„ ์‹ค์ „์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” XML๊ณผ ์ž๋ฐ” ์˜ค๋ธŒ์ ํŠธ ๋งคํ•‘ ๊ธฐ์ˆ  : Castor, JiBX, XmlBeans, Xstream


OXM Object-XML Mapping
  • XML๊ณผ ์ž๋ฐ” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋งคํ•‘ํ•ด์„œ ์ƒํ˜ธ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๊ธฐ์ˆ 


๋ฆฌ์†Œ์Šค ์ถ”์ƒํ™”

์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์„ ๋‹จ์ผ ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋ฉ”์†Œ๋“œ๋กœ ์ถ”์ƒํ™”

  • ์Šคํ”„๋ง์—์„œ๋Š” ์ž๋ฐ”์— ์กด์žฌํ•˜๋Š” ์ผ๊ด€์„ฑ ์—†๋Š” ๋ฆฌ์†Œ์Šค ์ ‘๊ทผ API๋ฅผ ์ถ”์ƒํ™”ํ•ด์„œ Resource ์ถ”์ƒํ™” ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜

    • But, Resource๋Š” ์Šคํ”„๋ง์—์„œ ๋นˆ์ด ์•„๋‹ˆ๋ผ ๊ฐ’์œผ๋กœ ์ทจ๊ธ‰

    • ResourceLoader : ๋ฌธ์ž์—ด ์•ˆ์— ๋ฆฌ์†Œ์Šค ์ข…๋ฅ˜/์œ„์น˜๋ฅผ ํ‘œํ˜„ํ•˜๋ฉฐ ์ •์˜๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์‹ค์ œ Resource ํƒ€์ž… ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€ํ™˜

      ResourceLoader๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ์ ‘๋‘์‚ฌ ์˜ˆ
      ์ ‘๋‘์–ด ์˜ˆ ์„ค๋ช…
      file: file:C:/temp/file.txt ํŒŒ์ผ ์‹œ์Šคํ…œ์•ˆ์˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ
      classpath: classpath:file.txt ํด๋ž˜์ŠคํŒจ์Šค์˜ ๋ฃจํŠธ์— ์กด์žฌํ•˜๋Š” ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ

| X | WEB-INF/test.dat | ์ ‘๋‘์–ด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ, ResourceLoader ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋ฆฌ์†Œ์Šค ์œ„์น˜ ๊ฒฐ์ • | | http: | http://www.testserver.com/test.dat | HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์›น์ƒ์˜ ๋ฆฌ์†Œ์Šค ์ง€์ • |

์Šคํ”„๋ง์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ ์—ญ์‹œ `ResourceLoader` ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†

7.4 ์ธํ„ฐํŽ˜์ด์Šค ์ƒ์†์„ ํ†ตํ•œ ์•ˆ์ „ํ•œ ๊ธฐ๋Šฅํ™•์žฅ


DI์™€ ์ธํ„ฐํŽ˜์ด์Šค ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • DI๋ฅผ ์ ์šฉํ•  ๋•Œ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ, ๋‘ ๊ฐœ์˜ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋А์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋ผ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ

  • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
    • ๋‹คํ˜•์„ฑ : ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ตฌํ˜„์„ ๋ฐ”๊ฟ”๊ฐ€๋ฉด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ

    • ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™์„ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์™€ ์˜์กด ์˜ค๋ธŒ์ ํŠธ ์‚ฌ์ด์˜ ๊ด€๊ณ„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ

      * ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™ : Interface Segregation Principle. ์˜ค๋ธŒ์ ํŠธ ๊ทธ ์ž์ฒด๋กœ ์ถฉ๋ถ„ํžˆ ์‘์ง‘๋„๊ฐ€ ๋†’์€ ์ž‘์€ ๋‹จ์œ„๋กœ ์„ค๊ณ„๋๋”๋ผ๋„, ๋ชฉ์ ๊ณผ ๊ด€์‹ฌ์ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ด๋ฅผ ์ ์ ˆํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•ด์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค


7.5 DI๋ฅผ ์ด์šฉํ•ด ๋‹ค์–‘ํ•œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์ ์šฉํ•˜๊ธฐ



๐ŸŒฑ Branch chapter07/refactor7.5์— ์‹ค์Šต ์ ์šฉ



1. ConcurrentHashMap์„ ์ด์šฉํ•œ ์ˆ˜์ • ๊ฐ€๋Šฅ SQL ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ
  • ๊ธฐ์กด HashMap์œผ๋กœ๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™์‹œ์— ์ˆ˜์ •์„ ์‹œ๋„ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •๊ณผ ๋™์‹œ์— ์š”์ฒญํ•˜๋Š” ๊ฒฝ์šฐ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค

  • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ HashMap์„ ์กฐ์ž‘ํ•˜๋ ค๋ฉด Collections.synchronizedMap() ๋“ฑ์„ ์ด์šฉํ•ด ์™ธ๋ถ€์—์„œ ๋™๊ธฐํ™”ํ•ด์ค˜์•ผ ํ•จ

  • ๊ทธ๋ž˜์„œ ๋™๊ธฐํ™”๋œ ํ•ด์‹œ ๋ฐ์ดํ„ฐ ์กฐ์ž‘์— ์ตœ์ ํ™”๋˜๋„๋ก ๋งŒ๋“ค์–ด์ง„ ConcurrentHashMap์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ผ๋ฐ˜์ ์œผ๋กœ ๊ถŒ์žฅ

    * ConcurrentHashMap : ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ์‹œ ์ „์ฒด ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋ฝ์„ ๊ฑธ์ง€ ์•Š๊ณ  ์กฐํšŒ๋Š” ๋ฝ์„ ์•„์˜ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ์–ด๋А ์ •๋„ ์•ˆ์ „ํ•˜๋ฉด์„œ ์„ฑ๋Šฅ์ด ๋ณด์žฅ๋˜๋Š” ๋™๊ธฐํ™”๋œ HashMap์œผ๋กœ ์ด์šฉํ•˜๊ธฐ ์ ๋‹น


2. ๋‚ด์žฅํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ด์šฉํ•œ SQL ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ
  • ConcurrentHashMap๋Š” ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ๋งŽ์•„์ง€๊ณ  ์žฆ์€ ์กฐํšŒ&๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ํ™˜๊ฒฝ์—์„œ ํ•œ๊ณ„

  • DB์˜ ์žฅ์ ๊ณผ ํŠน์ง•์€ ๊ทธ๋Œ€๋กœ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉด์„œ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์™ธ๋ถ€์— ๋ณ„๋„๋กœ ์„ค์น˜ํ•˜๊ณ  ์…‹์—…ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€ ์—†๋Š” ๋‚ด์žฅํ˜• DB ์‚ฌ์šฉ

    * ๋‚ด์žฅํ˜• DB : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋‚ด์žฅ๋˜์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ•จ๊ป˜ ์‹œ์ž‘๋˜๊ณ  ์ข…๋ฃŒ๋˜๋Š” DB

  • ์Šคํ”„๋ง ๋นˆ์—๋Š” ํŒฉํ† ๋ฆฌ ๋นˆ์„ ๋งŒ๋“œ๋Š” ๋ฒˆ๊ฑฐ๋กœ์šด ์ž‘์—…์„ ๋Œ€์‹ ํ•ด์ฃผ๋Š” ์ „์šฉ ํƒœ๊ทธ๊ฐ€ ์กด์žฌํ•œ๋‹ค

    <jdbc:embedded-database id=โ€embeddedDatabaseโ€ type=โ€HSQLโ€>
        <jdbc:script location=โ€classpath:schema.sqlโ€/>
    </jdbc:embedded-database>

3. ํŠธ๋žœ์žญ์…˜ ์ ์šฉ
  • ์Šคํ”„๋ง์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉํ•  ๋•Œ ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„๊ฐ€ DAO ๋ฐ–์— ์žˆ๊ณ  ๋ฒ”์œ„๊ฐ€ ๋„“์€ ๊ฒฝ์šฐ๋ผ๋ฉด AOP๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜๊ฒ ์ง€๋งŒ, SQL ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋ผ๋Š” ์ œํ•œ๋œ ์˜ค๋ธŒ์ ํŠธ ๋‚ด์—์„œ ์„œ๋น„์Šค์— ํŠนํ™”๋œ ๊ฐ„๋‹จํ•œ ํŠธ๋žœ์žญ์…˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ฐ„๋‹จํžˆ ํŠธ๋žœ์žญ์…˜ ์ถ”์ƒํ™” API๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ํŽธ๋ฆฌ

7.6 ์Šคํ”„๋ง 3.1์˜ DI



๐ŸŒฑ Branch chapter07/refactor7.6์— ์‹ค์Šต ์ ์šฉ



์ž๋ฐ” ์–ธ์–ด์˜ ๋ณ€ํ™”๊ฐ€ DI ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์„œ ์Šคํ”„๋ง์˜ ์‚ฌ์šฉ๋ฐฉ์‹์— ์ค€ ์˜ํ–ฅ

  • ์–ด๋…ธํ…Œ์ด์…˜์˜ ๋ฉ”ํƒ€์ •๋ณด ํ™œ์šฉ
    • ์ž๋ฐ” ์ฝ”๋“œ์˜ ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๋ฐ์ดํ„ฐ๋กœ ํ™œ์šฉํ•˜๋Š” ์Šคํƒ€์ผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์ด ๋งŽ์ด ํ™œ์šฉ๋˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉฐ, ์–ด๋…ธํ…Œ์ด์…˜์„ ์ ๊ทน ํ™œ์šฉํ–ˆ๋‹ค
    • ์–ด๋…ธํ…Œ์ด์…˜ : ์„ ์–ธ๋งŒ์œผ๋กœ ๋‹ค์–‘ํ•œ ๋ถ€๊ฐ€ ์ •๋ณด๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, XML์ฒ˜๋Ÿผ ๋‹จ์ˆœ ํ…์ŠคํŠธ๋กœ ์ž‘์„ฑ๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ฒˆ๊ฑฐ๋กญ๊ณ  ์•ˆ์ „ํ•˜์ง€ ๋ชปํ•ด์„œ ๋Œ€๋น„๋จ
      • ์–ด๋…ธํ…Œ์ด์…˜์˜ ๋‹จ์ ? ์ž๋ฐ” ์ฝ”๋“œ์ƒ์— ์กด์žฌํ•˜๋ฏ€๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ํด๋ž˜์Šค๋ฅผ ์ƒˆ๋กœ ์ปดํŒŒ์ผํ•ด์ค˜์•ผ ํ•œ๋‹ค
  • ์ •์ฑ…๊ณผ ๊ด€๋ก€๋ฅผ ์ด์šฉํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
    • ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋งŽ์€ ๊ทœ์น™๊ณผ ๊ด€๋ก€๋ฅผ ๊ธฐ์–ตํ•ด์•ผํ•˜๊ณ , ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ๋ณด๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ• ์ง€ ์ดํ•ดํ•ด์•ผํ•˜๋Š” ๋ถ€๋‹ด์„ ์ฃผ๊ธฐ๋„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์Šคํƒ€์ผ์˜ ๋ณ€ํ™”


์•ž์œผ๋กœ์˜ Goals

์ง€๊ธˆ๊นŒ์ง€ ๋ฐœ์ „์‹œ์ผœ์˜จ ์‚ฌ์šฉ์ž DAO์™€ ์„œ๋น„์Šค ๊ธฐ๋Šฅ์˜ ์˜ˆ์ œ ์ฝ”๋“œ๋ฅผ ์Šคํ”„๋ง 3.1์˜ DI ์Šคํƒ€์ผ๋กœ ๋ฆฌํŒฉํ† ๋ง


ํ…Œ์ŠคํŠธ ์ปจํ…์ŠคํŠธ์˜ ๋ณ€๊ฒฝ
  • @ContextConfiguration : ์Šคํ”„๋ง ํ…Œ์ŠคํŠธ๊ฐ€ ํ…Œ์ŠคํŠธ์šฉ DI ์ •๋ณด๋ฅผ ์–ด๋””์„œ ๊ฐ€์ ธ์™€์•ผํ•˜๋Š”์ง€ ์ง€์ •ํ•  ๋•Œ ์‚ฌ์šฉ
  • @ImportResource : XML์˜ ์„ค์ •์ •๋ณด๋ฅผ ์ž๋ฐ” ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ง„ DI ์„ค์ •์ •๋ณด๋กœ ๊ฐ€์ ธ์˜ค๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค
<bean>์˜ ์ „ํ™˜
  • <bean>์œผ๋กœ ์ •์˜๋œ DI ์ •๋ณด -> @Bean์ด ๋ถ™์€ public ๋ฉ”์†Œ๋“œ์™€ ๊ฑฐ์˜ 1:1 ๋งคํ•‘
    • @Bean ๋ฉ”์†Œ๋“œ ํŠน์ง•
      • bean์˜ ์•„์ด๋””๋Š” ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์œผ๋กœ ์„ค์ •
      • ๋ฆฌํ„ด ํƒ€์ž…์€ ๊ตฌํ˜„์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž… ์‚ฌ์šฉ
      • ํ”„๋กœํผํ‹ฐ(์†์„ฑ)์ด ์—†๋‹ค๋ฉด ์˜ค๋ธŒ์ ํŠธ ์ƒ์„ฑ๊ณผ ๋™์‹œ์— ๋ฐ”๋กœ ๋ฆฌํ„ด ๊ฐ€๋Šฅ
      • ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋กœ์ปฌ ๋ณ€์ˆ˜(์ธํ„ฐํŽ˜์ด์Šค X, ๊ตฌํ˜„์ฒดO)๋กœ ๋ฐ›์•„๋‘์–ด์•ผํ•จ
ํ•„๋“œ ์ฃผ์ž…
  • @Autowired : ํ•„๋“œ์˜ ํƒ€์ž…์„ ๊ธฐ์ค€์œผ๋กœ ๋นˆ์„ ์ฐพ์Œ
  • @Resource : ํ•„๋“œ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ๋นˆ์„ ์ฐพ์Œ
<tx:annotation-driven />์˜ ์ „ํ™˜
  • <tx:annotation-driven />์œผ๋กœ ์ •์˜๋œ ์ •๋ณด -> @EnableTransactionManagement



๋นˆ ์Šค์บ๋‹๊ณผ ์ž๋™ ์™€์ด์–ด๋ง

@Autowired๋ฅผ ์ด์šฉํ•œ ์ž๋™ ์™€์ด์–ด๋ง
  • ๊ธฐ์กด์˜ @Autowired๋Š” ์Šคํ”„๋ง ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค๋‚˜ DI ์„ค์ •์šฉ @Configuration ํด๋ž˜์Šค์—์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ƒ์„ฑํ•œ ๋นˆ์„ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•„๋“œ๋กœ ์ฃผ์ž…๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

  • ๊ธฐ์กด์— ๋นˆ์˜ ํ”„๋กœํผํ‹ฐ์— ๋‹ค๋ฅธ ๋นˆ์„ ๋„ฃ์–ด์„œ ๋Ÿฐํƒ€์ž„ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•

    • <bean>์˜ <property>๋ฅผ ์‚ฌ์šฉํ•ด ์ •์˜
    • ์ž๋ฐ” ์ฝ”๋“œ๋กœ ์ง์ ‘ ์ˆ˜์ •์ž ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ
  • @Autowired๋Š” ์ž๋™ ์™€์ด์–ด๋ง ๊ธฐ๋ฒ•์„ ์ด์šฉํ•ด์„œ ์กฐ๊ฑด์— ๋งž๋Š” ๋นˆ์„ ์ฐพ์•„ ์ž๋™์œผ๋กœ ์ˆ˜์ •์ž ๋ฉ”์†Œ๋“œ๋‚˜ ํ•„๋“œ์— ๋„ฃ์–ด์คŒ

    • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ด๋ฆ„/ํƒ€์ž…์„ ๊ธฐ์ค€์œผ๋กœ ์ฃผ์ž…๋  ๋นˆ์„ ์ฐพ์•„์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋นˆ์˜ ํ”„๋กœํผํ‹ฐ ์„ค์ •์„ ์ง์ ‘ ํ•ด์ฃผ๋Š” ์ž๋ฐ” ์ฝ”๋“œ๋‚˜ XML ์–‘์„ ๋Œ€ํญ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค

    • ํ•˜์ง€๋งŒ ๋นˆ ์„ค์ •์ •๋ณด๋ฅผ ๋ณด๊ณ  ๋‹ค๋ฅธ ๋นˆ๊ณผ ์˜์กด๊ด€๊ณ„๊ฐ€ ์–ด๋–ป๊ฒŒ ๋งบ์–ด์ ธ ์žˆ๋Š”์ง€ ํ•œ๋ˆˆ์— ํŒŒ์•…ํ•˜๊ธฐ ํž˜๋“ค๋‹ค

      @Autowired			// dao.setDataSource(dataSource); ์—†์ด ์ž๋™์œผ๋กœ ๋นˆ์„ ์ฐพ์•„ ์ฃผ์ž…๋œ๋‹ค
      public void setDataSource(DataSource dataSource){
          this.jdbcTemplate = new JdbcTemplate(dataSource);
      }
@Component๋ฅผ ์ด์šฉํ•œ ์ž๋™ ๋นˆ ๋“ฑ๋ก
  • @Component๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋Š” ๋นˆ ์Šค์บ๋„ˆ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค
    • ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋  ํ›„๋ณด ํด๋ž˜์Šค์— ๋ถ™์—ฌ์ฃผ๋Š” ์ผ์ข…์˜ ๋งˆ์ปค : marker๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค
  • ํ”„๋กœ์ ํŠธ ๋‚ด์˜ ๋ชจ๋“  ํด๋ž˜์ŠคํŒจ์Šค๋ฅผ ๋‹ค ๋’ค์ ธ์„œ @Component๋ฅผ ์ฐพ๊ธฐ์—๋Š” ๋ถ€๋‹ด์ด ๋งŽ๋‹ค -> @ComponentScan ์‚ฌ์šฉ
    • @ComponentScan์˜ basePackages ์—˜๋ฆฌ๋จผํŠธ : @Component๊ฐ€ ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์Šค์บ”ํ•  ๊ธฐ์ค€ ํŒจํ‚ค์ง€๋ฅผ ์ง€์ •

* ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜

์–ด๋…ธํ…Œ์ด์…˜์˜ ์ •์˜์— ๋ถ€์—ฌ๋œ ์–ด๋…ธํ…Œ์ด์…˜

์—ฌ๋Ÿฌ ๊ฐœ์˜ ์–ด๋…ธํ…Œ์ด์…˜์— ๊ณตํ†ต์ ์ธ ์†์„ฑ์„ ๋ถ€์—ฌํ•  ๋•Œ ๋ฉ”ํƒ€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ด์šฉ


โ“ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ๊ณผ ์šด์˜ ํ™˜๊ฒฝ์—์„œ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋นˆ ์ •์˜๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  • ์–‘์ชฝ์— ๋ชจ๋‘ ํ•„์š”ํ•˜๋ฉด์„œ ๋นˆ์˜ ๋‚ด์šฉ์ด ๋‹ฌ๋ผ์ ธ์•ผํ•˜๋Š” ๊ฒฝ์šฐ์— ๋นˆ ์„ค์ • ์ •๋ณด ์ž‘์„ฑ์ด ๊ณค๋ž€ํ•ด์ง„๋‹ค
  • ๋นˆ ์„ค์ •์ •๋ณด๊ฐ€ ๋‹ฌ๋ผ์ ธ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ํŒŒ์ผ์„ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ์ชผ๊ฐœ๊ณ  ์กฐํ•ฉํ•˜๋Š” ๋“ฑ์˜ ๋ฒˆ๊ฑฐ๋กœ์šด ๋ฐฉ๋ฒ• ๋Œ€์‹ , ๊ฐ„๋‹จํžˆ ์„ค์ •์ •๋ณด๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณต : @Profile, @ActiveProfiles
    • ์‹คํ–‰ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋นˆ ๊ตฌ์„ฑ์ด ๋‹ฌ๋ผ์ง€๋Š” ๋‚ด์šฉ์„ ํ”„๋กœํŒŒ์ผ๋กœ ์ •์˜ํ•ด์„œ ๋งŒ๋“ค์–ด๋‘๊ณ , ์‹คํ–‰ ์‹œ์ ์—์„œ ์–ด๋–ค ํ”„๋กœํŒŒ์ผ์˜ ๋นˆ ์„ค์ •์„ ์‚ฌ์šฉํ• ์ง€ ์ง€์ •
โš ๏ธ **GitHub.com Fallback** โš ๏ธ