Spring / Spring Boot

niireymikยท2024๋…„ 1์›” 22์ผ
0

๐Ÿ“Œ ์Šคํ”„๋ง(Spring)์ด๋ž€?

: ์ •ํ™•ํ•œ ํ‘œํ˜„์€ '์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ(Spring Framework)'์ด๋ฉฐ, ์ด๋Š” ์ž๋ฐ”์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์Šคํ”„๋ง์˜ ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

" ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ์šฉ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์„ ํŽธํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค ๊ฒฝ๋Ÿ‰๊ธ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ "

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

์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ฐœ๋ฐœ์„ ํŽธํ•˜๊ฒŒ

๊ธฐ์—…์—์„œ ์šด์˜ํ•˜๋Š” ์›น ์„œ๋น„์Šค์—๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์žˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ๋•Œ์˜ ์–ด๋ ค์›€์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด EJB(Enterprise JavaBeans)๊ฐ€ ๋“ฑ์žฅํ–ˆ์ง€๋งŒ, ์ด๋Š” ์˜คํžˆ๋ ค ๋‹ค๋ฅธ ์ฐจ์›์˜ ๋” ํฐ ๋ณต์žกํ•จ์„ ๋Œ๊ณ  ๋“ค์–ด์™”๋‹ค. ์ด์˜ ๋Œ€์•ˆ์œผ๋กœ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด Spring์ด๋‹ค.

์Šคํ”„๋ง์€ ์ด์ „ ๊ธฐ์ˆ ์ธ EJB์— ๋น„ํ•ด ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์ด ๋œ ๋ณต์žกํ•ด์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๋“ค์ด ์Šคํ”„๋ง์ด๋ผ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ ์ž์‹ ์ด ์ž‘์„ฑํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ์ง์— ๋” ๋งŽ์€ ๊ด€์‹ฌ๊ณผ ์‹œ๊ฐ„์„ ์Ÿ๊ฒŒ ํ•ด ์ค€๋‹ค. ๋”ฐ๋ผ์„œ, ๊ฐœ๋ฐœ ์ดˆ๊ธฐ์— ๊ธฐ๋ณธ์ ์ธ ์„ค์ •๊ณผ ์ ์šฉ์‹œํ‚ฌ ๊ธฐ์ˆ ๋“ค๋งŒ ์ž˜ ์„ ํƒํ•ด ์ค€๋‹ค๋ฉด, ๊ธฐ์ˆ ๋ณด๋‹ค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ์ง ์ž์ฒด์— ๋” ์ง‘์ค‘ํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

โžก๏ธ ์ฆ‰, Spring์€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ๋ฉด์„œ๋„ ๊ทธ ๊ธฐ์ˆ ์ด ์–ด๋ ต์ง€ ์•Š์•„ ๋กœ์ง ์ž์ฒด์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค!

์˜คํ”ˆ์†Œ์Šค

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

(+) ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•ˆ์ •์ ์ด์ง€ ๋ชปํ•  ๊ฒฝ์šฐ ์„œ๋น„์Šค ์ œ๊ณต์˜ ๋ถˆ์•ˆ์ •์„ฑ์ด ์•ผ๊ธฐ๋˜๊ณ , ๊ฒฐ๊ตญ ๊ธฐ์—…์˜ ์ˆ˜์ต ๊ฐ์†Œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์Šคํ”„๋ง์€ ์˜คํ”ˆ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์•ˆ์ •์ ์ธ ๊ฐœ๋ฐœ๊ณผ ๊ฐœ์„ ์ด ๋ณด์žฅ๋œ๋‹ค. ๋ˆ„๊ตฌ๋‚˜ ์ด์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์Šคํ”„๋ง์†Œ์Šค(SpringSource)๋ผ๋Š” IT๊ธฐ์—…์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์Šคํ”„๋ง์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๊ฐœ์„ ํ•˜๋Š” ์ž‘์—…์—๋Š” ๋งค์šฐ ํ•œ์ •์ ์ธ ์ธ์›๋งŒ ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์•ˆ์ „ํ•˜๋‹ค.

๊ฒฝ๋Ÿ‰๊ธ‰

๐Ÿง์Šคํ”„๋ง์ด ๊ฒฝ๋Ÿ‰๊ธ‰์ด๋ผ๋Š” ๊ฑด ์Šคํ”„๋ง ์ž์ฒด๊ฐ€ ์•„์ฃผ ๊ฐ€๋ณ๋‹ค๊ฑฐ๋‚˜ ์ž‘์€ ๊ทœ๋ชจ์˜ ์ฝ”๋“œ๋กœ ์ด๋ฃจ์–ด์กŒ๋‹ค๋Š” ๋œป์€ ์•„๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ์Šคํ”„๋ง์€ ์ˆ˜์‹ญ๋งŒ ๋ผ์ธ์— ๋‹ฌํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ€์ง„ ๋งค์šฐ ๋ฐฉ๋Œ€ํ•œ ๊ทœ๋ชจ์˜ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ๊ทธ๋Ÿผ ์Šคํ”„๋ง์ด ๊ฐ€๋ณ๋‹ค๊ณ  ํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

๋‹น์‹œ EJB(Enterprise Java Bean)๋Š” ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๊ณผ๋„ํ•œ ์š•์‹ฌ์œผ๋กœ ์ธํ•ด ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ๋งค์šฐ ๋ฌด๊ฒ๊ณ  ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. EJB๊ฐ€ ๋™์ž‘ํ•˜๋ ค๋ฉด ๊ณ ๊ฐ€์˜ ๋Š๋ฆฌ๊ณ  ๋ฌด๊ฑฐ์šด ์ž๋ฐ” ์„œ๋ฒ„(WAS)๊ฐ€ ํ•„์š”ํ–ˆ๊ณ , ํˆด์˜ ๋„์›€ ์—†์ด๋Š” ๋‹ค๋ฃจ๊ธฐ ํž˜๋“  ์š”์†Œ๋“ค์ด ๋ถ€๋‹ด์ด ๋˜์–ด ๊ณ ๊ฐ€์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ฐ–์ถ”์ง€ ์•Š๊ณ ๋Š” ๊ฐœ๋ฐœํ•˜๊ธฐ๊ฐ€ ํž˜๋“ค์—ˆ๋‹ค.
์ด์— ๋ฐ˜ํ•ด, ์Šคํ”„๋ง์€ ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์„œ๋ฒ„ ํ™˜๊ฒฝ์ธ ํ†ฐ์บฃ์ด๋‚˜ ์ œํ‹ฐ์—์„œ๋„ ์™„๋ฒฝํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. ๋‹จ์ˆœํ•œ ๊ฐœ๋ฐœ ํˆด๊ณผ ๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์œผ๋กœ๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜๋‹ค. ๋”ฐ๋ผ์„œ (๋ณต์žกํ•œ ๊ธฐ๋Šฅ์ด ์ž”๋œฉ ํฌํ•จ๋œ) ๊ณ ๊ธ‰ WAS๋ฅผ ๊ตณ์ด ์‚ฌ์šฉํ•  ํ•„์š”๋„ ์—†๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์Šคํ”„๋ง์€ EJB์˜ ๊ธฐ์กด ๊ธฐ์ˆ ๋“ค์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฌด๊ฒ๊ณ  ๋ณต์žกํ–ˆ์Œ์„ ์ฆ๋ช…ํ•œ ์…ˆ์ด๊ณ , ๊ทธ๋Ÿฐ ๋ฉด์—์„œ ์Šคํ”„๋ง์€ ๊ตฐ๋”๋”๊ธฐ ์—†์ด ๊น”๋”ํ•œ ๊ธฐ์ˆ ์„ ๊ฐ€์ง„ '๊ฒฝ๋Ÿ‰๊ธ‰' ํ”„๋ ˆ์ž„์›Œํฌ๋ผ๊ณ  ๋ถˆ๋ฆฐ ๊ฒƒ์ด๋‹ค.
์Šคํ”„๋ง์˜ ์ด๋Ÿฌํ•œ ํŠน์ง•์€ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ์„œ๋ฒ„์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ , ์ฝ”๋“œ์—์„œ๋„ ์ ์šฉ๋˜์—ˆ๋‹ค. EJB์™€ WAS ๊ฐ™์€ ๊ธฐ์ˆ , ํ™˜๊ฒฝ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋“ฑ์žฅํ–ˆ๋˜ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐํ•จ์œผ๋กœ์จ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ๋„ ๋‚ฎ์ถ”์—ˆ๋‹ค.

โžก๏ธ (์ด์ „์˜ ๊ธฐ์ˆ ์ธ EJB์™€ ๋น„๊ตํ•ด์„œ) ๊ฒฐ๊ณผ๋ฌผ๋กœ ๋งŒ๋“ค์–ด์ง„ ์ฝ”๋“œ์˜ ์ˆ˜์ค€์€ ๋น„์Šทํ•˜๋”๋ผ๋„, ๊ทธ๊ฒƒ์„ ํ›จ์”ฌ ํšจ์œจ์ ์ด๊ณ  ๊น”๋”ํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์„œ ์ƒ์‚ฐ์„ฑ, ํ’ˆ์งˆ ๋ฉด์—์„œ ์œ ๋ฆฌํ•˜๋‹ค๋Š” ๊ฒƒ์ด ๊ฒฝ๋Ÿ‰๊ธ‰์ด๋ผ๋Š” ๋ง๋กœ ํ‘œํ˜„๋˜๋Š” ์Šคํ”„๋ง์˜ ํŠน์ง•์ธ ๊ฒƒ์ด๋‹ค! :>

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ

์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํ•˜๋‚˜์˜ ๊ธฐ์ˆ ์— ์ง‘์ค‘ํ•˜๋Š”๋ฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋ชจ๋“  ๊ณผ์ •์— ์ง‘์ค‘ํ•œ๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ์— ์žˆ์–ด ํ•„์š”ํ•œ ๋ชจ๋“  ์ฝ”๋“œ๋“ค์˜ ํ‹€์„ ์ œ๊ณตํ•œ๋‹ค.



๐Ÿ“Œ Spring์˜ ํŠน์ง•

๐Ÿ’ก ์Šคํ”„๋ง์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ POJO ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€ํ–ฅํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์Šคํ”„๋ง์€ ์ด๋ฅผ ์œ„ํ•ด IoC/DI, AOP, PSA ๊ธฐ์ˆ ์„ ์ง€์›ํ•œ๋‹ค. ํ•˜๋‚˜์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ์ดํ•ดํ•ด ๋ณด์ž.

POJO : ์Šคํ”„๋ง์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์ด์ž ํ•ต์‹ฌ

Spring์€ POJO ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€ํ–ฅํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ POJO๋ž€, Plain Old Java Object, ์ฆ‰ ์ˆœ์ˆ˜ Java๋งŒ์„ ํ†ตํ•ด์„œ ์ƒ์„ฑํ•œ ๊ฐ์ฒด๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์–ด๋–ค ๊ฐ์ฒด๊ฐ€ ์™ธ๋ถ€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‚˜ ์™ธ๋ถ€์˜ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ๊ทธ ๊ฐ์ฒด๋Š” POJO๋ผ๊ณ  ํ•  ์ˆ˜ ์—†๋‹ค. POJO๋Š” ๋ง ๊ทธ๋Œ€๋กœ, ๋‹ค๋ฅธ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ˆœ์ˆ˜ํ•œ Java๋งŒ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  ๊ฐ์ฒด์ธ ๊ฒƒ์ด๋‹ค.

๐Ÿ”ŽPOJO๋Š” ์™œ ์ค‘์š”ํ• ๊นŒ?
์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ importํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. ์ด ๊ฐ์ฒด๋Š” ์ˆœ์ˆ˜ Java ์™ธ์— ์™ธ๋ถ€ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, POJO๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ด๋•Œ, ์ด ๊ฐ์ฒด๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ธฐ์ˆ ์ด Deprecated(๊ฐ€์น˜๊ฐ€ ๋–จ์–ด์ ธ ์‚ฌ๋ผ์ง) ๋˜๊ฑฐ๋‚˜, ๊ฐœ์„ ๋œ ์‹  ๊ธฐ์ˆ ์ด ๋“ฑ์žฅํ•˜์—ฌ ๊ธฐ์กด ๊ธฐ์ˆ ์„ ๋Œ€์ฒดํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด ํ•ด๋‹น ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“  ๊ฐ์ฒด๋“ค์˜ ์ฝ”๋“œ๋ฅผ ์ „๋ถ€ ๋ฐ”๊ฟ” ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋Š” ๊ฐ์ฒด๊ฐ€ ์™ธ๋ถ€ ๋ชจ๋“ˆ์— ์ง์ ‘์ ์œผ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.
๋ฐ˜๋ฉด, POJO๋Š” ๋‹ค๋ฅธ ๋ฌด์–ธ๊ฐ€์— ์ข…์†๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋ณด๋‹ค ์œ ์—ฐํ•˜๊ฒŒ ๋ณ€ํ™”/ํ™•์žฅ์— ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ POJO๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌ์„ฑํ•˜๋ฉด ๊ฐ์ฒด ์ง€ํ–ฅ ์„ค๊ณ„๋ฅผ ์ œํ•œ ์—†์ด ์ ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•ด์ ธ ํ…Œ์ŠคํŠธ์™€ ๋””๋ฒ„๊น… ๋˜ํ•œ ์‰ฌ์›Œ์ง„๋‹ค.


IoC / DI (์ œ์–ด์˜ ์—ญ์ „ / ์˜์กด์„ฑ ์ฃผ์ž…)

  • IoC (Inversion of Control, ์ œ์–ด์˜ ์—ญ์ „) : ๊ธฐ์กด ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋“  ์ž‘์—…์„ ์ œ์–ดํ•˜์ง€ ์•Š๊ณ  ํŠน๋ณ„ํ•œ ๊ฐ์ฒด์— ๋ชจ๋“  ๊ฒƒ์„ ์œ„์ž„ํ•ด ๊ฐ์ฒด์˜ ์ƒ์„ฑ๋ถ€ํ„ฐ ์ƒ๋ช…์ฃผ๊ธฐ ๋“ฑ ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ œ์–ด๊ถŒ์ด ๋„˜์–ด๊ฐ„ ๊ฒƒ
  • DI (Dependency Injection, ์˜์กด์„ฑ ์ฃผ์ž…) : ๊ฐ ํด๋ž˜์Šค ์‚ฌ์ด์— ํ•„์š”๋กœ ํ•˜๋Š” ์˜์กด๊ด€๊ณ„๋ฅผ ๋นˆ ์„ค์ • ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ด ์ฃผ๋Š” ๊ฒƒ
๐Ÿฅฒ ๊ทธ๋Ÿฌ๋‚˜ ์œ„์˜ ์ •์˜๋Š” ์•„๋ฌด๋ฆฌ ๋ด๋„ ์ข€ ์–ด๋ ต๋‹ค... ์•„๋ž˜์— ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ๋ณด๋ฉฐ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ•ด ๋‘์—ˆ์œผ๋‹ˆ ์ฐจ๊ทผ์ฐจ๊ทผ ์•Œ์•„๋ณด์ž :>

๐Ÿ”Ž IoC / DI ์˜ˆ์‹œ๋กœ ์•Œ์•„๋ณด๊ธฐ

Java๋Š” ๊ฐ์ฒด์ง€ํ–ฅ ์–ธ์–ด์ด๋ฏ€๋กœ, Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•ˆ์—์„œ๋Š” ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ ์ ˆํžˆ ๋งบ์–ด ์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๊ด€๊ณ„์˜ ๊ฐœ๋…์€ ์–ด๋ ต์ง€ ์•Š๋‹ค. A ์ธ์Šคํ„ด์Šค๊ฐ€ B ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋‹ค๋ฉด A๋Š” B์™€ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋งบ์€ ๊ฒƒ์ด ๋˜๋ฉฐ, "A๊ฐ€ B์— ์˜์กดํ•˜๋Š” ๊ด€๊ณ„"๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

class A {
	public void methodOfA() {
		B b = new B();
		b.example();
	}
}

class B {
	public void example() { ... }
}

์œ„์˜ A์™€ B์˜ ์˜์กด ๊ด€๊ณ„๋Š” ๊ฐœ๋ฐœ์ž์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง„๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ, A๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ B๊ฐ€ ์•„๋‹Œ C๋กœ ๋Œ€์ฒดํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ? ๋‹น์—ฐํ•˜๊ฒŒ๋„, A์—์„œ ์‚ฌ์šฉ๋˜๋Š” B์˜ ์š”์†Œ๋ฅผ ๋ชจ๋‘ ์ง์ ‘ ๋ณ€๊ฒฝํ•ด์•ผ๋งŒ ํ•œ๋‹ค( B b = new B(); โžก๏ธ C c = new C() ์™€ ๊ฐ™์ด, b.example๋„ ๋งˆ์ฐฌ๊ฐ€์ง€ ). ๋งŒ์•ฝ ๊ธฐ์กด์— B๋ฅผ ์‚ฌ์šฉํ•˜๋˜ ๊ฐ์ฒด๊ฐ€ A๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ˆ˜์‹ญ ๊ฐœ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ชจ๋“  ๊ฐ์ฒด์˜ ์ฝ”๋“œ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ์ˆ˜์ •ํ•ด ์ฃผ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ ์ตœ์†Œํ•œ์˜ ์ˆ˜์ •๋งŒ์œผ๋กœ ๋ณ€ํ™”๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค. (1)~(5)์˜ ์„ค๋ช…์„ ๋”ฐ๋ผ๊ฐ€๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ด๋  ๊ฒƒ์ด๋‹ค.

// (1) A๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค I์˜ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๋กœ ์ •์˜ํ•œ ๋‹ค์Œ, (์ถ”์ƒํ™”)
interface I {
	void example();
}

class A {
	// (3) ๊ทธ ๋‹ค์Œ, ์ธํ„ฐํŽ˜์ด์Šค ํƒ€์ž…์˜ ํ•„๋“œ๋ฅผ ์„ ์–ธํ•˜๊ณ ,
	private I i;
	
	// (4) ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ›์•„์™€ i๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค. (๋‹คํ˜•์„ฑ)
	public A(I i) {
		this.i = i;
	}

	public void methodOfA() {
		// (5) ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜จ ์ธ์Šคํ„ด์Šค์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
		i.example();
	}
}

// (2) A๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๋“ค์ด I๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•œ๋‹ค.
class B implements I {
	public void example() { ... }
}

class C implements I {
	public void example() { ... }
}

โžก๏ธ ์œ„ ์˜ˆ์ œ์—์„œ A๋Š” ์ž์‹ ์ด ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์Šค์Šค๋กœ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ , ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜ค๊ณ  ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ˆ„๊ตฐ๊ฐ€ A๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ๊ฒฐ์ •ํ•˜๊ณ  ์ƒ์„ฑํ•ด์„œ A์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ธ์ž๋กœ ์ „๋‹ฌํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ, ๊ทธ '๋ˆ„๊ตฐ๊ฐ€'์˜ ์—ญํ• ์„ ๋ฐ”๋กœ ์Šคํ”„๋ง์ด ํ•œ๋‹ค. ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋กœ์ง ์™ธ๋ถ€์—์„œ A๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ๋ณ„๋„๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค์ • ํด๋ž˜์Šค ํŒŒ์ผ์— A๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ C๋กœ ์„ค์ •ํ•ด ๋‘๋ฉด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘ํ•˜๋ฉด์„œ ์Šคํ”„๋ง์ด ์„ค์ • ํด๋ž˜์Šค ํŒŒ์ผ์„ ํ•ด์„ํ•˜๊ณ , ๊ฐœ๋ฐœ์ž๊ฐ€ ์„ค์ •ํ•ด๋‘” ๋Œ€๋กœ C ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ A์˜ ์ƒ์„ฑ์ž์˜ ์ธ์ž๋กœ C๋ฅผ ์ „๋‹ฌํ•ด ์ค€๋‹ค.

โžก๏ธ ์ด์ฒ˜๋Ÿผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ ์Šคํ”„๋ง์ด (A๊ฐ€ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ) ์˜์กด ๊ด€๊ณ„๋ฅผ ๋งบ์–ด์ฃผ๋Š” ๊ฒƒ์„ IoC(Inversion of Control, ์ œ์–ด์˜ ์—ญ์ „)๋ผ๊ณ  ํ•˜๋ฉฐ, ๊ทธ ๊ณผ์ •์—์„œ C๋ฅผ A์˜ ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•ด ์ฃผ๋Š” ๊ฒƒ์„ DI(Dependency Injection, ์˜์กด์„ฑ ์ฃผ์ž…)๋ผ๊ณ  ํ•œ๋‹ค! :>

AOP

AOP๋Š” Aspect Oriented Programming์˜ ์•ฝ์ž๋กœ, ๊ด€์‹ฌ ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋Š” OOP(๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)๋ฅผ ๋”์šฑ ๋ณด์™„ํ•˜๊ณ  ํ™•์žฅํ•œ ๊ฐœ๋…์œผ๋กœ, ํ•˜๋‚˜์˜ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ํ•˜๋‚˜์˜ ๊ฑฐ๋Œ€ํ•œ OOP๋กœ์จ ์„ค๊ณ„ ๋ฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ๋˜์—ˆ๋‹ค๋ฉด ์ด๊ฒƒ์„ ๊ฐ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ชจ๋“ˆํ™”ํ•ด์„œ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.

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

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

(+) ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ / ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ ?

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

์ด๋•Œ ํ•ต์‹ฌ ๊ด€์‹ฌ ์‚ฌํ•ญ๊ณผ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์˜ ์ฝ”๋“œ๊ฐ€ ๋ชจ์—ฌ ์žˆ์œผ๋ฉด ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜๊ธฐ ๋งˆ๋ จ์ธ๋ฐ, ์ด ๊ฒฝ์šฐ ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ ์ˆ˜ํ–‰์˜ ๋กœ์ง์ด ๋ณ€๊ฒฝ๋˜๋ฉด ๋ชจ๋“  ์ค‘๋ณต ์ฝ”๋“œ๋ฅผ ์ฐพ์•„ ์ผ์ผ์ด ์ˆ˜์ •ํ•ด ์ฃผ์–ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.


PSA

Portable Service Abstraction์˜ ์•ฝ์ž์ธ PSA๋Š” '์ผ๊ด€๋œ ์„œ๋น„์Šค ์ถ”์ƒํ™”'๋ฅผ ๋œปํ•œ๋‹ค. ์ด๋Š” ์Šคํ”„๋ง์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„œ๋น„์Šค๋ฅผ ์ถ”์ƒํ™”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(MySQL, Oracle, MariaDB, MongoDB ๋“ฑ)์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๊ด€๊ณ„์—†์ด ๋™์ผํ•œ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์„ ์œ ์ง€ํ•œ ์ฑ„๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค.

๋‹ค์‹œ ๋งํ•ด, ์Šคํ”„๋ง์€ Java๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ทœ์ •ํ•œ ์ธํ„ฐํŽ˜์ด์Šค(JDBC : Java DataBase Cconnectivity)๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด์ฒ˜๋Ÿผ ํŠน์ • ๊ธฐ์ˆ ๊ณผ ๊ด€๋ จ๋œ ์„œ๋น„์Šค๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ ๊ฒƒ์„ 'PSA, ์ผ๊ด€๋œ ์„œ๋น„์Šค ์ถ”์ƒํ™”'๋ผ๊ณ  ํ•œ๋‹ค.

(+) ์ด๋ ‡๊ฒŒ ๊ฐ์ฒดํ˜• ๋ชจ๋ธ๊ณผ ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์˜ ์‚ฌ์ด๋ฅผ ๋งคํ•‘ํ•ด์ฃผ๋Š” ๊ฒƒ์„ ORM(Object Relational Mapping) ๊ธฐ์ˆ ์ด๋ผ ํ•˜๋ฉฐ, ORM์„ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ Hibernate, ์ด๋ฅผ Java ํ‘œ์ค€ ๋ฐฉ์‹์œผ๋กœ ์ •์˜ํ•œ ๊ฒƒ์ด JPA์ด๋‹ค.



๐Ÿ“Œ ์Šคํ”„๋ง ๋ถ€ํŠธ(Spring Boot)๋ž€?

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” XML ์„ค์ • ํŒŒ์ผ (web.xml, rootContext.xml, ServletContext.xml ๋“ฑ) ์„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ๋‹ค ์™ธ์šฐ๋Š” ๊ฑด ์‚ฌ์‹ค์ƒ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ์— ๊ธฐ์กด์˜ ์‚ฌ์šฉ์„ค์ •์„ ์žฌ์‚ฌ์šฉ ํ•˜๊ฑฐ๋‚˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋‚˜ํ•˜๋‚˜ ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ–ˆ๋‹ค. ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์ด๋Ÿฌํ•œ ์Šคํ”„๋ง ์ดˆ๊ธฐ ์„ค์ •์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ž๋™ํ™”ํ•˜์—ฌ ๊ฐ„ํŽธํžˆ ์ฒ˜๋ฆฌํ•ด ์ฃผ๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๋ณ„๋„์˜ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์ฆ‰, ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์Šคํ”„๋ง์„ ๋” ์‰ฝ๊ฒŒ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋„๊ตฌ์ด๋‹ค.

Spring Boot์˜ ์žฅ์ 

๐ŸŒฑ ์ดˆ๊ธฐ ์„ค์ •์ด ์‰ฝ๋‹ค ( ์„ค์ • ์ž๋™ํ™” )

: ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ๋ณต์žกํ•œ ์„ค์ • ์—†์ด ๋น ๋ฅด๊ฒŒ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค. ์Šคํ”„๋ง์˜ ๋ณต์žกํ•œ ์„ค์ • ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋“ค์€ ๋งŽ์€ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค. ์‹ฌ์ง€์–ด ํ•œ๋ฒˆ ์„ค์ •ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์Šคํ”„๋ง์˜ ๋ฒ„์ „์—…์œผ๋กœ ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ์—†์–ด์ง€๋Š” ์ผ๋„ ๋น„์ผ๋น„์žฌํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ์Šคํ”„๋ง์˜ ๋ณต์žกํ•œ ์„ค์ •์„ ์ž๋™ํ™”ยท๋‹จ์ˆœํ™”ํ•˜์—ฌ ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์Šคํ”„๋ง์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

๐ŸŒฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (์˜์กด์„ฑ, ๋ฒ„์ „) ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ๋‹ค

: ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ๋‚ด์žฅ๋œ ์˜์กด์„ฑ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋ฒ„์ „์˜ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ , ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
// (์ผ์ผ์ด ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์•„ ์ถ”๊ฐ€ํ•  ํ•„์š” ์—†์ด) spring-boot-starter-web์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๊ด€๋ จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐ›์•„ ์˜จ๋‹ค.

๐ŸŒฑ WAS๊ฐ€ ํ•„์š” ์—†๋‹ค ( ๋‚ด์žฅ ์„œ๋ฒ„ )

: ์Šคํ”„๋ง ๋ถ€ํŠธ ๋Œ€์‹  ์Šคํ”„๋ง๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•œ๋‹ค๋ฉด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ†ฐ์บฃ๊ณผ ๊ฐ™์€ WAS(Web Application Server)๊ฐ€ ํ•„์š”ํ•˜๋‹ค. WAS์˜ ์ข…๋ฅ˜๋Š” ๋งค์šฐ ๋‹ค์–‘ํ•˜๋ฉฐ ์„ค์ • ๋ฐฉ์‹๋„ ์ œ๊ฐ๊ฐ์ด์–ด์„œ WAS๋งŒ์œผ๋กœ๋„ ๊ณต๋ถ€ํ•ด์•ผ ํ•  ๋‚ด์šฉ๋„ ์ƒ๋‹นํ•˜๋‹ค. ํ•˜์ง€๋งŒ ์Šคํ”„๋ง ๋ถ€ํŠธ์—๋Š” ํ†ฐ์บฃ/์ œํ‹ฐ ๋“ฑ์˜ ์›น ์„œ๋ฒ„๊ฐ€ ๋‚ด์žฅ๋˜์–ด ์žˆ๊ธฐ์— ๋ณ„๋„์˜ ์›น ์„œ๋ฒ„ ์„ค์น˜ ์—†์ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐ŸŒฑ ๋ฐฐํฌ๊ฐ€ ์‰ฝ๋‹ค ( ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ JAR )

: ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ JAR ๋˜๋Š” WAR ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง• ํ•ด์„œ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์›น ํ”„๋กœ์ ํŠธ๋ผ๋ฉด WAR ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง• ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ๋‚ด์žฅ ์„œ๋ฒ„(ํ†ฐ์บฃ ๋“ฑ)๋ฅผ ์ง€์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์— JAR ํŒŒ์ผ๋กœ ํŒจํ‚ค์ง• ํ•ด์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

โœ… JAR? WAR?
๊ธฐ๋ณธ์ ์œผ๋กœ JAR, WAR ๋ชจ๋‘ Java์˜ jar ์˜ต์…˜ (java -jar)์„ ์ด์šฉํ•ด ์ƒ์„ฑ๋œ ์••์ถ•(์•„์นด์ด๋ธŒ) ํŒŒ์ผ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๋ฐฐํฌํ•˜๊ณ  ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ๊ด€๋ จ ํŒŒ์ผ์„ ํŒจํ‚ค์ง• ํ•œ ๊ฒƒ์ด๋‹ค.

JAR (Java Archive)

  • JAVA ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž๋ฐ” ํ”„๋กœ์ ํŠธ๋ฅผ ์••์ถ•ํ•œ ํŒŒ์ผ : Class (JAVA๋ฆฌ์†Œ์Šค, ์†์„ฑ ํŒŒ์ผ), ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ์„ ํฌํ•จํ•จ
  • JRE(JAVA Runtime Environment)๋งŒ ์žˆ์–ด๋„ ์‹คํ–‰ ๊ฐ€๋Šฅํ•จ (java -jar ํ”„๋กœ์ ํŠธ๋„ค์ž„.jar)

    WAR (Web Application Archive)
  • Servlet / Jsp ์ปจํ…Œ์ด๋„ˆ์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Web Application) ์••์ถ•ํŒŒ์ผ ํฌ๋งท : ์›น ๊ด€๋ จ ์ž์›(JSP, Servlet, JAR, Class, XML, HTML, Javascript)์„ ํฌํ•จํ•จ
    ( ์ฆ‰, JARํŒŒ์ผ์˜ ์ผ์ข…์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด๋ฅผ ํŒจํ‚ค์ง• ํ•˜๊ธฐ ์œ„ํ•œ JAR ํŒŒ์ผ์ด๋‹ค. )
  • ๋ณ„๋„์˜ ์›น์„œ๋ฒ„(WEB) or ์›น ์ปจํ…Œ์ด๋„ˆ(WAS) ํ•„์š”


๐Ÿ‘‰ Spring์€ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋ณด๋‹ค ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์—, Spring Boot๋Š” ๋น ๋ฅด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ๋œ๋‹ค. ์‚ฌ์‹ค Spring์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ์ผ์€ (๊ฑฐ์˜) ์—†์ด, ์žฅ์ ์ด ๋„ˆ๋ฌด๋„ ๋งŽ์€ Spring Boot๋ฅผ ์“ฐ๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค :>

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด