Skip to content

Latest commit

ย 

History

History
274 lines (170 loc) ยท 14.9 KB

File metadata and controls

274 lines (170 loc) ยท 14.9 KB

JPA๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”

๐Ÿ”— ๊ฐ•์˜๋งํฌ : https://www.inflearn.com/course/์Šคํ”„๋ง๋ถ€ํŠธ-๊ฐœ๋…์ •๋ฆฌ/dashboard

1. JPA๋Š” Java Persistence API์ด๋‹ค.

JPA๋ผ๋Š” ๊ฒƒ์€ Java Persistence Application Programming interface๋กœ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๋•Œ, ์˜๊ตฌ์ ์œผ๋กœ ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

โญ ์˜์†์„ฑ(persistence)๋ž€?

๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ์˜ ํŠน์„ฑ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์˜์†์„ฑ์€ ํŒŒ์ผ ์‹œ์Šคํ…œ, ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ˜น์€ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋“ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

์˜์†์„ฑ์„ ์˜ˆ์‹œ๋กœ ๋“ค์ž๋ฉด RAM์— ๊ฒฝ์šฐ ํœ˜๋ฐœ์„ฑ์ด๋ผ ์ปดํ“จํ„ฐ๊ฐ€ ๊บผ์ง€๊ฒŒ ๋˜๋ฉด ์‚ฌ๋ผ์ง€๊ฒŒ ๋˜๋Š”๋ฐ RAM์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋“ค์„ ํ•˜๋“œ๋””์Šคํฌ์— ์ €์žฅํ•˜๊ฒŒ ๋˜๋ฉด ํ•˜๋“œ๋””์Šคํฌ๋Š” ๋น„ํœ˜๋ฐœ์„ฑ์ด๋ผ์„œ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก DBMS๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

์ฆ‰, JPA๋ž€.. ์ž๋ฐ”์—์„œ ์˜๊ตฌํžˆ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” API๋ฅผ ๋งํ•œ๋‹ค.

โญ API๋ž€?

  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (A) โ‡’ ํ”„๋กœ๊ทธ๋žจ
  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ(P) โ‡’ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ์ธํ„ฐํŽ˜์ด์Šค(I) โ‡’ ์ธํ„ฐํŽ˜์ด์Šค

์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ณ  ๊ทธ๊ฑธ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์„ ๋œปํ•œ๋‹ค.

โญ ํ”„๋กœํ† ์ฝœ VS ์ธํ„ฐํŽ˜์ด์Šค

  1. ํ”„๋กœํ† ์ฝœ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ณตํ†ต์ 

๋‘˜ ๋‹ค ์•ฝ์†์„ ๋œปํ•œ๋‹ค.

  1. ์ฐจ์ด์ 
  • ์ธํ„ฐํŽ˜์ด์Šค

    ์ƒํ•˜ ๊ด€๊ณ„๊ฐ€ ์กด์žฌํ•˜๋Š” ์•ฝ์†

    • ์˜ˆ์‹œ๋กœ ๋“ค์ž๋ฉด ์žฅ๋ณด๊ณ ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์—ˆ๋‹ค. ๊ทผ๋ฐ ํ”„๋กœ๊ทธ๋žจ์ด ์ข‹์•„์„œ ๊ณต์œ ๋ฅผ ํ•˜๊ณ  ์‹ถ๋‹ค. ๊ทธ๋ž˜์„œ ํ™๊ธธ๋™ํ•œํ…Œ ๊ณต์œ ๋ฅผ ํ•˜๋Š”๋ฐ **โ€œA๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ฐค 12์‹œ๋ถ€ํ„ฐ ์ƒˆ๋ฒฝ 6์‹œ๊นŒ์ง€ ์‚ฌ์šฉํ•ด๋ผโ€**๊ณ  ์ƒ์˜์—†์ด ๋งํ–ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ธํ„ฐํŽ˜์ด์Šค
    • ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋ฉด ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ API
  • ํ”„๋กœํ† ์ฝœ

    ๋™๋“ฑํ•œ ๊ด€๊ณ„์— ์•ฝ์†

    • ์ˆ˜ ๋งŽ์€ ํ”„๋กœํ† ์ฝœ๋“ค์ด ๋ชจ์—ฌ์„œ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ์ธํ„ฐ

2. JPA๋Š” ORM(Obeject Relational Mapping) ๊ธฐ์ˆ ์ด๋‹ค.

๊ฑด๋ฌผ์„ ์ง“๋Š” ์„ค๊ณ„๋„๋กœ ๊ฑด๋ฌผ์„ ์˜ฌ๋ฆฌ๊ฒŒ ๋˜๋ฉด 3D๋กœ ๋‚˜์˜ค๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ๋ชจ๋ธ๋ง์ด๋ผ๊ณ  ํ•œ๋‹ค.

๋ชจ๋ธ๋ง ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์ถ”์ƒํ™”์ ์ธ ๊ฐœ๋…์„ ํ˜„์‹ค์„ธ๊ณ„์— ๊ตฌ์ฒดํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์ž๋ฐ”๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋‹ค๋ฅด๋‹ค. class๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” ํ…Œ์ด๋ธ”์„ ๋ชจ๋ธ๋งํ•ด์•ผ ํ•œ๋‹ค.

์›๋ž˜๋Œ€๋กœ๋ผ๋ฉด, ์ฒซ ๋ฒˆ์งธ๋กœ๋Š” DB ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  2๋ฒˆ์งธ๋กœ ์ž๋ฐ”์„ธ์ƒ์— ๋ชจ๋ธ๋งํ•œ๋‹ค. โ‡’ TRM(Table Relational Mapping)

class Team{
	int id;
	String name;
	String year;
}

ํ•˜์ง€๋งŒ, JPA๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ๋กœ ์ž๋ฐ”์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ ๊ฒƒ์ธ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‘ ๋ฒˆ์งธ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑ ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ ํ•„์š”ํ•œ ๊ฒƒ์ด ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

3. JPA๋Š” ๋ฐ˜๋ณต์ ์ธ CRUD ์ž‘์—…์„ ์ƒ๋žตํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

Select๋‚˜ Select All, Delete, Update, Insert ๋“ฑ์€ ์ž์ฃผ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋“ค์ด๋‹ค.

java์˜ ๊ฒฝ์šฐ DB์—๊ฒŒ Connect ์š”์ฒญ์„ ํ•œ๋‹ค. DB๊ฐ€ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๊ณ  Session์„ ์˜คํ”ˆํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด java๋Š” Conncection์„ ๊ฐ€์ง€๋ฉฐ, ๋‘ ๋ฒˆ์งธ์—๋Š” ์ฟผ๋ฆฌ๋ฅผ DB์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค. DB๋Š” ๊ทธ๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Data๋ฅผ java์— ์‘๋‹ตํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋•Œ, ์ž๋ฐ”๊ฐ€ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ DB๊ฐ€ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋‹ค๋ฅด๋‹ค.

์ฆ‰, ์ž๋ฐ” Object๋กœ ๋ณ€ํ™˜์„ ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๊ฒƒ์€ ๋‹จ์ˆœํ•œ ๋ฐ˜๋ณต๋กœ์ง์ด๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •๋“ค์„ connction์„ ์—ฐ๊ฒฐํ•˜๊ณ  ๋ณ€ํ™˜ํ•˜๊ณ  ๋“ฑ๋“ฑ์„ JPA๊ฐ€ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ์ œ๊ณตํ•ด์ค€๋‹ค.

4. JPA๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

์˜์†์„ฑ์ด๋ž€

๋ฐ์ดํ„ฐ โ‡’ ์˜๊ตฌ์  ์ €์žฅ(ํŒŒ์ผ์‹œ์Šคํ…œ X, DB O)

1) ์ปจํ…์ŠคํŠธ๋ž€?(Context)

Context๋ž€ ๋Œ€์ƒ์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ

๊ฐœ๋ฐœ์—์„œ ์ปจํ…์ŠคํŠธ ๊ฐœ๋…์€ ์กฐ๊ธˆ ์• ๋งคํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ์ดํ•ดํ•˜๋ฉด ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค. ๊ธธ๋™์ด๊ฐ€ ์˜์ˆ™์ด์—๊ฒŒ ๋‚œ ์˜์ˆ™์ด ๋„ˆ์˜ ๋ชจ๋“  ์ปจํ…์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด = ์˜์ˆ™์ด์˜ ๋ชจ๋“  ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ๋‹ค.

Context๋ฅผ ๋„˜๊ฒจ์ค€๋‹ค. = ๋ณด๊ณ ๊ฐ€ ๊ธธ๋™์ด์—๊ฒŒ ์˜์ˆ™์ด์˜ Context(๋ชจ๋“  ์ •๋ณด)๋ฅผ ๋„˜๊ฒจ

2) ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€?

์ž๋ฐ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ์•„๋Š” ๊ฒƒ์ด ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ

์ž๋ฐ”์— ์žˆ๋Š” ๋™๋ฌผ ๋ฐ์ดํ„ฐ๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋„ฃ๊ณ  ๋‚˜์„œ DB์—๋„ ์ €์žฅ ํ›„ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—์„œ ์‚ญ์ œ๋ฅผ ํ•˜๋ฉด ๋™๊ธฐํ™”๊ฐ€ ๋˜์–ด ์žˆ๊ธฐ์— DB์—์„œ๋„ ์‚ญ์ œ๊ฐ€ ๋œ๋‹ค.

์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์—๋Š” ์—†๊ณ  DB์—๋งŒ ๊ณผ์ผ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด..

์ผ๋‹จ ์ž๋ฐ”๋Š” 1. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋จผ์ € ์š”์ฒญ์„ ํ•œ๋‹ค. 2. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๊ธฐ์— DB์— ์š”์ฒญ ํ•œ๋‹ค. 3. DB์—์„œ ๊ฐ€์ ธ์™€ ์ž๋ฐ” object๋กœ ์˜์†์„ฑ์ปจํ…์ŠคํŠธ์— ์ €์žฅํ•œ๋‹ค. 4. ์ž๋ฐ”์— ๊ณผ์ผ๋ฐ์ดํ„ฐ๋ฅผ ์ค€๋‹ค.

๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ selectํ•ด์„œ ๊ฐ€์ ธ์˜ค๊ณ  updateํ•˜๋Š” ๋“ฑ ์ผ๋ จ์˜ ๋ชจ๋“  ์ •๋ณด๋ฅผ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ž๋ฐ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๋ชจ๋“  ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ์ •๋ณด๋“ค์„ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

java์—์„œ ๊ณผ์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๋”ธ๊ธฐ๋กœ ๋ฐ”๊พธ๋ฉด..

  1. ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ๊ณผ์ผ๋ฐ์ดํ„ฐ๋„ ๋”ธ๊ธฐ๋กœ ๋ฐ”๋€Œ๊ณ 
  2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— commitํ•ด์„œ ๋ฐ€์–ด๋„ฃ์œผ๋ฉด ์›๋ž˜ ์…‹์€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ์ธ๋ฐ 3๋ฒˆ์€ ์‚ฌ๊ณผ๋กœ ๋˜์–ด ์žˆ์–ด ๋”ธ๊ธฐ๋กœ ๋ฐ”๊พธ๊ธฐ์œ„ํ•ด update๊ฐ€ ์ž๋™์œผ๋กœ ์ผ์–ด๋‚œ๋‹ค.

5. JPA๋Š” DB์™€ OOP์˜ ๋ถˆ์ผ์น˜์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋ก ์„ ์ œ๊ณตํ•œ๋‹ค.(DB๋Š” ๊ฐ์ฒด์ €์žฅ ๋ถˆ๊ฐ€)

  • DB๋Š” ๊ธฐ๋ณธ์ž๋ฃŒํ˜•์œผ๋กœ Object๋ฅผ ๊ฐ€์ง€์ง€ ๋ชปํ•จ
    • teamId์˜ ๊ฒฝ์šฐ 1์ด๋ผ๋Š” ์ˆซ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•„๋ž˜์˜ ๊ทธ๋ฆผ ์ฒ˜๋Ÿผ object์ฑ„๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ๋ชปํ•œ๋‹ค.

  • ์ž๋ฐ” ๊ด€์  : ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋Š” ์•Œ ์ˆ˜ ์—†๊ธฐ์— join์„ ํ•˜๊ฑฐ๋‚˜ ๋‘ ๋ฒˆ์˜ select๊ฐ€ ํ•„์š”
class Team{
	int id;
	String name;
	String year;
}

class Player{
	int id; //=2
	String name; //=๊ณตํ•„์„ฑ
	int teamId; //=1
}

๊ทธ๋ ‡์ง€๋งŒ.. ์ž๋ฐ”๋Š” Object๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์•„๋ž˜์™€ ๊ฐ™์ด ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

class Player{
	int id; //=2
	String name; //=๊ณตํ•„์„ฑ
	Team team; //=team object
}

์ฆ‰, OOP๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ORM์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์ž๋ฐ”๊ฐ€ ์ฃผ๋„๊ถŒ์„ ๊ฐ€์ง„ ์ฆ‰, ์œ„์™€ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ.. JPA๊ฐ€ ์•Œ์•„์„œ Mapping ํ•ด์„œ select, insert๋“ฑ์„ ํ•ด์ฃผ๊ฒŒ ๋œ๋‹ค.

์ฆ‰, JPA๋Š” DB์™€ OOP์˜ ๋ถˆ์ผ์น˜์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•๋ก ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋จผ์ €, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ์ฃผ๋„๊ถŒ์„ ์žก๊ณ  ์žˆ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” Object๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์—†๊ธฐ์— OOP์™€ ๋ถˆ์ผ์น˜ํ•˜๊ฒŒ ๋˜์ง€๋งŒ JPA๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด OOP๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ฐ์ฒด ์ง€ํ–ฅ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ORM์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์ž๋ฐ”๊ฐ€ ์ฃผ๋„๊ถŒ์„ ๊ฐ€์ง„ ์ฆ‰, ์œ„์™€ ๊ฐ™์€ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

6. JPA๋Š” OOP ๊ด€์ ์—์„œ ๋ชจ๋ธ๋ง์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.(์ƒ์†, ์ฝคํฌ์ง€์…˜, ์—ฐ๊ด€๊ด€๊ณ„)

class Car{
	int id; //pk
	String name;
	String color;
	Engine engine;
}

class Engine{
	int id;
	int power;
}

โ‡’ ์ƒ์†์œผ๋กœ ๋˜์ง€๋Š” ์•Š๊ณ  ์ฝคํฌ์ง€์…˜(๊ฒฐํ•ฉ)ํ•ด์•ผ ํ•œ๋‹ค.

jpa์˜ ๊ฒฝ์šฐ class๋ฅผ ๋งŒ๋“  ๋‹ค์Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž๋™์ƒ์„ฑํ•ด์ค€๋‹ค. 1๋ฒˆ์ด ์ƒ์„ฑ ํ›„ 2๋ฒˆ์ด ์ž๋™์ƒ์„ฑ๋œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด OOP ๊ด€์ (๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ)์—์„œ ํ…Œ์ด๋ธ”์ด ๋งŒ๋“ค์–ด์ง€๊ฒŒ ๋œ๋‹ค.

Engine๊ณผ Car ํด๋ž˜์Šค์— ๋ชจ๋‘ ๋‹ค TimeStamp createDate;์™€ TimeStamp updateDate;๋ฅผ ๋„ฃ๊ณ  ์‹ถ๋‹ค๋ฉด

๊ทธ ๋ถ€๋ถ„์€ ๋ฐ˜๋ณต๋œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ํด๋ž˜์Šค์— ๋„ฃ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ฐ˜๋ณต๋œ ๊ฒƒ์„ ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.

class EntityDate{
	TimeStamp createDate;
	TimeStamp updateDate;
}

ํ›„์— ๊ทธ ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์œผ๋ฉด ๋œ๋‹ค.

class Car extends EntityDate{
	int id; //pk
	String name;
	String color;
	Engine engine;
}

class Engine extends EntityDate{
	int id;
	int power;
}

์ƒ์†์„ ๋ฐ›๊ฒŒ ๋˜๋ฉด ์˜†์— ํ•„๋“œ๊ฐ€ ๋” ์ƒ๊ธด๋‹ค.

์—ฐ๊ด€๊ด€๊ณ„์˜ ๊ฒฝ์šฐ ๋‘ ๊ฐ์ฒด(์—”ํ„ฐํ‹ฐ) ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ

์—ฐ๊ด€ ๊ด€๊ณ„ ํ‘œํ˜„

  1. ์ผ๋Œ€์ผ(One-to-One): ์˜ˆ๋ฅผ ๋“ค์–ด, ์‚ฌ์šฉ์ž(User)์™€ ํ”„๋กœํ•„(Profile)์ด๋ผ๋Š” ์—”ํ„ฐํ‹ฐ๊ฐ€ ์žˆ์„ ๋•Œ, ํ•œ ์‚ฌ์šฉ์ž๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœํ•„์„ ๊ฐ€์ง€๊ณ , ํ•œ ํ”„๋กœํ•„์€ ํ•˜๋‚˜์˜ ์‚ฌ์šฉ์ž์— ์†ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ์ผ๋Œ€๋‹ค(One-to-Many): ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ถ€์„œ(Department)์™€ ์‚ฌ์›(Employee)์ด๋ผ๋Š” ์—”ํ„ฐํ‹ฐ๊ฐ€ ์žˆ์„ ๋•Œ, ํ•˜๋‚˜์˜ ๋ถ€์„œ๋Š” ์—ฌ๋Ÿฌ ์‚ฌ์›์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.
  3. ๋‹ค๋Œ€์ผ(Many-to-One): ์ผ๋Œ€๋‹ค์˜ ๋ฐ˜๋Œ€๋กœ ์—ฌ๋Ÿฌ ์—”ํ„ฐํ‹ฐ๊ฐ€ ํ•˜๋‚˜์˜ ์—”ํ„ฐํ‹ฐ์— ์†ํ•˜๋Š” ๊ด€๊ณ„
  4. ๋‹ค๋Œ€๋‹ค(Many-to-Many): ์˜ˆ๋ฅผ ๋“ค์–ด, ํ•™์ƒ(Student)๊ณผ ๊ณผ๋ชฉ(Subject)์ด๋ผ๋Š” ์—”ํ„ฐํ‹ฐ๊ฐ€ ์žˆ์„ ๋•Œ, ํ•œ ํ•™์ƒ์€ ์—ฌ๋Ÿฌ ๊ณผ๋ชฉ์„ ์ˆ˜๊ฐ•ํ•˜๊ณ , ํ•œ ๊ณผ๋ชฉ์€ ์—ฌ๋Ÿฌ ํ•™์ƒ์—๊ฒŒ ์ˆ˜๊ฐ•๋  ์ˆ˜ ์žˆ๋‹ค.

ํ‘œํ˜„๋ฐฉ๋ฒ• : ์–ด๋…ธํ…Œ์ด์…˜

@OneToOne, @OneToMany, @ManyToOne, @ManyToMany ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋ฉด ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋„ ์ ์ ˆํ•œ ๊ณ„๊ฐ€ ๋งบ์–ด์ง€๊ฒŒ ๋œ๋‹ค.

7. ๋ฐฉ์–ธ ์ฒ˜๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜์—ฌ Migrationํ•˜๊ธฐ ์ข‹๋‹ค. ์œ ์ง€๋ณด์ˆ˜์— ์ข‹๋‹ค.

jpa๋Š” clialect์— ๋Œ€ํ•œ ๊ฒƒ๋“ค์„ ๋งŽ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.(oracle, maria, mssql, mysql, postgam)

๋˜ํ•œ DB๋Š” ์ถ”์ƒํ™”๊ฐ์ฒด๊ฐ€ ์ค‘๊ฐ„์— ์žˆ์–ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ณ€๊ฒฝ์—๋„ ์šฉ์ดํ•˜๋‹ค. ๋‚ด๊ฐ€ ๋งŒ์•ฝ ์˜ค๋ผํด์„ ์“ฐ๋‹ค MYSQL๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ์–ด๋„ ์ค‘๊ฐ„์— ์ถ”์ƒํ™” ๊ฐ์ฒด๊ฐ€ ์žˆ๊ธฐ์— ๋ฌด๋ฆฌ์—†์ด ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ๋ฐฉ์–ธ ์ฒ˜๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๊ธฐ ์ข‹๋‹ค๊ณ  ํ•œ๋‹ค.

1) JPA์˜ ์ถ”์ƒํ™” ๊ฐ์ฒด

์ถ”์ƒํ™” ๊ฐ์ฒด๋Š” ์—”ํ„ฐํ‹ฐ(Entity)๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด๋กœ ์ด ๊ฐ์ฒด๋“ค์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋˜์–ด ์žˆ์–ด์„œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๊ฐ„์˜ ๋งคํ•‘์„ ํŽธ๋ฆฌํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

  1. @Entity: ํด๋ž˜์Šค๋ฅผ ์—”ํ„ฐํ‹ฐ๋กœ ์ง€์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ ˆ์ฝ”๋“œ์— ๋งคํ•‘
  2. @Id: ์—”ํ„ฐํ‹ฐ์˜ ์ฃผ ์‹๋ณ„์ž(Primary Key)๋ฅผ ์ง€์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ์ฃผํ‚ค๋Š” ํ•ด๋‹น ์—”ํ„ฐํ‹ฐ๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ
  3. @GeneratedValue: ์ฃผ ํ‚ค์˜ ๊ฐ’์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋„๋ก ์ง€์ •ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
  4. @Column: ์—”ํ„ฐํ‹ฐ์˜ ํ•„๋“œ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ปฌ๋Ÿผ๊ณผ ๋งคํ•‘ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
  5. @ManyToOne, @OneToMany, @OneToOne, @ManyToMany: ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ์˜ ๋‹ค์–‘ํ•œ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜

2) Migration(๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด๋ž€)

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์˜ ๋ณ€๊ฒฝ์„ ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”๊ตฌ์‚ฌํ•ญ์ด๋‚˜ ์—…๋ฐ์ดํŠธ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•  ๋•Œ, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ƒˆ๋กœ์šด ๊ตฌ์กฐ๋กœ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค.

JPA์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋„๊ตฌ๋กœ Hibernate์™€ ๊ฐ™์€ ORM ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋„๊ตฌ๋“ค์€ ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์–ด์„œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ SQL ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ์ง€ํ–ฅ ๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ ๊ฐ„์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค.

3) Hibernate

์ž๋ฐ” ์–ธ์–ด๋ฅผ ์œ„ํ•œ ORM(Object-Relational Mapping)ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋กœ, ORM์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ๋งคํ•‘์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค. Hibernate๋Š” ์ด๋Ÿฌํ•œ ๋งคํ•‘์„ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.

Hibernate์˜ ์ฃผ์š” ํŠน์ง•๊ณผ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๊ฐ์ฒด-๊ด€๊ณ„ ๋งคํ•‘: Hibernate๋Š” ์ž๋ฐ” ๊ฐ์ฒด์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๋งคํ•‘์„ ์ง€์›ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ธ ์ž๋ฐ”์—์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋…๋ฆฝ์„ฑ: Hibernate๋Š” ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ๋‚ฎ์ถฐ์ค€๋‹ค. ์ฆ‰, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์ตœ์†Œํ™”
  3. ์ž๋™ ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐ ์—…๋ฐ์ดํŠธ: Hibernate๋Š” ๊ฐ์ฒด ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ SQL์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋˜๊ฒŒ ํ•ด์ค€๋‹ค.
  4. ์บ์‹ฑ: Hibernate๋Š” ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์บ์‹ฑ์„ ์ง€์›ํ•œ๋‹ค. ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋‚˜ ๊ฐ์ฒด ์ƒํƒœ๋ฅผ ์บ์‹œํ•˜์—ฌ ๋ฐ˜๋ณต์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์„ธ์Šค๋ฅผ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  5. ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ: Hibernate๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ๋„์›€์„ ์ค€๋‹ค. ACID ์†์„ฑ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ํŠธ๋žœ์žญ์…˜์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
  6. ์ฟผ๋ฆฌ ์–ธ์–ด ์ง€์›: Hibernate๋Š” HQL(Hibernate Query Language)๋ผ๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์ œ๊ณตํ•˜์—ฌ SQL์— ์ข…์†๋˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

Hibernate๋Š” ์ž๋ฐ” ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ๋งค์šฐ ์ธ๊ธฐ ์žˆ๋Š” ORM ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋กœ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๋‹ค.

8. JPA๋Š” ์‰ฝ์ง€๋งŒ ์–ด๋ ต๋‹ค.