๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„

[๋ฉด์ ‘์ด์ •๋ฆฌ] ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ธํ„ฐ๋ทฐ ๋Œ€๋น„ ์ด์ •๋ฆฌ ์ž๋ฃŒ - โ‘ฆ ๋ฐฑ์—”๋“œ(Java Spring ๊ธฐ๋ฐ˜)

๊ฐœ๋ฐœ์ž HOON 2022. 10. 31. 20:04

๐Ÿง‘๐Ÿป‍๐Ÿ’ป ๊ธ€์„ ์‹œ์ž‘ํ•˜๊ธฐ์— ์•ž์„œ..

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

 

 

๐Ÿง‘๐Ÿป‍๐Ÿ’ป ๋ฐฑ์—”๋“œ ๋ฉด์ ‘ ์งˆ๋ฌธ

๐Ÿ’ก Spring ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์ž๋ฐ” ํ”Œ๋žซํผ์„ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ POJO ๊ธฐ๋ฐ˜์„ ๋ฐ”ํƒ•์œผ๋กœ, DI์™€ AOP, PSA๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ๋Ÿ‰์˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

๋™์ ์ธ ์›น์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก IoC(Inversion of Control, ์ œ์–ด์˜ ์—ญ์ „)์ด ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

๊ฐ์ฒด์˜ ์ƒ์„ฑ๋ถ€ํ„ฐ ์ƒ๋ช…์ฃผ๊ธฐ์˜ ๊ด€๋ฆฌ๊นŒ์ง€ ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์ด ๋ฐ”๋€ ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ •ํ™•ํžˆ ์„ค๋ช…ํ•˜๋ฉด, ๋””์ž์ธ ์›์น™ ์ค‘ ํ•˜๋‚˜๋กœ ํด๋ž˜์Šค๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์ œ์–ด๋ฅผ ๋ฐ˜์ „์‹œํ‚ฌ ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์˜ ๊ธ€ ์ฐธ๊ณ .

2022.10.10 - [๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend] - [Spring] ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, DI / IoC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (์˜์กด์„ฑ ์ฃผ์ž…, ์ œ์–ด์˜ ์—ญ์ „)

 

[Spring] ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, DI / IoC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (์˜์กด์„ฑ ์ฃผ์ž…, ์ œ์–ด์˜ ์—ญ์ „)

๐Ÿ 0. ์„œ๋ก  ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, DI์™€ IoC ๋Š” ํ•œ ๋ฒˆ์ฏค์€ ๋“ค์–ด๋ณด์•˜์„ ํ‚ค์›Œ๋“œ์ด๋‹ค. "์Šคํ”„๋ง์ด๋ž€ IoC์™€ AOP๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ๋Ÿ‰์˜ ์ปจํ…Œ์ด๋„ˆ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค." - ์Šคํ”„๋ง์— ๋Œ€ํ•œ ํ•œ

hoons-dev.tistory.com

 

 

 

๐Ÿ’ก DI(Dependency Injection, ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…)๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

IoC๊ฐ€ ๋””์ž์ธ ์›์น™์ด๋ผ๋ฉด, DI๋Š” IoC๋ฅผ ๊ตฌํ˜„ํ•  ๋•Œ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” '๋””์ž์ธ ํŒจํ„ด' ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. DI๋Š” ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…์œผ๋กœ, ์˜์กด ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์ƒ์„ฑ์ž๋‚˜ setter๋ฅผ ํ†ตํ•ด ๋„ฃ์–ด์คŒ์œผ๋กœ์จ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

  • ์ˆ˜์ •์ž ์ฃผ์ž…
    • ๋Œ€๋ถ€๋ถ„ ์˜์กด ๊ด€๊ณ„ ์ฃผ์ž…์€ ํ•œ๋ฒˆ ์ผ์–ด๋‚˜๋ฉด ์ข…๋ฃŒ์‹œ์ ๊นŒ์ง€ ๋ณ€๊ฒฝํ•  ์ผ์ด ๊ฑฐ์˜ ์—†๋‹ค.
    • Setter๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•˜๊ฒŒ ๋˜๋ฉด ๋ณ€๊ฒฝ๋  ์œ„ํ—˜์ด ์กด์žฌ
    • setter์„ public์œผ๋กœ ์—ด์–ด์•ผํ•จ
  • ์ƒ์„ฑ์ž ์ฃผ์ž…
    • ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅ
    • ์ƒ์„ฑ์ž ํ˜ธ์ถœ ์‹œ์ ์— ๋”ฑ 1๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅ
    • final ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ๋ถˆ๋ณ€ํ•˜๊ฒŒ ์„ค๊ณ„ ๊ฐ€๋Šฅ
    • ์˜์กด์„ฑ ์ฃผ์ž…์ด ๋ˆ„๋ฝ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Œ(IDE์—์„œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋กœ ์•Œ๋ ค์คŒ)

 

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์˜ ๊ธ€ ์ฐธ๊ณ .

2022.10.10 - [๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend] - [Spring] ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, DI / IoC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (์˜์กด์„ฑ ์ฃผ์ž…, ์ œ์–ด์˜ ์—ญ์ „)

 

[Spring] ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, DI / IoC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (์˜์กด์„ฑ ์ฃผ์ž…, ์ œ์–ด์˜ ์—ญ์ „)

๐Ÿ 0. ์„œ๋ก  ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, DI์™€ IoC ๋Š” ํ•œ ๋ฒˆ์ฏค์€ ๋“ค์–ด๋ณด์•˜์„ ํ‚ค์›Œ๋“œ์ด๋‹ค. "์Šคํ”„๋ง์ด๋ž€ IoC์™€ AOP๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ๋Ÿ‰์˜ ์ปจํ…Œ์ด๋„ˆ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค." - ์Šคํ”„๋ง์— ๋Œ€ํ•œ ํ•œ

hoons-dev.tistory.com

 

 

 

 

๐Ÿ’ก Spring์—์„œ IoC์™€ DI๋ฅผ ์–ด๋–ป๊ฒŒ ์ง€์›ํ•ด ์ฃผ๋Š”์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

์Šคํ”„๋ง์€ IoC์™€ DI๋ฅผ DI(IoC) Container๋กœ์จ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค ์‚ฌ์ด์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ Bean ์„ค์ • ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

  • ์žฅ์ 
    • ์Šคํ”„๋ง ์ž์ฒด์—์„œ ์„ค์ •์„ ํ†ตํ•ด ์—ฐ๊ด€ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์คŒ์œผ๋กœ์จ ๊ฐ์ฒด๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถฐ์ค€๋‹ค.
    • ํด๋ž˜์Šค์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’์ด๊ณ , ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํŽธ๋ฆฌํ•ด์ง„๋‹ค.
    • ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ์ธํ•ด stub, mock ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด unit ํ…Œ์ŠคํŠธ์˜ ์ด์ ์ด ์ƒ๊ธด๋‹ค.
  • ๋‹จ์ 
    • ์˜์กด์„ฑ ์ฃผ์ž…์„ ์œ„ํ•œ ์„ ํ–‰ ์ž‘์—…์ด ํ•„์š”ํ•ด ๊ฐ„๋‹จํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ๋ฒˆ๊ฑฐ๋กญ๋‹ค.
    • ์ฝ”๋“œ ์ถ”์ ์ด ์–ด๋ ต๋‹ค.

 

DI ์ปจํ…Œ์ด๋„ˆ๋Š”, ์ž๋ฐ” ๊ฐ์ฒด์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ƒ์„ฑ๋œ ์ž๋ฐ” ๊ฐ์ฒด๋“ค์—๊ฒŒ ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ข…๋ฅ˜๋Š”, BeanFactory์™€ ApplicationContext๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ApplicationContext๊ฐ€ BeanFactory์˜ ๋นˆ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ƒ์† ๋ฐ›๊ณ  ๊ตญ์ œํ™” ๋“ฑ์˜ ์ถ”๊ฐ€๊ธฐ๋Šฅ์„ ๊ฐ–๊ณ  ์žˆ์–ด ApplicationContext๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜์˜ ๊ธ€ ์ฐธ๊ณ .

2022.10.10 - [๐ŸŒฑ ๋ฐฑ์—”๋“œ : Backend] - [Spring] ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, DI / IoC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (์˜์กด์„ฑ ์ฃผ์ž…, ์ œ์–ด์˜ ์—ญ์ „)

 

[Spring] ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ๊ฐœ๋…, DI / IoC๋ž€ ๋ฌด์—‡์ธ๊ฐ€? (์˜์กด์„ฑ ์ฃผ์ž…, ์ œ์–ด์˜ ์—ญ์ „)

๐Ÿ 0. ์„œ๋ก  ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•ด ํ•™์Šตํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, DI์™€ IoC ๋Š” ํ•œ ๋ฒˆ์ฏค์€ ๋“ค์–ด๋ณด์•˜์„ ํ‚ค์›Œ๋“œ์ด๋‹ค. "์Šคํ”„๋ง์ด๋ž€ IoC์™€ AOP๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ๋Ÿ‰์˜ ์ปจํ…Œ์ด๋„ˆ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค." - ์Šคํ”„๋ง์— ๋Œ€ํ•œ ํ•œ

hoons-dev.tistory.com

 

 

 

๐Ÿ’ก Bean ๊ฐ์ฒด์™€ Bean ์ƒ๋ช…์ฃผ๊ธฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

DI ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์— ์กด์žฌํ•˜๋ฉฐ ๊ด€๋ฆฌ๋ฅผ ๋ฐ›๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. @Bean ์–ด๋…ธํ…Œ์ด์…˜์„ ๋“ฑ๋กํ•ด ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, xml์„ ํ†ตํ•ด ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Bean์œผ๋กœ ๋“ฑ๋ก๋œ ๊ฐ์ฒด๋Š” ์‰ฝ๊ฒŒ ์ฃผ์ž…ํ•˜์—ฌ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

Bean์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

 

 

 

๐Ÿ’ก Annotation์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. annotation์„ ์ •์˜ํ•˜๊ณ , ์›ํ•˜๋Š” ์œ„์น˜์— ๋ฐฐ์น˜ํ•œ ํ›„, ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋„์ค‘ ์ž๋ฐ” ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ด์šฉํ•ด ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ํš๋“ํ•ด ๊ธฐ๋Šฅ์„ ์‹ค์‹œํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘๋ฉ๋‹ˆ๋‹ค.

 

Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ฐ์ฒด๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด, ๊ฐ์ฒด์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋•Œ ์ž๋ฐ” ๋ฆฌํ”Œ๋ ‰์…˜์ด ํ•„์š”ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก Spring์—์„œ ์ œ๊ณตํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ Annotation ๋ช‡ ๊ฐ€์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค์–ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
  • @ComponentScan
    • @Component, @Service, @Repository, @Controller, @Configuration์ด ๋ถ™์€ ํด๋ž˜์Šค Bean๋“ค์„ ์ฐพ์•„์„œ Context์— bean์„ ๋“ฑ๋กํ•ด์ฃผ๋Š” ์• ๋…ธํ…Œ์ด์…˜
    • ์ „๋ถ€ ๋‹ค @Component๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  @Repository ๋“ฑ์œผ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”, ์˜ˆ๋ฅผ ๋“ค์–ด @Repository๋Š” DAO์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” unchecked exception๋“ค์„ ์Šคํ”„๋ง์˜ DataAccessException์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
    • ๋˜ํ•œ ๊ฐ€๋…์„ฑ์—์„œ๋„ ํ•ด๋‹น ์• ๋…ธํ…Œ์ด์…˜์„ ๊ฐ–๋Š” ํด๋ž˜์Šค๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ๋‹จ ๋ฒˆ์— ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • @EnableAutoConfiguration
    • autoConfiguration๋„ Configuration์ค‘ ํ•˜๋‚˜์— ํ•ด๋‹นํ•œ๋‹ค.
    • spring.factories ๋‚ด๋ถ€์— ์—ฌ๋Ÿฌ Configuration๋“ค์ด ์žˆ๊ณ  ์กฐ๊ฑด์— ๋”ฐ๋ผ Bean์ด ๋“ฑ๋ก๋˜๊ฒŒ ๋˜๋Š”๋ฐ ๋ฉ”์ธ ํด๋ž˜์Šค @SpringBootApplication์„ ์‹คํ–‰ํ•˜๋ฉด @EnableAutoConfiguration์— ์˜ํ•ด spring.factories ์•ˆ์— ์žˆ๋Š” ์ˆ˜๋งŽ์€ ์ž๋™ ์„ค์ •๋“ค์ด ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ ์šฉ๋˜์–ด ์ˆ˜ ๋งŽ์€ Bean๋“ค์ด ์ƒ์„ฑ๋œ๋‹ค.
    • ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด, Application Context๋ฅผ ๋งŒ๋“ค ๋•Œ ์ž๋™์œผ๋กœ ๋นˆ์„ค์ •์ด ๋˜๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.
  • @Component
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ž‘์„ฑํ•œ class๋ฅผ Bean์œผ๋กœ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์• ๋…ธํ…Œ์ด์…˜
  • @Bean
    • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ œ์–ด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ฑ์„ bean์œผ๋กœ ๋งŒ๋“ค๋ คํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์• ๋…ธํ…Œ์ด์…˜
  • @Configuration
    • @Configuration์„ ํด๋ž˜์Šค์— ์ ์šฉํ•˜๊ณ  @Bean์„ ํ•ด๋‹น class์˜ ๋ฉ”์„œ๋“œ์— ์ ์šฉํ•˜๋ฉด @autowired๋กœ Bean์„ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ๋‹ค.
  • @Autowired
    • ์Šคํ”„๋ง์ด Type์— ๋”ฐ๋ผ ์•Œ์•„์„œ Bean์„ ์ฃผ์ž…ํ•ด์ค€๋‹ค.
    • Type์„ ๋จผ์ € ํ™•์ธํ•œ ํ›„ ๋ชป ์ฐพ์œผ๋ฉด Name์— ๋”ฐ๋ผ ์ฃผ์ž…ํ•œ๋‹ค.
    • ๊ฐ•์ œ๋กœ ์ฃผ์ž…ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ @Qulifier์„ ๊ฐ™์ด ๋ช…์‹œ
  • @Qualifier
    • ๊ฐ™์€ ํƒ€์ž…์˜ ๋นˆ์ด ๋‘ ๊ฐœ ์ด์ƒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ์Šคํ”„๋ง์ด ์–ด๋–ค ๋นˆ์„ ์ฃผ์ž…ํ•ด์•ผํ•  ์ง€ ์•Œ ์ˆ˜ ์—†์–ด์„œ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • @Qualifier๋Š” @Autowired์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ™•ํžˆ ์–ด๋–ค bean์„ ์‚ฌ์šฉํ• ์ง€ ์ง€์ •ํ•˜์—ฌ ํŠน์ • ์˜์กด ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • @Resource
    • @Autowired์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Bean ๊ฐ์ฒด๋ฅผ ์ฃผ์ž…ํ•ด์ฃผ๋Š”๋ฐ ์ฐจ์ด์ ์€ Autowired๋Š” ํƒ€์ž…์œผ๋กœ, Resource๋Š” ์ด๋ฆ„์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.
    • ์• ๋…ธํ…Œ์ด์…˜ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ํŠน์ • Framework์— ์ข…์†์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด์„œ @Resource ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.
  • @Controller
    • API์™€ view๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ
    • ๋ณดํ†ต view ํ™”๋ฉด return์„ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • @RestController
    • view๊ฐ€ ํ•„์š” ์—†์ด API๋งŒ ์ง€์›ํ•˜๋Š” ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ
  • @SpringBootApplication
    • @Configuration, @EnableAutoConfiguration, @ComponentScan 3๊ฐ€์ง€๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์นœ ์• ๋…ธํ…Œ์ด์…˜

 

 

๐Ÿ’ก ์›น ์„œ๋ฒ„์™€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์•Œ๊ณ  ๊ณ„์‹œ๋‚˜์š”?

๋”๋ณด๊ธฐ
  • ์›น ์„œ๋ฒ„
    • ์ •์  ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„
  • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„(WAS)
    • ์›น ์„œ๋ฒ„๊ฐ€ ํ•˜๋Š” ์ผ + ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ์ง(DB ์—ฐ๊ฒฐ, ๋™์ž‘ ์ˆ˜ํ–‰, ๋ฐ์ดํ„ฐ ์ œ๊ณต)๊นŒ์ง€ ์ œ๊ณตํ•˜์—ฌ ๋™์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ์„œ๋ฒ„
    • ์ž๋ฐ” ์ง„์˜์—์„œ๋Š” ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉด WAS ๋ผ๊ณ  ํ•œ๋‹ค.
    • ์œ„ ๊ทธ๋ฆผ์—๋Š” ์—†์ง€๋งŒ WAS ์•ˆ์—๋„ ์›น ์„œ๋ฒ„๊ฐ€ ๋”ฐ๋กœ ์กด์žฌํ•œ๋‹ค.

 

 

๐Ÿ’ก ์„œ๋ธ”๋ฆฟ๊ณผ ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

 

์›น ์„œ๋ฒ„์™€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„์˜ ์ฐจ์ด๋ฅผ ๋ณด๋ฉด, '๋™์ ์ธ ์ฒ˜๋ฆฌ'์— ๋Œ€ํ•œ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. WAS์•ˆ์—์„œ ์ด๋Ÿฌํ•œ ๋™์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์„ ์„œ๋ธ”๋ฆฟ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ธ”๋ฆฟ์ด ์กด์žฌํ•˜๊ธฐ ์ „์—๋Š” HTTP ์š”์ฒญ ๋ฉ”์‹œ์ง€๋ฅผ ํŒŒ์‹ฑํ•˜๋Š” ์ž‘์—… ๋“ฑ ์—ฌ๋Ÿฌ ๋ถ€๊ฐ€์ ์ธ ์ž‘์—…์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด์•ผ ํ•˜๋‚˜, ์„œ๋ธ”๋ฆฟ์˜ ๋“ฑ์žฅ์ดํ›„๋กœ๋Š” ์ด๋Ÿฌํ•œ ๋ถ€๊ฐ€ ์ž‘์—…์„ ์„œ๋ธ”๋ฆฟ์ด ๋Œ€์‹  ํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๋Š” ์‹ค์งˆ์ ์ธ ๋ฉ”์ธ ๋กœ์ง๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

DI Container์™€ ๋น„์Šทํ•˜๊ฒŒ, ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ๋Š” ์„œ๋ธ”๋ฆฟ์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

  1. ์‚ฌ์šฉ์ž๊ฐ€ URL์„ ํด๋ฆญํ•˜๋ฉด HTTP Request๋ฅผ Servlet Container๋กœ ๋ณด๋‚ธ๋‹ค.
  2. Servlet Container๋Š” ์“ฐ๋ ˆ๋“œ ํ’€์—์„œ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊บผ๋‚ด ํ• ๋‹น ํ•ด์ฃผ๊ณ  HttpServletRequest, HttpServletResponse ๋‘ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  3. ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ URL์„ ๋ถ„์„ํ•˜์—ฌ ์–ด๋Š ์„œ๋ธ”๋ฆฟ์— ๋Œ€ํ•œ ์š”์ฒญ์ธ์ง€ ์ฐพ๋Š”๋‹ค.
  4. ์„œ๋ธ”๋ฆฟ ์ปจํ…Œ์ด๋„ˆ์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ๊ฐ€์ ธ์™€์„œ service() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    • Spring MVC์˜ ๊ฒฝ์šฐ DispatcherServlet์ด ์ดˆ๊ธฐํ™”๋˜๊ณ  ํ˜ธ์ถœ๋œ๋‹ค.
  5. service ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰์ด ๋๋‚˜๋ฉด HttpServletResponse ๊ฐ์ฒด์— ์‘๋‹ต์„ ๋ณด๋‚ธ๋‹ค.
  6. ์‘๋‹ต์ด ์™„๋ฃŒ๋˜๋ฉด HttpServletRequest, HttpServletResponse ๊ฐ์ฒด๋ฅผ ์†Œ๋ฉธ์‹œํ‚จ๋‹ค.

 

 

๐Ÿ’ก Spring MVC์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

Spring์—์„œ ์ œ๊ณตํ•˜๋Š” ์›น ๋ชจ๋“ˆ๋กœ, Model / View / Controller ์„ธ ๊ฐ€์ง€ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž์˜ ๋‹ค์–‘ํ•œ HTTP Request๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ ํ˜•์‹์˜ ์‘๋‹ต๋ถ€ํ„ฐ REST ํ˜•์‹์˜ ์‘๋‹ต์€ ๋ฌผ๋ก , View๋ฅผ ํ‘œ์‹œํ•˜๋Š” HTML์„ Retrunํ•˜๋Š” ์‘๋‹ต๊นŒ์ง€ ๋‹ค์–‘ํ•œ ์‘๋‹ต์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” Framework์ž…๋‹ˆ๋‹ค.

 

 

  1. ํ•ธ๋“ค๋Ÿฌ ์กฐํšŒ
    • ํ•ธ๋“ค๋Ÿฌ ๋งคํ•‘์„ ํ†ตํ•ด ์š”์ฒญ URL์— ๋งคํ•‘๋œ ํ•ธ๋“ค๋Ÿฌ(์ปจํŠธ๋กค๋Ÿฌ)๋ฅผ ์กฐํšŒํ•œ๋‹ค.
  2. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์กฐํšŒ
    • ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ๋ฅผ ์กฐํšŒํ•œ๋‹ค.
  3. ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ ์‹คํ–‰
    • ์กฐํšŒํ•œ ํ•ธ๋“ค๋Ÿฌ(์ปจํŠธ๋กค๋Ÿฌ)๋ฅผ ์ธ์ž๋กœ ํ•ธ๋“ค๋Ÿฌ ์–ด๋Œ‘ํ„ฐ์— ๋„˜๊ฒจ์„œ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค.
  4. ModelAndView ๋ฐ˜ํ™˜
    • ํ•ธ๋“ค๋Ÿฌ(์ปจํŠธ๋กค๋Ÿฌ)๊ฐ€ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š” ์ •๋ณด๋กœ ModelAndView๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  5. viewResolver ํ˜ธ์ถœ
    • ์ ์ ˆํ•œ viewResolver๋ฅผ ์ฐพ๊ณ  ํ•ด๋‹น viewResolver๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
    • RestController๋ผ๋ฉด ์ด ๊ณผ์ •๊ณผ ์ดํ›„ ๊ณผ์ • ์—†์ด ์ปจ๋ฒ„ํ„ฐ๋ฅผ ์ด์šฉํ•ด ๋ฐ”๋กœ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  6. View ๋ฐ˜ํ™˜
    • viewResolver๋Š” ๋ทฐ์˜ ๋…ผ๋ฆฌ ์ด๋ฆ„์„ ๋ฌผ๋ฆฌ ์ด๋ฆ„์œผ๋กœ ๋ฐ”๊พธ๊ณ , ๋žœ๋”๋ง ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ๋ทฐ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  7. ๋ทฐ ๋žœ๋”๋ง
    • ๋ทฐ๋ฅผ ํ†ตํ•ด์„œ ๋ทฐ๋ฅผ ๋žœ๋”๋งํ•œ๋‹ค.

 

MVC ํŒจํ„ด ์žฅ๋‹จ์ 

  • ์ •์˜
    • Model, View, Controller๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜
  • ์žฅ์ 
    • ๊ณผ๊ฑฐ์—๋Š” Controller์— ๋‹ค ๋‹ด์•„๋‘๊ณ  ์ฒ˜๋ฆฌํ–ˆ๋‹ค.
    • ๊ธฐ๋Šฅ ๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ, ๊ฐ€๋…์„ฑ์„ ๋†’์ด๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  • ๋‹จ์ 
    • view์™€ model ์‚ฌ์ด์— ์˜์กด์„ฑ์ด ๋†’์•„์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ปค์งˆ์ˆ˜๋ก ๋ณต์žกํ•ด์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ต๋‹ค.
    • ๋Œ€๊ทœ๋ชจ์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ Controller์— ๋‹ค์ˆ˜์˜ Model๊ณผ View๊ฐ€ ๋ณต์žกํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์ฝ”๋“œ ๋ถ„์„๊ณผ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์›Œ ์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋Ÿฐ ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด MVVM, MVP ๊ตฌ์กฐ๊ฐ€ ๋“ฑ์žฅํ–ˆ๋‹ค.

 

 

๐Ÿ’ก ๊ทธ๋ ‡๋‹ค๋ฉด, ์–ด๋–ป๊ฒŒ ํ•˜๋‚˜์˜ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์„๊นŒ์š”?

๋”๋ณด๊ธฐ

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

 

์ฃผ์˜ํ•  ์ ์€, ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค๋Š” ์ ์€, Thread-Safeํ•˜์ง€ ์•Š๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ, ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๋„๋ก Statelessํ•˜๊ฒŒ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก + ๊ทธ๋Ÿผ ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๋”๋ณด๊ธฐ

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

 

public class Singleton {

    private static Singleton instance = new Singleton();
    
    private Singleton() {
        // ์ƒ์„ฑ์ž๋Š” ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ๋ชปํ•˜๊ฒŒ private ์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.
    }

    public static Singleton getInstance() {
        return instance;
    }

    public void say() {
        System.out.println("hi, there");
    }
}

 

๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ ์ตœ์ดˆ ํ•œ ๋ฒˆ์˜ new ์—ฐ์‚ฐ์ž๋ฅผ ํ†ตํ•ด ๊ณ ์ •๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋ฏธ ์ƒ์„ฑ๋œ ์ธ์Šคํ„ด์Šค๋ฅผ ํ™œ์šฉํ•˜๋‹ˆ ์†๋„ ์ธก๋ฉด์—๋„ ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ด์ ์œผ๋กœ๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค ๊ฐ„์— ๋ฐ์ดํ„ฐ ๊ณต์œ ๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค ์ธ์Šคํ„ด์Šค๋Š” ์ „์—ญ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ธ์Šคํ„ด์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋“ค์ด ์ ‘๊ทผํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— '๋™์‹œ์„ฑ ๋ฌธ์ œ'๊ฐ€ ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ์œ ์˜ํ•ด ์„ค๊ณ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋‹ค์‹œ ๋งํ•˜์ž๋ฉด, ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค๋Š” ์ ์€, Thread-Safeํ•˜์ง€ ์•Š๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ, ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์ €์žฅํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๋„๋ก Statelessํ•˜๊ฒŒ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

 

๐Ÿ’ก AOP์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

๊ด€์  ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์•ฝ์–ด๋กœ, ๊ณตํ†ต ๊ด€์‹ฌ์‚ฌํ•ญ๊ณผ ํ•ต์‹ฌ ๊ด€์‹ฌ์‚ฌํ•ญ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์†Œ์Šค์ฝ”๋“œ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํฉ์–ด์ง„ ๊ด€์‹ฌ์‚ฌ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ , ์ด๊ฒƒ์„ Aspect๋กœ ๋ชจ๋“ˆํ™”ํ•ด ํ•ต์‹ฌ ๋กœ์ง์—์„œ ๋ถ„๋ฆฌํ•ด ์žฌ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋กœ๊ทธ, ์„ฑ๋Šฅํ…Œ์ŠคํŠธ, ๊ถŒํ•œ, ํŠธ๋žœ์žญ์…˜ ๋“ฑ์„ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ์— ์ ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ผ์ผํžˆ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ AOP๋ฅผ ํ™œ์šฉํ•ด ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก POJO๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

๋”๋ณด๊ธฐ

Plain Old Java Object์˜ ์•ฝ์–ด๋กœ, ํ‰๋ฒ”ํ•œ ๊ตฌ์‹ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•˜์ง€ ์•Š์€ ๋‹จ์ˆœํ•œ ํด๋ž˜์Šค๋ฅผ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์œผ๋กœ, ํƒ€ ํ”„๋ ˆ์ž„์›Œํฌ์— ์ข…์†๋˜์ง€ ์•Š์•„ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๊ณ  ํ…Œ์ŠคํŠธ ์ž๋™ํ™”์— ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Spring์—์„œ๋Š” ๋„๋ฉ”์ธ๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์ƒ์ด POJO ๋Œ€์ƒ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก DAO, DTO, BO, VO์˜ ์ฐจ์ด๋ฅผ ์•Œ๊ณ  ๊ณ„์‹œ๋‚˜์š”? ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

- DAO (Data Access Object)

  • DB ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๊ฑฐ๋‚˜ ์กฐ์ž‘ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ „๋‹ดํ•˜๋Š” ๊ฐ์ฒด
  • DB ์ ‘๊ทผ ๋กœ์ง๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ

- DTO (Data Transfer Object)

  • ๊ณ„์ธต๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•œ ๊ฐ์ฒด
  • ๋กœ์ง์„ ๊ฐ–์ง€ ์•Š๋Š” ์ˆœ์ˆ˜ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋กœ getter, setter๋งŒ ํฌํ•จ

- VO (Value Object)

  • DTO์™€ ๋™์ผํ•œ ๊ฐœ๋…
  • Read Only๋กœ ์ˆ˜์ • ๋ถˆ๊ฐ€
  • getter, setter ์ด์™ธ์˜ ์ถ”๊ฐ€ ๋กœ์ง ํฌํ•จ ๊ฐ€๋Šฅ

- BO (Business Object)

  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํฌํ•จํ•˜๋Š” ์˜ค๋ธŒ์ ํŠธ๋กœ, ์—ฌ๋Ÿฌ DAO๋ฅผ ์‚ฌ์šฉํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ
    •  

 

 

๐Ÿ’ก Spring์˜ ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

 

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

  • Presentation Layer
    • view๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ์™€ ์ง์ ‘์ ์œผ๋กœ ๋งž๋‹ฟ๋Š” ๋ถ€๋ถ„
  • Application Layer
    • ๋น„์ฆˆ๋‹ˆ์Šค ํ•ต์‹ฌ ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„
    • Service ๊ฐ์ฒด๋ผ๋Š” ๊ฒƒ์€ ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์ž‘๋™
  • Persistence Layer
    • ๋ฐ์ดํ„ฐ ๊ด€๋ จ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„

 

 

๐Ÿ’ก ์ปค๋„ฅ์…˜ ํ’€์ด ๋ฌด์—‡์ธ์ง€, Springboot์—์„œ์˜ ์ปค๋„ฅ์…˜ ํ’€๋กœ๋Š” ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด DB๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Connection์ด ํ•„์š”ํ•œ๋ฐ, ์ด ์ƒ์„ฑ ๋ฐ ์†Œ๋ฉธ ๋น„์šฉ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์—, ์ปค๋„ฅ์…˜ ํ’€์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•˜๊ณ  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹œ์ž‘ํ•˜๋Š” ์‹œ์ ์— ์ปค๋„ฅ์…˜์„ ๋ฏธ๋ฆฌ ๋‹ค ์ƒ์„ฑํ•˜๊ณ  ์ด๊ฒƒ์„ ์žฌํ™œ์šฉํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

Springboot 2.0 ์ดํ›„ ๋ถ€ํ„ฐ๋Š” hikariCP๋ฅผ ๊ธฐ๋ณธ CP๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก ๊ทธ๋ ‡๋‹ค๋ฉด DataSource๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

๋”๋ณด๊ธฐ

Connection ๊ด€๋ จ ๊ธฐ์ˆ ์ด ๋งŽ์•„์ง€๋ฉด์„œ, ์ฝ”๋“œ๋ ˆ๋ฒจ์—์„œ๋Š” ๋‹ค๋ฅด์ง€๋งŒ ๋…ผ๋ฆฌ์ ์œผ๋กœ๋Š” ์ปค๋„ฅ์…˜์„ ํš๋“ํ•˜๋Š” ์—ญํ• ์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ถ”์ƒํ™” ์‹œํ‚จ ๊ฒƒ์„ DataSource๋ผ ํ•ฉ๋‹ˆ๋‹ค.

 

์‹ค์งˆ์ ์ธ ๋กœ์ง์„ DataSource์— ์˜์กดํ•˜๋„๋ก ํ•˜๊ณ , ๊ตฌํ˜„ ๊ธฐ์ˆ ์ด ๋ฐ”๋€Œ๋ฉด DataSource์˜ ๊ตฌํ˜„์ฒด๋งŒ ๋ฐ”๊พธ๋ฉด ๋˜๋ฏ€๋กœ, ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก ํŠธ๋žœ์žญ์…˜์„ ์ถ”์ƒํ™”ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ๊ณ  ๊ณ„์‹œ๋‚˜์š”?

๋”๋ณด๊ธฐ

๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ธฐ์ˆ ์ด ๋“ฑ์žฅํ•˜๋ฉด์„œ, ์ฝ”๋“œ๋ ˆ๋ฒจ์—์„œ๋Š” ๋‹ค๋ฅด์ง€๋งŒ ๋…ผ๋ฆฌ์ ์œผ๋กœ๋Š” ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜์„ ์ถ”์ƒํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์ ‘๊ทผ ๊ธฐ์ˆ ๋กœ๋Š” JDBC, JPA, ํ•˜์ด๋ฒ„๋„ค์ดํŠธ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก ํŠธ๋žœ์žญ์…˜ ๋™๊ธฐํ™” ๋งค๋‹ˆ์ €์˜ ์—ญํ• ์— ๋Œ€ํ•ด ์•ˆ๋‹ค๋ฉด, ์•„๋Š”๋Œ€๋กœ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

๋ณดํ†ต ์„œ๋น„์Šค ๋‹จ์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  ๋๋‚ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡๋‹ค๋ฉด ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋Š” ๊ฐ™์€ ์ปค๋„ฅ์…˜์„ ์‚ฌ์šฉ ํ•ด์•ผ ํ•˜๋Š”๋ฐ ๊ณผ์ •์ด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์„œ๋น„์Šค๋‹จ์—์„œ ํŠธ๋žœ์žญ์…˜์ด ์‹œ์ž‘ํ•˜๋ฉด ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๊ฐ€ ์ปค๋„ฅ์…˜์„ ์ƒ์„ฑํ•˜๊ณ (ํ’€์„ ์‚ฌ์šฉํ•˜๋ฉด ํ’€์—์„œ ๊ฐ€์ ธ์˜ค๊ณ ) autoCommit์„ false๋กœ ์„ธํŒ…ํ•œ ๋’ค ํŠธ๋žœ์žญ์…˜ ๋™๊ธฐํ™” ๋งค๋‹ˆ์ €์˜ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ์— ์ปค๋„ฅ์…˜์„ ๋ณด๊ด€
  2. ์ดํ›„ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ๊ณ„์ธต์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜ ๋™๊ธฐํ™” ๋งค๋‹ˆ์ €์˜ ์Šค๋ ˆ๋“œ ๋กœ์ปฌ์—์„œ ํ•ด๋‹น ์ปค๋„ฅ์…˜์„ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉ
  3. ์„œ๋น„์Šค ๋‹จ์—์„œ ํŠธ๋žœ์žญ์…˜์„ ์ข…๋ฃŒํ•  ๋•Œ๋Š” ํŠธ๋žœ์žญ์…˜ ๋™๊ธฐํ™” ๋งค๋‹ˆ์ €์—์„œ ํ•ด๋‹น ์ปค๋„ฅ์…˜์„ ๊ฐ€์ ธ์™€ ์ปค๋ฐ‹ ๋˜๋Š” ๋กค๋ฐฑ์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฆฌ์†Œ์Šค๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ์ปค๋„ฅ์…˜์„ ์ปค๋„ฅ์…˜ ํ’€์— ๋ฐ˜ํ™˜

ํ•˜๋‚˜์˜ ํŠธ๋žœ์žญ์…˜์—์„œ ๊ฐ™์€ ์ปค๋„ฅ์…˜์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋„์›€์„ ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก Spring์„ ์‚ฌ์šฉํ•ด ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ• 2๊ฐ€์ง€์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

1) ์„ ์–ธ์  ํŠธ๋žœ์žญ์…˜

@Transactional ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ํŠธ๋žœ์žญ์…˜์„ ์ ์šฉ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ์ด ์—†์–ด ๋Œ€๋ถ€๋ถ„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

@Transactional ์–ด๋…ธํ…Œ์ด์…˜์€ AOP๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. AOP๋Š” ํ”„๋ก์‹œ ํŒจํ„ด์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๊ฐœ๋…์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ์— @Transactional์„ ๋ถ™์ด๋ฉด, ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋  ๋•Œ, @Transactional์ด ๋ถ™์€ ๋ฉ”์†Œ๋“œ๋งŒ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋˜๋Š” ๋ฉ”์†Œ๋“œ๋กœ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•œ ํ”„๋ก์‹œ ๊ฐ์ฒด๊ฐ€ ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

2) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹ ํŠธ๋žœ์žญ์…˜

ํŠธ๋žœ์žญ์…˜ ๋งค๋‹ˆ์ €๋‚˜ ํŠธ๋žœ์žญ์…˜ ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•ด ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก JDBC, Spring JDBC, MyBatis, ORM, JPA, Hibernate, Spring Data JPA์— ๋Œ€ํ•ด ๊ฐ๊ฐ ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

์—…๋ฐ์ดํŠธ ์˜ˆ์ •.

 

 

๐Ÿ’ก ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?

๋”๋ณด๊ธฐ

์—…๋ฐ์ดํŠธ ์˜ˆ์ •.

 

 

๐Ÿ’ก JPA N+1 ๋ฌธ์ œ์— ๋Œ€ํ•ด ์•Œ๊ณ  ๊ณ„์‹ ๊ฐ€์š”? ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

์—…๋ฐ์ดํŠธ ์˜ˆ์ •.

 

 

๐Ÿ’ก ๊ฐ์ฒด๊ฐ„์˜ ์ƒ์†๊ด€๊ณ„๋ฅผ DB์— ์ ์šฉ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

๋”๋ณด๊ธฐ

์—…๋ฐ์ดํŠธ ์˜ˆ์ •.

 

 

๐Ÿ’ก Spring Batch์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

๋‹จ๋ฐœ์„ฑ์œผ๋กœ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ Batch Application์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ, Spring์—๋Š” SpringBatch๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์œ„์™€ ๊ฐ™์€ ์ผ ๋งค์ถœ ์ง‘๊ณ„๋ฅผ Spring MVC์—์„œ ํ•œ๋‹ค๋ฉด, ๋งŽ์€ ์š”์ฒญ์ด ํ•œ ๋ฒˆ์— ๋“ค์–ด์™€ CPU, I/O ๋“ฑ์˜ ์ž์›์„ ๋‹ค ์จ๋ฒ„๋ ค ๋‹ค๋ฅธ Request ์ฒ˜๋ฆฌ๋ฅผ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹จ๋ฐœ์„ฑ์˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋”ฐ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

 

BatchApplication์˜ ๋ฐฐ์น˜ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™” ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, main ๋ฉ”์†Œ๋“œ๊ฐ€ ํฌํ•จ๋œ ํด๋ž˜์Šค์— @EnableBatchProcessing์„ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

 

 

๐Ÿ’ก Spring Batch์˜ Chunk์™€ Chunk ๊ธฐ๋ฐ˜ ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ

Spring Batch์—์„œ Chunk๋ž€, ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ๋กœ ์ž‘์—… ์‹œ ๊ฐ ์ปค๋ฐ‹ ์‚ฌ์ด์— ์ฒ˜๋ฆฌ๋˜๋Š” row ์ˆ˜๋ฅผ ์ด์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค.

Chunk ๊ธฐ๋ฐ˜ ๋ฐฉ์‹(Chunk ์ง€ํ–ฅ ์ฒ˜๋ฆฌ)์ด๋ž€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด Chunk๋ผ๋Š” ๋ฉ์–ด๋ฆฌ๋ฅผ ๋งŒ๋“  ๋’ค Chunk ๋‹จ์œ„๋กœ ํŠธ๋žœ์žญ์…˜์„ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

 

ํŠธ๋žœ์žญ์…˜์ด๋ฏ€๋กœ, ์‹คํŒจํ•  ๊ฒฝ์šฐ์— Chunk ๋งŒํผ๋งŒ ๋กค๋ฐฑ์ด ๋˜๊ณ , ์ด์ „์— ์ปค๋ฐ‹๋œ ๋ฒ”์œ„๊นŒ์ง€๋Š” ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

  • itemReader, itemProcessor, itemWriter๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.
    • itemReader
      • Custor ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ
        • ๋ฐ์ดํ„ฐ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ ์ปค์„œ๋กœ ์ด๋™ํ•˜๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๊ฑด์”ฉ ์ฒ˜๋ฆฌ
        • ๋ชจ๋“  ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ์ฆ๊ฐ€
        • ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๊นŒ์ง€ ์ปค๋„ฅ์…˜ ์œ ์ง€
        • ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋™์‹œ์„ฑ ์ด์Šˆ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”
      • ํŽ˜์ด์ง• ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ
        • ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ ๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ
        • ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ ๋งŒํผ ์ปค๋„ฅ์…˜์„ ๋งบ๊ณ  ๋Š์Œ
        • ํŽ˜์ด์ง• ๊ฒฐ๊ณผ๋งŒ ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹น
        • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ์— ๋ณ„๋„ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ ๋ถˆํ•„์š”
      • ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ์™€ ์ฒญํฌ ์‚ฌ์ด์ฆˆ๋ฅผ ์ผ์น˜์‹œ์ผœ์•ผ ํ•˜๋Š” ์ด์œ 
        • ์ฒญํฌ ์‚ฌ์ด์ฆˆ๊ฐ€ 50์ด๊ณ  ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ๊ฐ€ 10์ด๋ฉด 5๋ฒˆ์˜ read๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด์„œ ํ•œ ๋ฒˆ์˜ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ 5๋ฒˆ์˜ ์กฐํšŒ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋Š” ์„ฑ๋Šฅ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
        • JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊นจ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. JpaPagingItemReader์˜ ๊ฒฝ์šฐ ํŽ˜์ด์ง€๋ฅผ ์ฝ์„๋•Œ, ์ด์ „ ํŠธ๋žœ์žญ์…˜์„ flush, clear๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ๋ฒ„๋ฆฐ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ๋งˆ์ง€๋ง‰์— ์ฝ์€ ํŽ˜์ด์ง€๋ฅผ ์ œ์™ธํ•œ ์ด์ „์— ์กฐํšŒํ•œ ๊ฒฐ๊ณผ๋“ค์˜ ํŠธ๋žœ์žญ์…˜ ์„ธ์…˜์ด ์ „๋ถ€ ์ข…๋ฃŒ๋˜์–ด ๋ฒ„๋ฆฌ๋ฉด์„œ processor์—์„œ Lazy ๋กœ๋”ฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•œ๋‹ค.
    • itemWriter
      • jpaItemWriter
        • JPA ์—”ํ‹ฐํ‹ฐ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ•˜๋‚˜์”ฉ insertํ•œ๋‹ค.
      • JdbcBatchItemWriter
        • Jpa์ฒ˜๋Ÿผ ๋‹จ๊ฑด ์ฒ˜๋ฆฌ๊ฐ€ ์•„๋‹Œ ์ผ๊ด„ bulk insert ์ฒ˜๋ฆฌํ•œ๋‹ค.
      • ChunkSize ๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Chunk size๊ฐ€ ๊ณง Commit Interval(์ปค๋ฐ‹ ๊ฐ„๊ฒฉ)์ด ๋œ๋‹ค.
  • chunkSize ๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‹ค์Œ chunkSize๋Š” ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.
  • repeat, retry, skip์„ ํ†ตํ•ด์„œ ๋ฐ˜๋ณต ๋ฐ ์˜ค๋ฅ˜ ์ œ์–ด๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ’ก Spring Batch์˜ Job๊ณผ Step์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

๋”๋ณด๊ธฐ
@Slf4j // log ์‚ฌ์šฉ์„ ์œ„ํ•œ lombok ์–ด๋…ธํ…Œ์ด์…˜
@RequiredArgsConstructor // ์ƒ์„ฑ์ž DI๋ฅผ ์œ„ํ•œ lombok ์–ด๋…ธํ…Œ์ด์…˜
@Configuration
public class SimpleJobConfiguration {
    private final JobBuilderFactory jobBuilderFactory; // ์ƒ์„ฑ์ž DI ๋ฐ›์Œ
    private final StepBuilderFactory stepBuilderFactory; // ์ƒ์„ฑ์ž DI ๋ฐ›์Œ

    @Bean
    public Job simpleJob() {
        return jobBuilderFactory.get("simpleJob")
                .start(simpleStep1())
                .build();
    }

    @Bean
    public Step simpleStep1() {
        return stepBuilderFactory.get("simpleStep1")
                .tasklet((contribution, chunkContext) -> {
                    log.info(">>>>> This is Step1");
                    return RepeatStatus.FINISHED;
                })
                .build();
    }
}
  • @Configuration
    • Spring Batch์˜ ๋ชจ๋“  Job์€ @Configuration์œผ๋กœ ๋“ฑ๋กํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • jobBuilderFactory.get("simpleJob")
    • simpleJob ์ด๋ž€ ์ด๋ฆ„์˜ Batch Job์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • job์˜ ์ด๋ฆ„์€ ๋ณ„๋„๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ , ์ด๋ ‡๊ฒŒ Builder๋ฅผ ํ†ตํ•ด ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • stepBuilderFactory.get("simpleStep1")
    • simpleStep1 ์ด๋ž€ ์ด๋ฆ„์˜ Batch Step์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    • jobBuilderFactory.get("simpleJob")์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Builder๋ฅผ ํ†ตํ•ด ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  • .tasklet((contribution, chunkContext))
    • Step ์•ˆ์—์„œ ์ˆ˜ํ–‰๋  ๊ธฐ๋Šฅ๋“ค์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
    • Tasklet์€ Step์•ˆ์—์„œ ๋‹จ์ผ๋กœ ์ˆ˜ํ–‰๋  ์ปค์Šคํ…€ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์„ ์–ธํ• ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์—ฌ๊ธฐ์„œ๋Š” Batch๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด log.info(">>>>> This is Step1") ๊ฐ€ ์ถœ๋ ฅ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

Job์€ ํ•˜๋‚˜์˜ ๋ฐฐ์น˜ ์ž‘์—… ๋‹จ์œ„๋ฅผ ๋งํ•˜๊ณ , Job ์•ˆ์—๋Š” ์—ฌ๋Ÿฌ Step์ด ์กด์žฌํ•˜๊ณ , Step ๋‚ด์— Tasklet, Reader & Writer ๋ฌถ์Œ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

Tasklet ํ•˜๋‚˜์™€ Reader & Processor & Writer ํ•œ ๋ฌถ์Œ์ด ๊ฐ™์€ ๋ ˆ๋ฒจ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ Reader & Processor๊ฐ€ ๋๋‚˜๊ณ  Tasklet์œผ๋กœ ๋งˆ๋ฌด๋ฆฌ ์ง“๋Š” ๋“ฑ์œผ๋กœ ๋งŒ๋“ค์ˆœ ์—†๋‹ค๋Š”๊ฑธ ๊ผญ ๋ช…์‹ฌํ•ด์ฃผ์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Tasklet์€ ์–ด์ฐŒ๋ณด๋ฉด Spring MVC์˜ @Component, @Bean๊ณผ ๋น„์Šทํ•œ ์—ญํ• ์ด๋ผ๊ณ  ๋ณด์…”๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๋ช…ํ™•ํ•œ ์—ญํ• ์€ ์—†์ง€๋งŒ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง€์ •ํ•œ ์ปค์Šคํ…€ํ•œ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ๋‹จ์œ„๋กœ ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

 

 

๐Ÿƒ‍โ™‚๏ธ ๋‹ค๋ฅธ ์งˆ๋ฌธ ๋Œ€๋น„ ์ž๋ฃŒ

[๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„] - [๋ฉด์ ‘์ด์ •๋ฆฌ] ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ธํ„ฐ๋ทฐ ๋Œ€๋น„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ - โ“ช ์ฒดํฌ๋ฆฌ์ŠคํŠธ

[๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„] - [๋ฉด์ ‘์ด์ •๋ฆฌ] ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ธํ„ฐ๋ทฐ ๋Œ€๋น„ ์ด์ •๋ฆฌ ์ž๋ฃŒ - โ‘  ์ž๋ฃŒ๊ตฌ์กฐ
[๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„] - [๋ฉด์ ‘์ด์ •๋ฆฌ] ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ธํ„ฐ๋ทฐ ๋Œ€๋น„ ์ด์ •๋ฆฌ ์ž๋ฃŒ - โ‘ก ์•Œ๊ณ ๋ฆฌ์ฆ˜
[๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„] - [๋ฉด์ ‘์ด์ •๋ฆฌ] ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ธํ„ฐ๋ทฐ ๋Œ€๋น„ ์ด์ •๋ฆฌ ์ž๋ฃŒ - โ‘ข ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
[๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„] - [๋ฉด์ ‘์ด์ •๋ฆฌ] ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ธํ„ฐ๋ทฐ ๋Œ€๋น„ ์ด์ •๋ฆฌ ์ž๋ฃŒ - โ‘ฃ ๋„คํŠธ์›Œํฌ
[๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„] - [๋ฉด์ ‘์ด์ •๋ฆฌ] ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ธํ„ฐ๋ทฐ ๋Œ€๋น„ ์ด์ •๋ฆฌ ์ž๋ฃŒ - โ‘ค ์šด์˜์ฒด์ œ
[๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„] - [๋ฉด์ ‘์ด์ •๋ฆฌ] ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ธํ„ฐ๋ทฐ ๋Œ€๋น„ ์ด์ •๋ฆฌ ์ž๋ฃŒ - โ‘ฅ ์ž๋ฐ”(Java)
[๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„] - [๋ฉด์ ‘์ด์ •๋ฆฌ] ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ธํ„ฐ๋ทฐ ๋Œ€๋น„ ์ด์ •๋ฆฌ ์ž๋ฃŒ - โ‘ฆ ๋ฐฑ์—”๋“œ(Java Spring ๊ธฐ๋ฐ˜)
[๐Ÿ“ ์‹ ์ž… ์ธํ„ฐ๋ทฐ ์ค€๋น„] - [๋ฉด์ ‘์ด์ •๋ฆฌ] ์‹ ์ž… ๊ฐœ๋ฐœ์ž ์ธํ„ฐ๋ทฐ ๋Œ€๋น„ ์ด์ •๋ฆฌ ์ž๋ฃŒ - โ‘ง ๊ฐœ๋ฐœ๊ณตํ†ต / ์ธ์„ฑ๋ฉด์ ‘