JPA

JPA์˜ ์†Œ๊ฐœ(section1)

challnum 2022. 8. 5. 21:45

JPA์˜ ์†Œ๊ฐœ

๐Ÿ“– JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ํ•ด์™”๊ณ  ์™œ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ ์•Œ๊ณ  ์จ์•ผ ํ•˜๊ธฐ์— ์ •๋ฆฌํ•ด๋ด…๋‹ˆ๋‹ค.

์ง€๊ธˆ์€ ๊ฐ์ฒด๋ฅผ ๊ด€๊ณ„ํ˜• DB์— ๋„ฃ์–ด์„œ ๊ด€๋ฆฌ๋ฅผ ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ƒ์€ ํ…Œ์ด๋ธ” ๋งˆ๋‹ค SQL๋ฌธ๋ฒ•์„ ์ ์–ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งตํ•‘์„ ํ•˜๋Š” ๊ฒƒ์— ์ƒ๋‹น๋Ÿ‰ ์‹œ๊ฐ„์„ ํ—ˆ๋น„ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

public class Memeber {
	privaet String memberId;
	privaet String name;
}

			INSERT INTO MEMBER(MEMBER_ID, NAME) VALUES
			SELECT MEMBER_ID, NAME FROM MEMBER M
			UPDATE MEMBER SET ... 

์œ„์™€ ๊ฐ™์€ ์ฟผ๋ฆฌ ์‹์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๊ธฐํš์ž๊ฐ€ ์—ฐ๋ฝ์ฒ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฒŒ 
๋ถ€ํƒ์„ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ์ฟผ๋ฆฌ๋ฅผ ๋‹ค ์ˆ˜์ •ํ•˜๊ณ  ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” 
๋น„ ํšจ์œจ์ ์ธ ๋ถ€๋ถ„์ด ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค. ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ•œ ๋ถ€๋ถ„์„
์ˆ˜์ •ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๋ฉด ์ฝ”๋“œ์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚  ์ˆ˜ ๋ฐ–์— ์—†๊ฒŒ ๋œ๋‹ค.
๐Ÿ“– ๊ด€๊ณ„ํ˜•DB vs ๊ฐ์ฒด

๊ด€๊ณ„ํ˜• DB

  1. ๊ด€๊ณ„ํ˜• DBPK, FK๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
  2. ์ƒ์†์ด ์—†๋‹ค.

๊ฐ์ฒด

  1. ๊ฐ์ฒด์„œ๋กœ ์ฐธ์กฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์ƒ์†์ด ์žˆ๋‹ค.
๐Ÿ“– ๊ด€๊ณ„ํ˜•DB์™€ ๊ฐ์ฒด ์กฐํšŒ์˜ ์ฐจ์ด์ 

๐Ÿง๊ฐ์ฒด์˜ ๊ฒฝ์šฐ INSERT์‹œ ALBUM๊ฐ์ฒด๋ฅผ INSERTํ›„ ITEM์—๋„ INSERTํ•ด์•ผ ํ•˜๊ฒŒ ๋œ๋‹ค. ALBUM์„ ์กฐํšŒ ํ•  ์‹œ์—๋Š” ITEM๊ณผ ALBUM์„ JOINํ•œ ํ›„ ์กฐํšŒ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

์œ„์™€ ๊ฐ™์€ ๋ฒˆ๊ฑฐ๋กœ์šด ์ผ์„ ํ•˜์ง€ ์•Š๊ณ  ์ปฌ๋ ‰์…˜์˜ ๊ด€์ ์—์„œ ๋ณธ๋‹ค๋ฉด? ์•„๋ž˜์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์•„์ฃผ ๊ฐ„๋‹จํ•œ ๋ฐฉ์‹์œผ๋กœ ์กฐํšŒ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑธ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“– ๊ด€๊ณ„ํ˜•DB์™€ ๊ฐ์ฒด์˜ ์—ฐ๊ด€๊ด€๊ณ„

  1. ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ ์ฐธ์กฐ๋กœ ์ด์šฉํ•ด ์ฐพ์•„ ๊ฐˆ ์ˆ˜ ์žˆ์ง€๋งŒ ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ pk, fk์˜ ๊ฐ’์œผ๋กœ join์„ ํ•˜์—ฌ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2.  ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ Team์—์„œ Member์˜ ๊ฐ’์„ ์ฐธ์กฐํ•˜๋Š” ๋ถ€๋ถ„์ด ์—†๊ธฐ์— Team.getMemeber()๊ฐ™์ด ์ฐธ์กฐ๋ฅผ ํ•  ์ˆ˜ ์—†๋‹ค.

  1. ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ TEAM์—์„œ TEAM_ID๊ฐ€ ์žˆ๊ธฐ์— MEMBER๋กœ ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ MEMBER์˜TEAM_ID(FK)๋ฅผ ์—ญ ์ฐธ์กฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ผ์€ ์•„๋ž˜์ฒ˜๋Ÿผ ํ…Œ์ด๋ธ”ํ˜• ์—ฐ๊ด€๊ด€๊ณ„์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒดdml ์—ฐ๊ด€๊ด€๊ณ„๋กœ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์„ค๊ณ„๋ฅผ ํ•  ๊ฒฝ์šฐ ์กฐํšŒ์‹œ์— ๋˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

๐Ÿ˜ถ‍๐ŸŒซ๏ธ์กฐํšŒ์‹œ ์ƒ์„ฑ๋˜๋Š” ๋ฌธ์ œ ๋งˆ์ง€๋ง‰ member.setTeam(team)์œผ๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์…‹ํŒ…ํ•˜๊ฒŒ ๋œ๋‹ค.

๐Ÿ“– ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ์ปฌ๋ ‰์…˜์— ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ํ•œ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ๋ณ€ํ•œ๋‹ค. ์•„๋ž˜์ฒ˜๋Ÿผ ๊ฐ์ฒด๋งŒ์„ ๋ณผ ๋•Œ์—๋Š” ๋ฐ‘์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ๋˜์ง€๋งŒ DB์— ๋„ฃ๊ฒŒ ๋˜๋Š” ์ˆœ๊ฐ„ ์œ„์˜ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿ“– ๊ฐ์ฒด๊ฐ„์˜ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„๋•Œ๋„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทธ๋ฆผ์—์„œ ๋ณธ๋‹ค๋ฉด Member์—์„œ Delivery๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์‹ค์ƒ์€ ๋‹ค๋ฅด๋‹ค.

์ฒ˜์Œ ์‹œ์ž‘ํ•˜๋Š” SQL์—์„œ ์ด๋ฏธ ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ์— MEMBER์™€ TEAM์„ ํ•ฉํ•œ ํ›„ ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๊ทธ ๋‹ค์Œ getOrder์„ ํ–ˆ์„ ์‹œ์— ๊ฐ’์ด ๋ชจ๋‘ ์ฑ„์›Œ์ ธ์žˆ๋‹ค๋ฉด ๊ฐ’์ด ๊ฐ€์ ธ์™€์ง€์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด null๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ ์—”ํ‹ฐํ‹ฐ์˜ ์‹ ๋ขฐ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

memberDAO์˜ ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ์งœ์—ฌ์กŒ๋Š”์ง€ ํ™•์ธ์„ ์‹ค์ œ๋กœ ํ•˜๊ธฐ ์ „์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ณ ๊ตฌ๊ฐ„์—์„œ ์‹ ๋ขฐ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.(๊ทธ ๋‹ค์Œ ๊ณ„์ธต์—์„œ ์‹ ๋ขฐ๋ฅผ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์—)

์•„๋ž˜์™€ ๊ฐ™์ด SQL์  ๋ฌธ๋ฒ•์—์„œ ๋ณธ๋‹ค๋ฉด member1, member2๋Š” ๊ฐ๊ฐ new Member๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ฐ’์ด ๋‹ฌ๋ผ์ง„๋‹ค.

๊ทธ๋ ‡์ง€๋งŒ ์ปฌ๋ ‰์…˜์˜ ๊ด€์ ์—์„œ ๋ณธ๋‹ค๋ฉด ์•„๋ž˜์˜ ๊ฐ’์€ ๊ฐ™๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ์ฒด๋ฅผ ์ปฌ๋ ‰์…˜์— ์ €์žฅํ•˜๋“ฏ์ด DB์— ์ €์žฅํ•˜๋Š” ๋ฒ•์„ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋œ๋‹ค.

๐Ÿ“– ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์˜จ ๊ฒƒ์ด ๋ฐ”๋กœ ์‹ ์ด ๋‚ด๋ฆฐ ์„ ๋ฌผ JPA์ด๋‹ค.

 

 ๐Ÿ“– JPA๋ž€ JAVA ORM์˜ ํ‘œ์ค€์ด๋‹ค. ๊ทธ ๋ง์ด๋ž€ ์ฆ‰ ์œ„์˜ ํฌ์ŠคํŒ…์—์„œ ๋งํ–ˆ๋˜ ๊ฐ์ฒด์ ์œผ๋กœ ๋งŒ๋“  ๋ฐ์ดํ„ฐ๋ฅผ DB์— ๋ฐ€์–ด๋„ฃ์„๋•Œ ORM ํ”„๋ ˆ์ž„์›Œํฌ์ธ JPA๋กœ ๋งตํ•‘์„ ํ•ด์ฃผ๊ฒ ๋‹จ ์†Œ๋ฆฌ์ด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— JPA์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž

JPA์˜ ๋™์ž‘ ์›๋ฆฌ

์˜ˆ๋ฅผ ๋“ค์–ด JPA์—๊ฒŒ MemberDAO์— ๊ฐ’์„ ๋„ฃ๊ณ ์ž member๊ฐ์ฒด๋ฅผ ๋„˜๊ธฐ๊ฒŒ ๋œ๋‹ค๋ฉด JPA๊ฐ€ ์ž๋™์ ์œผ๋กœ insert์ฟผ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  DB์— ๋ณด๋‚ด๊ณ  ๊ฐ’์„ ๋ฐ›๊ฒŒ ๋œ๋‹ค. JPA๋ž€ ์ฆ‰ ์›ํ•˜๋Š” ๋™์ž‘์— ๋งž๋Š” ์ฟผ๋ฆฌ๋ฅผ ์ž๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.


๊ทธ๋ ‡๋‹ค๋ฉด JPA๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋Š” ๋ญ˜๊นŒ?

์ƒ์‚ฐ์„ฑ : ์ด๋ฏธ ์ฝ”๋“œ๊ฐ€ ๋‹ค ๋งŒ๋“ค์–ด์ ธ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ž˜์ฒ˜๋Ÿผ ๋ถˆ๋Ÿฌ์“ฐ๋ฉด ๋œ๋‹ค

  • ํŠนํžˆ ์ˆ˜์ • ๋ถ€๋ถ„์—์„œ set๋งŒ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์ˆ˜์ •์ด ๋œ๋‹ค. ์ปฌ๋ ‰์…˜์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ํŽธํ•œ๋ฐ JAVA ์ปฌ๋ ‰์…˜์—์„œ ๊ฐ’์„ ์ฐพ์€ ํ›„ ์ˆ˜์ •์‹œ์— ๋‹ค์‹œ ๊ฐ’์„ ๋„ฃ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ถ€๋ถ„์—์„œ ํŽธํ•˜๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ ์ง€ ๋ณด์ˆ˜ : ์ฟผ๋ฆฌ ๋‹จ์„ ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค!

  • ๊ธฐ๋ณธ ์ ์œผ๋กœ ์—ฐ๋ฝ์ฒ˜๋ฅผ ์ถ”๊ฐ€ ์‹œ์— ์•„๋ž˜์˜ ์ฟผ๋ฆฌ๋ฌธ์„ ์ˆ˜์ •ํ•ด์•ผ ํ–ˆ๋‹ค๋ฉด JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด JPA์—์„œ ์ž์ฒด์ ์œผ๋กœ ์ฟผ๋ฆฌ๋ฌธ์„ ๋งŒ๋“ค์–ด ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— SQL์˜ ์ฟผ๋ฆฌ๋ฌธ์„ ์ˆ˜์ • ํ•  ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋œ๋‹ค.!

 

ํŒจ๋Ÿฌ๋‹ค์ž„์˜ ๋ถˆ์ผ์น˜ ํ•ด๊ฒฐ!

  • ๊ธฐ๋ณธ ์ ์œผ๋กœ ์•„๋ž˜์˜ ๋ฐ์ดํ„ฐ ๊ด€๊ณ„๋ฅผ ๊ตฌ์ƒํ•˜๊ณ  ์ง์ ‘ ์ฟผ๋ฆฌ๋ฌธ์„ ์งœ์•ผ ํ–ˆ๋‹ค๋ฉด ์ด์ œ๋Š” JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค.

  • JPA๋ฅผ ์ด์šฉํ•ด์„œ ์•„๋ž˜์˜ member ๊ฐ์ฒด๋ฅผ ๋“ค๊ณ  ์˜จ๋‹ค๋ฉด JPA์˜ ์ง€์—ฐ ๋กœ๋”ฉ(๊ตฌ๋ฌธ์ด ์‹คํ–‰๋˜๋Š” ์ˆœ๊ฐ„ ์ž‘๋™ํ•˜๋Š” ๊ตฌ๋ฌธ ์˜ˆ๋ฅผ ๋“ค์–ด member.getTeam์ด ์‹œ์ž‘๋˜๋Š” ์‹œ์ ์— member๊ฐ์ฒด์— ์ฟผ๋ฆฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฑ„์›Œ์ค€๋‹ค.)์„ ์ด์šฉํ•˜์—ฌ ์•„๋ž˜์˜ ๊ตฌ๋ฌธ์„ ์‹ ๋ขฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์„ฑ๋Šฅ ์ตœ์ ํ™”

  • ๋™์ผ Transactional์•ˆ์—์„œ๋Š” ๋™์ผ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.

  • JPA๋Š” ์ฟผ๋ฆฌ๋“ค์„ ๋ฐ›์€ ํ›„ ๋ฉ”๋ชจ๋ฆฌ์— ์Œ“์•„๋‘” ํ›„ commit์‹œ์ ์— ๊ฐ™์€ ์ฟผ๋ฆฌ๋“ค์„ ์˜ต์…˜์„ ํ•˜๋‚˜ ํ‚จ ๊ฒƒ๋งŒ์œผ๋กœ ํ•œ ๋ฒˆ์— ๋ณด๋‚ธ๋‹ค.

  • ์ง€์—ฐ ๋กœ๋”ฉ : member๊ฐ์ฒด๋ฅผ ๊บผ๋‚ธ ํ›„ getTeam์œผ๋กœ ๋“ค๊ณ ์˜จ team์„ ๊ฑด๋“ค๊ฒŒ ๋  ๋•Œ ์‹ค์ œ DB์— ์ฟผ๋ฆฌ ๊ฐ’์„ ๋ณด๋‚ด team์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋“ค๊ณ  ์˜ค๊ฒŒ ๋œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด ์•„๋ž˜์˜ ๊ทธ๋ฆผ์—์„œ Team team = member.getTeam();์‹œ์ ์— team์˜ ๊ฐ’์„ ์กฐํšŒํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ String teamName = team.getName();์‹œ์ ์— team์„ ๊ฑด๋“œ๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.
  • ์ฆ‰์‹œ ๋กœ๋”ฉ : ์‹ค์ œ๋กœ ์‚ฌ์šฉ์‹œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ member๋ฅผ ์‚ฌ์šฉ์‹œ team์„ ๋“ค๊ณ  ์™€์•ผ ํ•œ๋‹ค๋ฉด JPA์˜ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฆ‰์‹œ ๋กœ๋”ฉ์„ ์ด์šฉํ•ด member๋ฅผ ๋“ค๊ณ  ์˜ฌ ๋•Œ team์„ ๋“ค๊ณ  ์˜ค๊ฒŒ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ ์‹œ ์ด๋ฏธ ๋กœ๋”ฉ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋“ค๊ณ  ์˜จ๋‹ค.

์ถœ์ฒ˜ : https://inf.run/spjG