๐Ÿ“‹ Spring Core ๋ง‰ ์ ์€ ๊ฐ•์˜ ๋…ธํŠธ


๊ฐ์ฒด์˜ ์˜์กด ๊ด€๋ฆฌ๋Š” ์Šคํ”„๋ง์ด ํ•œ๋‹ค.
์Šคํ”„๋ง์€ ๊ฐœ๋ฐœ์ž๋ฅผ ๋Œ€์‹ ํ•ด์„œ ๊ฐ์ฒด๋“ค์„ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ผ์„ ํ•œ๋‹ค.

ChessService์—์„œ ChessDao ์˜์กดํ•˜๊ธฐ

image-20210420104423745

๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•˜๋‹ค

์˜์กด ๊ด€๊ณ„๋ฅผ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด ๋ณต์žกํ•˜๋‹ค.
์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.

์ปจํ…Œ์ด๋„ˆ

๋‹ด์•„๋†“๋Š” ์šฉ๊ธฐ
์Šคํ”„๋ง์—์„œ๋Š” ์Šคํ”„๋ง์ด ํ™œ์šฉํ•  ๊ฐ์ฒด๋“ค์„ ๋‹ด์•„๋†“์€ ์šฉ๊ธฐ๋ฅผ ๋งํ•œ๋‹ค.

Bean์œผ๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ธฐ์ค€?

ํ”„๋กœ๊ทธ๋žจ ๋ณ„๋กœ ๊ณตํ†ต์ ์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ ๋ ˆ์ด์–ด์— ๋Œ€ํ•œ ๊ฐ์ฒด๋“ค์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋“ค์„ ๋นˆ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.
์ƒํƒœ๊ฐ€ ์—†๋Š” ๊ฐ์ฒด๋ฅผ ๋นˆ์œผ๋กœ ๋“ฑ๋กํ•œ๋‹ค. -> ๋นˆ์œผ๋กœ ๋“ฑ๋ก ํ•˜๋ ค๋ฉด ์ƒํƒœ๊ฐ€ ์—†์–ด์•ผ ํ•œ๋‹ค.

์„ค์ •์˜ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ(Configuration Metadata)๋ฅผ ์ด์šฉํ•ด ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ๋‹ด์•„๋†“๋Š”๋‹ค.
์ปจํ…Œ์ด๋„ˆ์— ๋‹ด์œผ๋ฉด ๋นˆ์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.

์Šคํ”„๋ง์ด ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด

  • ๊ฐ์ฒด ๊ด€๋ฆฌ ๋Œ€์ƒ ์•Œ๋ ค์ฃผ๊ธฐ
  • ๊ฐ์ฒด๋“ค ๊ฐ„์˜ ์˜์กด์„ฑ ์ •์˜ํ•˜๊ธฐ

์ปจํ…Œ์ด๋„ˆ ์„ค์ • ๋ฐฉ๋ฒ• - ๋นˆ ๋“ฑ๋ก ๋ฐฉ๋ฒ•

@ComponentScan : ๋“ฑ๋กํ•  ๋นˆ์„ ์Šค์บ”ํ•  classpath๋ฅผ ์ง€์ • (@SpringBootApplication ๋‚ด๋ถ€์— ์†ํ•ด์žˆ๋Š” ์• ๋„ˆํ…Œ์ด์…˜)

@Component : ComponentScan ํด๋ž˜์Šค ํ•˜์œ„์— ํŠน์ • ์• ๋„ˆํ…Œ์ด์…˜์ด ๋ถ™์€ ํด๋ž˜์Šค๋ฅผ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ์ง€์ •

image-20210420110038067

์˜์กด์„ฑ ์ฃผ์ž…

์ƒ์„ฑ์ž ์ฃผ์ž…(without ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ)

์ˆ˜์ •์ž ์ฃผ์ž…(without ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ)

ํ•„๋“œ๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
์Šคํ”„๋ง์—์„œ๋Š” XML, ์–ด๋…ธํ…Œ์ด์…˜, ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Autowired๋ฅผ ๋ถ™์—ฌ์ค€๋‹ค. ์ƒ์„ฑ์ž ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ํ•„์š”ํ•˜๊ตฌ๋‚˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

ํŠน์ • ์ปดํฌ๋„ŒํŠธ ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์ธ๋‹ค๊ณ  ํ•ด์„œ ํŠน์ • ์˜๋ฏธ๊ฐ€ ๋ถ€์—ฌ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ณ ,

Repository๋Š” ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ Public Operation์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด์— Domain Layer์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ๋ชจ๋ธ๊ณผ ์ƒ์• ์ฃผ๊ธฐ๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ์‹ค์ œ ๊ตฌํ˜„์ฒด์ธ SimpleJpaRepository๋Š” Infrastructure Layer์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ถ”์ƒ์— ์˜์กดํ•˜๊ณ  ๊ตฌ์ฒด์— ์˜์กดํ•˜์ง€ ์•Š๋„๋ก ๊ตฌ์„ฑํ•จ์œผ๋กœ์จ(DIP) ์œ ์—ฐ์„ฑ์žˆ๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด, DAO๋Š” CRUD์™€ 1:1๋กœ ๋งค์นญ๋˜์–ด Persistence Operation์„ ์ ๊ทน์ ์œผ๋กœ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰, repository๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ์˜ ์ผ๋ถ€๋กœ ๋ณด๋ฉฐ ์ถ”์ƒ์ธ ๋ฐ˜๋ฉด, dao๋Š” ์ถ”์ƒ์ด ํ•„์ˆ˜๋Š” ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

http://egloos.zum.com/aeternum/v/1160846

https://stackoverflow.com/questions/8550124/what-is-the-difference-between-dao-and-repository-patterns

๋นˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ„ด ์Šค์ฝ”ํ”„

์ปจํ…Œ์ด๋„ˆ๋Š” ๊ฐœ๋…์ ์ธ ๊ฒƒ ์ปจํ…์ŠคํŠธ๋Š” ๊ฐ์ฒด์˜ ์ผ์›

๊ฐ ์ ์œผ๋กœ ์–ด๋…ธํ…Œ์ด์…˜์€ ๋ง‰๋ถ™์ด๊ธฐ ์ข‹๊ณ (๋น ๋ฅด๊ฒŒ ๊ฐœ๋ฐœํ•˜๊ธฐ) xml์— ๋ช…์‹œํ•˜๋ฉด ์ผ๋ฅ ์ ์œผ๋กœ ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š”์ง€ ๋ˆˆ์— ๋“ค์–ด์™€์„œ ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

image-20210420114253606

์„œ๋น„์Šค ๋ ˆ์ด์–ด๋Š” ์–ด๋–ค ์—ญํ• ์„ ํ• ๊นŒ์š”?

๋„๋ฉ”์ธ ๋กœ์ง๋“ค์˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๋ฉด์„œ, ์„œ๋น„์Šค ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค.
๊ฐ์ฒด๋“ค์˜ ๋น„์ง€๋‹ˆ์Šค ํ”Œ๋กœ์šฐ๋ฅผ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.
๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์€ ๋„๋ฉ”์ธ์œผ๋กœ!

Pojo

์Šคํ”„๋ง์—์„œ ์Šคํ”„๋ง ๋นˆ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์€ ๊ฐ์ฒด
์Šคํ”„๋ง ์„ค์ •์ด ๊ฐ€ํ•ด์ง€๊ธฐ ์ „ ์ƒํƒœ์˜ ๊ฐ์ฒด๋ฅผ POJO๋ผ๊ณ  ํ•œ๋‹ค.

ํฌ์กฐ๋Š” ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ๊ฐ์ฒด๋ฅผ ์˜๋ฏธ

Java Bean :

์ž๋ฐ”๋นˆ์€ ํฌ์กฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ํฌ์กฐ๋Š” ์ž๋ฐ”๋นˆ์ด๋ผ๊ณ  ํ•˜๊ธด ์• ๋งคํ•˜๋‹ค.

image-20210420120440979

๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ถ„๋ฆฌํ–ˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋จ ๊ทธ๋Ÿฐ ์ฐจ์›์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ๋”ฐ.

๋งž์•„์œ  config๊ฐ€ ์ฝ”๋“œ ์–‘์ด ์ข€ ๋” ์งง์€ ๊ฑฐ ๊ฐ™์•„์„œ ๋” ์ข‹์€ ๊ฑฐ ๊ฐ™์•„์—ฌ! ์–ด์ฐจํ”ผ configuration์€ ๋Œ€๋ถ€๋ถ„ ๋งŒ๋“ค์–ด ๋†“์œผ๋‹ˆ ๋‹ค๋ฅธ ํด๋ž˜์Šค ์•ˆ๋งŒ๋“ค์–ด๋„ ๋˜๊ตฌ!