[Spring Boot2][1] 1. JPA ์†Œ๊ฐœ

sorzzzzyยท2021๋…„ 9์›” 27์ผ
0

Spring Boot - RoadMap 2

๋ชฉ๋ก ๋ณด๊ธฐ
1/26
post-thumbnail

๐Ÿท SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์˜ ๋ฌธ์ œ์ 

SQL์„ ์‚ฌ์šฉํ•ด ๊ฐœ๋ฐœ์„ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž!
๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•œ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด, ์ง€๋ฃจํ•œ ์ฝ”๋“œ,,,,๐Ÿ˜… ๊ฐ€ ๋ฐ˜๋ณต๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์Šค์Šค๋กœ ๋Š๋ผ๊ฒŒ ๋œ๋‹ค..^^


๊ฐ์ฒด CRUD์— ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ณด์ž!


์ด์ฒ˜๋Ÿผ ์ฟผ๋ฆฌ๋ฅผ ํ•œ ๋•€ ํ•œ ๋•€ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค^^ ๋งค์šฐ ๊ท€์ฐฎ^^

โžก๏ธ SQL์— ์˜์กด์ ์ธ ๊ฐœ๋ฐœ์„ ํ”ผํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค!
โžก๏ธ ํ˜„์‹ค์ ์ธ ๋Œ€์•ˆ์€ ๋ฐ”๋กœ โ—๏ธ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šคโ—๏ธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.


โœ”๏ธ ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ฐจ์ด

1๏ธโƒฃ ์ƒ์†

๊ฐ๊ฐ์˜ ํ…Œ์ด๋ธ”์— ๋”ฐ๋ฅธ ์กฐ์ธ SQL ์ž‘์„ฑ,, ๊ฐ๊ฐ์˜ ๊ฐ์ฒด ์ƒ์„ฑ,, ์ƒ์ƒ๋งŒ ํ•ด๋„ ๋ณต์žกํ•ด์ง„๋‹ค ๐Ÿ˜…
โžก๏ธ ๊ฐ์ฒด์™€๋Š” ๋‹ค๋ฅด๊ฒŒ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” DB์— ์ €์žฅํ•  ๊ฐ์ฒด์—๋Š” ์ƒ์† ๊ด€๊ณ„๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค!!


2๏ธโƒฃ ์—ฐ๊ด€๊ด€๊ณ„

  • ๊ฐ์ฒด๋Š” ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉ = member.getTeam()
  • ํ…Œ์ด๋ธ”์€ ์™ธ๋ž˜ ํ‚ค๋ฅผ ์‚ฌ์šฉ = JOIN ON M.TEAM_ID = T.TEAM_ID
  • ๊ฐ์ฒด์™€ ๋‹ฌ๋ฆฌ ํ…Œ์ด๋ธ”์€ ์–‘๋ฐฉํ–ฅ ์กฐ์ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค!!!


โœ”๏ธ ๊ฐ์ฒด๋ฅผ ํ…Œ์ด๋ธ”์— ๋งž์ถ”์–ด ๋ชจ๋ธ๋ง

๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ฐฉ๋ฒ•์€ ๋ญ”๊ฐ€ ๊ฐ์ฒด์ง€ํ–ฅ ์Šค๋Ÿฝ์ง€ ์•Š๋‹ค,, ๋ฉค๋ฒ„๊ฐ€ ์™ธ๋ž˜ํ‚ค ๊ฐ’์„ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฐธ์กฐ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•˜๋Š”๊ฒŒ ์•„๋‹๊นŒ๐Ÿค”โ“


โœ”๏ธ ๊ฐ์ฒด ๋ชจ๋ธ๋ง ์ €์žฅ

์™ธ๋ž˜ํ‚ค ๊ฐ’์ด ์—†๋Š” TEAM_ID ๋Œ€์‹ , member.getTeam().getId() ์œผ๋กœ ์ฐธ์กฐํ•ด์„œ ์–ป์–ด์˜ค๋ฉด ์ €์žฅ์€ ํ•  ์ˆ˜ ์žˆ๋‹ค!

โฌ†๏ธ ์œ„์˜ ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ์ €์žฅํ•œ๋‹ค๊ณ  ํ–ˆ์„ ๋•Œ ์ง„์ •ํ•œ ๋ฌธ์ œ๋Š” ์กฐํšŒํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค,,


โœ”๏ธ ๊ฐ์ฒด ๋ชจ๋ธ๋ง ์กฐํšŒ

  • ๊ต‰์žฅํžˆ ๋ฒˆ๊ฑฐ๋กœ์šด ๊ณผ์ •๋“ค๐Ÿ˜…
  • ์ž๋ฐ” ์ปฌ๋ ‰์…˜์—์„œ ๊ด€๋ฆฌํ•œ๋‹ค ๊ฐ€์ •ํ•  ๋• ๋งค์šฐ ํŽธ๋ฆฌํ•ด ๋ณด์ด์ง€๋งŒ, DB์— ๋„ฃ์„ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ณต์žกํ•ด์ง„๋‹ค.

โœ”๏ธ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

โฌ†๏ธ ์œ„์™€ ๊ฐ™์ด ๊ฐ์ฒด๋Š” ์ž์œ ๋กญ๊ฒŒ ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ ๊ทธ๋ ‡์ง€ ๋ชปํ•˜๋‹ค,,


โฌ†๏ธ ๋ฐ”๋กœ ์ฒ˜์Œ ์‹คํ–‰ํ•˜๋Š” SQL์— ๋”ฐ๋ผ ํƒ์ƒ‰ ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •๋ผ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ๐Ÿ˜‚
์ด๋Š” ๊ณง ์—”ํ‹ฐํ‹ฐ ์‹ ๋ขฐ๋ฌธ์ œ๊นŒ์ง€ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค!


์•ˆํฌ,, ๊ฐ์ฒด๋‹ต๊ฒŒ ๋ชจ๋ธ๋ง ํ• ์ˆ˜๋ก ๋งคํ•‘ ์ž‘์—…๋งŒ ๋Š˜์–ด๋‚˜๋Š”๋ฐ,,, ์–ด๋–กํ•˜๋ผ๋Š” ๊ฑฐ์ฃ ,,,,^_^?



๐Ÿท JPA ์†Œ๊ฐœ

๊ฐ์ฒด๋‹ต๊ฒŒ ๋ชจ๋ธ๋ง ํ• ์ˆ˜๋ก ๋งคํ•‘ ์ž‘์—…๋งŒ ๋Š˜์–ด๋‚˜๋Š”๋ฐ, ๊ฐ์ฒด๋ฅผ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์— ์ €์žฅํ•˜๋“ฏ์ด DB์— ์ €์žฅํ•  ์ˆ˜๋Š” ์—†์„๊นŒ๐Ÿค”โ“

๊ทธ๋ž˜์„œ ๋‚˜์˜จ ๊ฒƒ์ด โ—๏ธJPAโ—๏ธ

๐Ÿ“Œ JPA

  • Java Persistence API
  • ์ž๋ฐ” ์ง„์˜์˜ ORM ๊ธฐ์ˆ  ํ‘œ์ค€

๐Ÿ“Œ ORM

  • Object-relational mapping(๊ฐ์ฒด ๊ด€๊ณ„ ๋งคํ•‘)
  • ๊ฐ์ฒด๋Š” ๊ฐ์ฒด๋Œ€๋กœ ์„ค๊ณ„
  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Œ€๋กœ ์„ค๊ณ„ - ORM ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ค‘๊ฐ„์—์„œ ๋งคํ•‘
  • ๋Œ€์ค‘์ ์ธ ์–ธ์–ด์—๋Š” ๋Œ€๋ถ€๋ถ„ ORM ๊ธฐ์ˆ ์ด ์กด์žฌ

โœ”๏ธ JPA๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ JDBC ์‚ฌ์ด์—์„œ ๋™์ž‘

  • JPA์—๊ฒŒ ๋ช…๋ น์„ ํ•˜๋ฉด ๊ทธ ์•ˆ์—์„œ JDBC API๊ฐ€ ๋™์ž‘์„ ํ•œ๋‹ค!

โœ”๏ธ JPA ๋™์ž‘ - ์ €์žฅ

  • ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ๋˜๋Š” ์ฟผ๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์•„๋‹Œ JPA๊ฐ€ ๋งŒ๋“ค์–ด์ค€๋‹ค!
  • ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•ด์ค€๋‹คโ—๏ธ

โœ”๏ธ JPA ๋™์ž‘ - ์กฐํšŒ



โœ”๏ธ JPA๋Š” ํ‘œ์ค€ ๋ช…์„ธ

  • JPA๋Š” ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ชจ์Œ
  • JPA 2.1 ํ‘œ์ค€ ๋ช…์„ธ๋ฅผ ๊ตฌํ˜„ํ•œ 3๊ฐ€์ง€ ๊ตฌํ˜„์ฒด
  • ํ•˜์ด๋ฒ„๋„ค์ดํŠธ, EclipseLink, DataNucleus


๐Ÿท JPA๋ฅผ ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”๊ฐ€?

  • SQL ์ค‘์‹ฌ์ ์ธ ๊ฐœ๋ฐœ์—์„œ ๊ฐ์ฒด ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ๋ฐœ
  • ์ƒ์‚ฐ์„ฑ
  • ์œ ์ง€๋ณด์ˆ˜
  • ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ
  • ์„ฑ๋Šฅ
  • ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์ถ”์ƒํ™”์™€ ๋ฒค๋” ๋…๋ฆฝ์„ฑ
  • ํ‘œ์ค€

โœ”๏ธ ์ƒ์‚ฐ์„ฑ - JPA์™€ CRUD

  • ์ €์žฅ : jpa.persist(member)
  • ์กฐํšŒ : Member member = jpa.find(memberId)
  • ์ˆ˜์ • : member.setName(โ€œ๋ณ€๊ฒฝํ•  ์ด๋ฆ„โ€)
  • ์‚ญ์ œ : jpa.remove(member)

โœ”๏ธ ์œ ์ง€๋ณด์ˆ˜

1๏ธโƒฃ ๊ธฐ์กด : ํ•„๋“œ ๋ณ€๊ฒฝ์‹œ ๋ชจ๋“  SQL ์ˆ˜์ •

  • ์•…๋• ๊ธฐํš์ž๊ฐ€ ๊ฐ‘์ž๊ธฐ ์„œ๋น„์Šค ๋ณ€๊ฒฝ์„ ์š”๊ตฌํ–ˆ์„ ๋•Œ ํ•˜๋‚˜ํ•˜๋‚˜ ๋‹ค ๊ณ ์ณ์•ผ ํ•จ ใ… 

2๏ธโƒฃ JPA : ํ•„๋“œ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ, SQL์€ JPA๊ฐ€ ์ฒ˜๋ฆฌ

  • ์•…๋• ๊ธฐํš์ž๊ฐ€ ๊ดด๋กญํ˜€๋„ ์ฟผ๋ฆฌ๋ฅผ ์†๋Œ€์ง€ ์•Š๊ณ  ์ปฌ๋Ÿผ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋จ!

โœ”๏ธ JPA์™€ ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ

1๏ธโƒฃ ์ƒ์† - ์ €์žฅ

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ํฌ๊ฒŒ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ ค๋„, JPA๊ฐ€ INSERT ์ฟผ๋ฆฌ๋ฅผ ๋‘๊ฐœ๋กœ ์ชผ๊ฐœ์„œ ๋งŒ๋“ค์–ด ์คŒ

2๏ธโƒฃ ์ƒ์† - ์กฐํšŒ

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋ฉด JPA๊ฐ€ ์•Œ์•„์„œ JOINํ•ด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์คŒ

3๏ธโƒฃ ์—ฐ๊ด€๊ด€๊ณ„, ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰

  • ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์ €์žฅํ•˜๋ฉด, JPA๊ฐ€ ๋งˆ์น˜ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์— ๋„ฃ์€ ๊ฒƒ ์ฒ˜๋Ÿผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ

4๏ธโƒฃ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ, ๊ณ„์ธต

  • ๊ฐ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ์ž์œ ๋กญ๊ฒŒ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Œ(=์ง€์—ฐ๋กœ๋”ฉ)

โœ”๏ธ ์„ฑ๋Šฅ

1๏ธโƒฃ 1์ฐจ ์บ์‹œ์™€ ๋™์ผ์„ฑ(identity) ๋ณด์žฅ

  • ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ๋Š” ๊ฐ™์€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ - ์•ฝ๊ฐ„์˜ ์กฐํšŒ ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • DB Isolation Level์ด Read Commit์ด์–ด๋„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Repeatable Read ๋ณด์žฅ

2๏ธโƒฃ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” ์“ฐ๊ธฐ ์ง€์—ฐ(transactional write-behind)

  • INSERT
    • ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•  ๋•Œ๊นŒ์ง€ INSERT SQL์„ ๋ชจ์Œ
    • JDBC BATCH SQL ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•ด์„œ ํ•œ๋ฒˆ์— SQL ์ „์†ก

  • UPDATE
    • UPDATE, DELETE๋กœ ์ธํ•œ ๋กœ์šฐ(ROW)๋ฝ ์‹œ๊ฐ„ ์ตœ์†Œํ™”
    • ํŠธ๋žœ์žญ์…˜ ์ปค๋ฐ‹ ์‹œ UPDATE, DELETE SQL ์‹คํ–‰ํ•˜๊ณ , ๋ฐ”๋กœ ์ปค๋ฐ‹

3๏ธโƒฃ ์ง€์—ฐ ๋กœ๋”ฉ(Lazy Loading)

  • ์ง€์—ฐ ๋กœ๋”ฉ : ๊ฐ์ฒด๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ๋  ๋•Œ ๋กœ๋”ฉ
  • ์ฆ‰์‹œ ๋กœ๋”ฉ : JOIN SQL๋กœ ํ•œ๋ฒˆ์— ์—ฐ๊ด€๋œ ๊ฐ์ฒด๊นŒ์ง€ ๋ฏธ๋ฆฌ ์กฐํšŒ

๋กœ๋“œ๋งต2 ๋ฟŒ์‹œ์ž!!!!!!!!!!!!!ใ…‡์šฐ์•„ใ…—์•„์•™!!!!!!!!!!!!!!!!!!!!!!!!

profile
Backend Developer

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