Spring JPA - DoDaek/freelec-springboot2-webservice GitHub Wiki

  • ํ˜„๋Œ€์˜ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ( RDB, Relational Database ) ๋Š” ๋น ์งˆ ์ˆ˜ ์—†๋Š” ์š”์†Œ
  • ๊ฐ์ฒด๋ฅผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡๋ณด๋‹ค ์ค‘์š”
  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ณ„์†ํ•ด์„œ ์›น ์„œ๋น„์Šค์˜ ์ค‘์‹ฌ์ด ๋˜๋ฉด์„œ ๋ชจ๋“  ์ฝ”๋“œ๋Š” SQL ์ค‘์‹ฌ์ด ๋˜์–ด๊ฐ‘๋‹ˆ๋‹ค.

  • ํ˜„์—… ํ”„๋กœ์ ํŠธ ๋Œ€๋ถ€๋ถ„์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ณด๋‹ค SQL๋กœ ๊ฐ€๋“ํ•˜๊ฒŒ ๋œ ๊ฒƒ

    • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ SQL๋งŒ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ
    • ๊ฐ ํ…Œ์ด๋ธ”๋งˆ๋‹ค ๊ธฐ๋ณธ์ ์ธ CRUD ( Create, Read, Update, Delete ) SQL์„ ๋งค๋ฒˆ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด User ๊ฐ์ฒด๋ฅผ ํ…Œ์ด๋ธ”๋กœ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด
    insert into user ( id, name, ... ) values ( ... );
    select * from user where ...;
    update user set ... where ...;
    delete from user where ...;
    

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋ฌด๋ฆฌ ์ž๋ฐ” ํด๋ž˜์Šค๋ฅผ ์•„๋ฆ„๋‹ต๊ฒŒ ์„ค๊ณ„ํ•ด๋„, SQL์„ ํ†ตํ•ด์•ผ๋งŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ ๋ฐ ์กฐํšŒ

  • ์‹ค์ œ ํ˜„์—…์—์„œ๋Š” ์ˆ˜์‹ญ, ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํ…Œ์ด๋ธ”์ด ์žˆ๋Š”๋ฐ, ์ด ํ…Œ์ด๋ธ”์˜ ๋ช‡ ๋ฐฐ์˜ SQL์„ ๋งŒ๋“ค๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•ด์•ผ๋งŒ ํ•œ๋‹ค.

    โ†’ ์ŠคํŠธ๋ ˆ์Šค

  • ๋‹จ์ˆœ ๋ฐ˜๋ณต ์ž‘์—…์˜ ๋ฌธ์ œ ์™ธ์—๋„ ํ•œ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋” ์žˆ๋‹ค.

    • ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ
    • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ• ์ง€์— ์ดˆ์ ์ด ๋งž์ถฐ์ง„ ๊ธฐ์ˆ 
    • ๋ฐ˜๋Œ€๋กœ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ธฐ๋Šฅ๊ณผ ์†์„ฑ์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ 

  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํŒจ๋Ÿฌ๋‹ค์ž„์ด ์„œ๋กœ ๋‹ค๋ฅธ๋ฐ, ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. โ†’ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜
  • ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋ถ€๋ชจ๊ฐ€ ๋˜๋Š” ๊ฐ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ์š”?
User user = findUser();
Group group = user.getGroup();
  • ๋ˆ„๊ตฌ๋‚˜ ๋ช…ํ™•ํ•˜๊ฒŒ User์™€ Group์€ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„์ž„์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • User๊ฐ€ ๋ณธ์ธ์ด ์†ํ•œ Group์„ ๊ฐ€์ ธ์˜จ ์ฝ”๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.
User user = userDao.findUser();
Group group = groupDao.findGroup(user.getGroupId());
  • User ๋”ฐ๋กœ, Group ๋”ฐ๋กœ ์กฐํšŒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • User์™€ Group์ด ์–ด๋–ค ๊ด€๊ณ„์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ์š”?

  • ์ƒ์†, 1:N ๋“ฑ ๋‹ค์–‘ํ•œ ๊ฐ์ฒด ๋ชจ๋ธ๋ง์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋Š” ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    โ†’ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์€ ์ ์  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ๋ง์—๋งŒ ์ง‘์ค‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


  • JPA๋Š” ์„œ๋กœ ์ง€ํ–ฅํ•˜๋Š” ๋ฐ”๊ฐ€ ๋‹ค๋ฅธ 2๊ฐœ ์˜์—ญ ( ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ) ์„ ์ค‘๊ฐ„์—์„œ ํŒจ๋Ÿฌ๋‹ค์ž„ ์ผ์น˜๋ฅผ ์‹œ์ผœ์ฃผ๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ 
  • ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ณ , JPA๊ฐ€ ์ด๋ฅผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋งž๊ฒŒ SQL์„ ๋Œ€์‹  ์ƒ์„ฑํ•ด์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋Š” ํ•ญ์ƒ ๊ฐ์ฒด์ง€ํ–ฅ์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š๋‹ˆ ๋”๋Š” SQL์— ์ข…์†์ ์ธ ๊ฐœ๋ฐœ์„ ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

Spring Data JPA

  • JPA๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ์„œ ์ž๋ฐ” ํ‘œ์ค€๋ช…์„ธ์„œ์ž…๋‹ˆ๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค์ธ JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

    โ†’ ๋Œ€ํ‘œ์ ์œผ๋กœ Hibernate, Eclipse Link ๋“ฑ

  • ํ•˜์ง€๋งŒ Spring์—์„œ JPA๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ด ๊ตฌํ˜„์ฒด๋“ค์„ ์ง์ ‘ ๋‹ค๋ฃจ์ง„ ์•Š์Šต๋‹ˆ๋‹ค.

    โ†’ ๊ตฌํ˜„์ฒด๋“ค์„ ์ข€ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ ์ž ์ถ”์ƒํ™”์‹œํ‚จ Spring Data JPA๋ผ๋Š” ๋ชจ๋“ˆ์„ ์ด์šฉํ•˜์—ฌ JPA ๊ธฐ์ˆ ์„ ๋‹ค๋ฃฌ๋‹ค.

  • Hibernate๋ฅผ ์“ฐ๋Š” ๊ฒƒ๊ณผ Spring Data JPA๋ฅผ ์“ฐ๋Š” ๊ฒƒ ์‚ฌ์ด์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  • ๊ทธ๋Ÿผ์—๋„ ์Šคํ”„๋ง ์ง„์˜์—์„œ๋Š” Spring Data JPA๋ฅผ ๊ฐœ๋ฐœํ–ˆ๊ณ , ์ด๋ฅผ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํ•œ ๋‹จ๊ณ„ ๋” ๊ฐ์‹ธ๋†“์€ Spring Data JPA๊ฐ€ ๋“ฑ์žฅํ•œ ์ด์œ 

    1. ๊ตฌํ˜„์ฒด ๊ต์ฒด์˜ ์šฉ์ด์„ฑ
    2. ์ €์žฅ์†Œ ๊ต์ฒด์˜ ์šฉ์ด์„ฑ

๊ตฌํ˜„์ฒด ๊ต์ฒด์˜ ์šฉ์ด์„ฑ

  • Hibernate ์™ธ์— ๋‹ค๋ฅธ ๊ตฌํ˜„์ฒด๋กœ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•˜๊ธฐ ์œ„ํ•จ

  • Hibernate๊ฐ€ ์–ธ์  ๊ฐ€ ์ˆ˜๋ช…์„ ๋‹คํ•ด์„œ ์ƒˆ๋กœ์šด JPA ๊ตฌํ˜„์ฒด๊ฐ€ ๋Œ€์„ธ๋กœ ๋– ์˜ค๋ฅผ ๋•Œ, Spring Data JPA๋ฅผ ์“ฐ๋Š” ์ค‘์ด๋ผ๋ฉด ์•„์ฃผ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Spring Data JPA ๋‚ด๋ถ€์—์„œ ๊ตฌํ˜„์ฒด ๋งคํ•‘์„ ์ง€์›ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

    โ†’ ์ž๋ฐ”์˜ Redis ํด๋ผ์ด์–ธํŠธ๊ฐ€ Jedis์—์„œ Lettuce๋กœ ๋Œ€์„ธ๊ฐ€ ๋„˜์–ด๊ฐˆ ๋•Œ Spring Data Redis๋ฅผ ์“ฐ์‹  ๋ถ„๋“ค์€ ์•„์ฃผ ์‰ฝ๊ฒŒ ๊ต์ฒด๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ €์žฅ์†Œ ๊ต์ฒด์˜ ์šฉ์ด์„ฑ

  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์™ธ์— ๋‹ค๋ฅธ ์ €์žฅ์†Œ๋กœ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•˜๊ธฐ ์œ„ํ•จ

  • ์„œ๋น„์Šค ์ดˆ๊ธฐ์—๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ–ˆ์ง€๋งŒ, ์ ์  ํŠธ๋ž˜ํ”ฝ์ด ๋งŽ์•„์ ธ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ๋Š” ๋„์ €ํžˆ ๊ฐ๋‹น์ด ์•ˆ ๋  ๋•Œ๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    โ†’ MongoDB๋กœ ๊ต์ฒด๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ฐœ๋ฐœ์ž๋Š” Spring Data JPA์—์„œ Spring Data MongoDB๋กœ ์˜์กด์„ฑ๋งŒ ๊ต์ฒดํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

    โ†’ Spring Data์˜ ํ•˜์œ„ ํ”„๋กœ์ ํŠธ๋“ค์€ ๊ธฐ๋ณต์ ์ธ CRUD์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.