Study/Java

[TIL] Spring Data JDBC ๊ตฌํ˜„

hong- 2022. 7. 4. 13:22

๐Ÿ’ก Spring Data JDBC ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค ๊ณ„์ธต ์—ฐ๋™์„ ์œ„ํ•ด ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ

      : ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”๊ณผ ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ์„ค๊ณ„


๐Ÿ“ DDD(Domain Driven Design) : ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„

   : ๋„๋ฉ”์ธ ์œ„์ฃผ์˜ ์„ค๊ณ„ ๊ธฐ๋ฒ•

   ๐Ÿ”ธ Domain : ๋„๋ฉ”์ธ

    - ์ฃผ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค์ ์ธ ์–ด๋–ค ์—…๋ฌด ์˜์—ญ = ํ˜„์‹ค์„ธ๊ณ„์—์„œ ์ ‘ํ•˜๋Š” ์—…๋ฌด์˜ ํ•œ ์˜์—ญ

    - ๋„๋ฉ”์ธ ์ง€์‹๋“ค์„ ์„œ๋น„์Šค๊ณ„์ธต์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์œผ๋กœ ๊ตฌํ˜„

    - ex) ๋ฐฐ๋‹ฌ์ฃผ๋ฌธ ์•ฑ์„ ๊ฐœ๋ฐœํ•  ๊ฒฝ์šฐ ๋„๋ฉ”์ธ : ํšŒ์› / ์ฃผ๋ฌธ / ์Œ์‹ / ๊ฒฐ์ œ

   ๐Ÿ”ธ Aggregate : ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ

    - ๋น„์Šทํ•œ ์—…๋ฌด ๋„๋ฉ”์ธ์˜ ๋ฌถ์Œ

    - ex) ํšŒ์› ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ : ํšŒ์› ์ •๋ณด / ํšŒ์› ํฌ์ธํŠธ

             ์ฃผ๋ฌธ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ : ์ฃผ๋ฌธ ์ •๋ณด / ๋ฐฐ๋‹ฌ ์Œ์‹ ์ •๋ณด / ๋ฐฐ๋‹ฌ ์ฃผ์†Œ ์ •๋ณด / ๋ฐฐ๋‹ฌ ์ฃผ๋ฌธ์ž ์ •๋ณด

             ๊ฒฐ์ œ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ : ๊ฒฐ์ œ ์ •๋ณด

             ์Œ์‹ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ : ์Œ์‹ ์ •๋ณด            

  ๐Ÿ”ธ Aggregate Root : ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ

    - ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๋„๋ฉ”์ธ

    - ์–ด๋–ค ํŠน์ • ์ง‘๋‹จ์ด๋‚˜ ๊ทธ๋ฃน์˜ ๋Œ€ํ‘œ

    - ๊ฐ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋‚ด ๋„๋ฉ”์ธ ์ค‘ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ๊ณผ ์ง๊ฐ„์ ‘์ ์œผ๋กœ ์—ฐ๊ด€์žˆ๋Š” ๋„๋ฉ”์ธ์œผ๋กœ ์„ ์ •

    - ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„์—์„œ๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ๊ฐ€ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์ด ๋˜๊ณ  ๋‚˜๋จธ์ง€ ๋„๋ฉ”์ธ๋“ค์ด ์ž์‹ ํ…Œ์ด๋ธ”์ธ ์…ˆ

    - ์• ๊ฑฐ๋ฆฌ๋ฃจํŠธ๋Š” Spring Data JDBC ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์ž˜ ์ •์˜ํ•˜๊ณ  ์ฐพ์•„์•ผ ํ•จ


๐Ÿ’ก ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ํ‚ค(FK) vs ํด๋ž˜์Šค์˜ ๊ฐ์ฒด ์ฐธ์กฐ ๋ฆฌ์ŠคํŠธ(List)

   - ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ๊ฐ„ ๊ด€๊ณ„๋Š” ์™ธ๋ž˜ํ‚ค๋ฅผ ํ†ตํ•ด ๋งบ์–ด์ง€์ง€๋งŒ ํด๋ž˜์Šค๋ผ๋ฆฌ์˜ ๊ด€๊ณ„๋Š” ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ๋งบ์–ด์ง

→ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ ์„ค๊ณ„ํ•œ ๋Œ€๋กœ ํ…Œ์ด๋ธ” ์Šคํ‚ค๋งˆ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ƒ์„ฑํ•˜๋ฉด ๋จ

    BUT, ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค๋Š”

     → ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ๊ด€๊ณ„๋ฅผ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD)์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋งคํ•‘ ๊ทœ์น™์— ๋งž๊ฒŒ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ


๐Ÿ“์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๊ฐ์ฒด ๋งคํ•‘ ๊ทœ์น™

โ‘  ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด์˜ ์ƒํƒœ๋Š” ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ๋ฅผ ํ†ตํ•ด์„œ๋งŒ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ

โ‘ก ํ•˜๋‚˜์˜ ๋™์ผํ•œ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋‚ด์—์„œ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ์ฐธ์กฐ

  - ๋™์ผํ•œ ํ•˜๋‚˜์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋‚ด์—์„œ๋Š” ์—”ํ‹ฐํ‹ฐ ๊ฐ„ ๊ฐ์ฒด๋กœ ์ฐธ์กฐํ•จ

  - ์™ธ๋ž˜ํ‚ค๊ฐ€ ์•„๋‹Œ !

โ‘ข ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ ๋Œ€ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ ๊ฐ„ ์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ์ฐธ์กฐ

  - ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ ๋ฃจํŠธ ๊ฐ„ ์ฐธ์กฐ๋Š” ๊ฐ์ฒด ์ฐธ์กฐ ๋Œ€์‹  ID๋กœ ์ฐธ์กฐ

  - 1:1 ๊ณผ 1:N ๊ด€๊ณ„์—์„œ๋Š” ํ…Œ์ด๋ธ” ๊ฐ„ ์™ธ๋ž˜ํ‚ค ๋ฐฉ์‹๊ณผ ๋™์ผ

  - M:N ๊ด€๊ณ„์ผ๋•Œ๋Š” ์™ธ๋ž˜ํ‚ค ๋ฐฉ์‹๊ณผ ๊ฐ์ฒด ์ฐธ์กฐ ๋ฐฉ์‹์ด ํ•จ๊ป˜ ์‚ฌ์šฉ๋จ


๐Ÿ“ Repository : ๋ฆฌํฌ์ง€ํ† ๋ฆฌ

  - ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค ๊ณ„์ธต์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

  - ๋„๋ฉ”์ธ ์—”ํ‹ฐํ‹ฐ๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค ํด๋ž˜์Šค์™€ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํด๋ž˜์Šค ๊ตฌํ˜„


 โ–ช๏ธ Query Method : ์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ 

  - SQL ์ฟผ๋ฆฌ ๋ฌธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์งˆ์˜ํ•  ์ˆ˜ ์žˆ์Œ

  - ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ• : find + By + WHERE์ ˆ์˜ ์ปฌ๋Ÿผ๋ช…(์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ช…) + ์กฐ๊ฑด์ด ๋˜๋Š” ๋ฐ์ดํ„ฐ

     ex) findByEmail(String email)

            findByEmailAndName(String email, String name)