๐Ÿผ ๋ฐฑ์•ค๋“œ/Spring

JPA ๊ฐœ๋…์žก๊ธฐ

๊ณ„๋ž€์†Œ๋…„ 2023. 9. 2. 00:09

JPA๋Š” Java Persistence(์˜์†์„ฑ) API์ด๋‹ค.

ex) ๋žจ์€ ํœ˜๋ฐœ์„ฑ. ์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋“œ๋””์Šคํฌ์— ๊ธฐ๋กํ•˜๋ฉด ๋น„ํœ˜๋ฐœ์„ฑ์ด๋ฏ€๋กœ ์˜๊ตฌ์ €์žฅ๋จ.

์˜๊ตฌํžˆ ๊ธฐ๋ก๋˜๋Š”๊ฒŒ Persistence. ์ž๋ฐ”๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ์„ DBMS๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

 

JPA๋Š” ์ž๋ฐ”์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌํžˆ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ์ œ๊ณตํ•˜๋Š” API

API๋ž€? 

Application -> ํ”„๋กœ๊ทธ๋žจ

Programming ->ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ†ตํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ ๋งŒ๋“ฌ

Interface ->์ด๊ฑธ ํ†ตํ•ด์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

 

์•ฝ์†(ํ”„๋กœํ† ์ฝœ vs ์ธํ„ฐํŽ˜์ด์Šค)

ํ”„๋กœํ† ์ฝœ: ์•ฝ์† - A,B,C์˜ ๊ถŒ๋ฆฌ๊ฐ€ ๋™๋“ฑํ•˜๋‹ค. B๊ฐ€ ๊ฐ•์••ํ•  ์ˆ˜ ์—†๋‹ค. ์„œ๋กœ๊ฐ€ ๋ชจ๋‘ ๋™์˜ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

vs

์ธํ„ฐํŽ˜์ด์Šค: ์•ฝ์† - B๊ฐ€ ํž˜์ด ์…ˆ. B๊ฐ€ ๋งŒ๋“  ๊ทœ์น™์„ A์™€ C๊ฐ€ ๋ฌด์กฐ๊ฑด ๋”ฐ๋ผ์•ผ ํ•œ๋‹ค. ์ฆ‰, B๊ฐ€ ๊ทœ์น™์„ ์ •ํ•  ๋•Œ ๊ฐ•๋ ฅํ•œ ์ œํ•œ์„ ๋‘ 

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

์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋ฉด ์ด๊ฒƒ์ด API. 

 

์ •๋ฆฌํ•ด๋ณด์ž

JPA(Java Persistence Application Programming Interface) : Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ๋•Œ ์˜๊ตฌ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ์ธํ„ฐํŽ˜์ด์Šค

 

JPA๋Š” ORM ๊ธฐ์ˆ ์ด๋‹ค.

ORM(Object Relational Mapping) - ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•: ๋‚˜์˜ ํ•˜์ธ!

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

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

์„ค๊ณ„๋„๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฑด๋ฌผ์„ ์ง€์œผ๋ฉด  "๋ชจ๋ธ๋ง: ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์„ ํ˜„์‹ค์„ธ๊ณ„๋กœ ๋ฝ‘๋Š”๊ฒƒ"

์ž๋ฐ”                                Input(Delete,Update,Insert)      ->                ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

               <-                              Output(Select)

์ด๋•Œ, ์ž๋ฐ”์™€  DB์˜ ๋ฐ์ดํ„ฐํƒ€์ž…์ด ๋‹ค๋ฅด๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๋ชจ๋ธ๋งํ•ด์•ผํ•œ๋‹ค.

DB๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ”์— ๋ชจ๋ธ๋ง!

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

๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๊ฑธ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ž๋™์ƒ์„ฑ

์ด๋•Œ ํ•„์š”ํ•œ๊ฒŒ JPA

์ด ๊ธฐ๋ฒ•์„ ORM์ด๋ผ๊ณ  ํ•œ๋‹ค.

JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ถ”์ƒํ™”ํ•˜๊ณ , ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ฐœ๋ฐœ์ž๊ฐ€ SQL ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

์š”์•ฝํ•˜๋ฉด, JPA๋Š” ORM ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜๋กœ ์ž๋ฐ” ๊ฐ์ฒด์™€ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋ฉฐ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ํ†ตํ•ฉ์„ ๋” ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์ค‘์š”ํ•œ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

 

 

JPA๋Š” ๋ฐ˜๋ณต์ ์ธ CRUD (Create, Read, Update, Delete) ์ž‘์—…์„ ์ƒ๋žตํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

Select(R), Selecet All(R),Delte(D),Update(U),Insert(C)๋ฅผ ํ•˜๋ ค๋ฉด, ์ž๋ฐ”์—์„œ DB์— ์ปค๋„ฅ์…˜์„ ์š”์ฒญํ•œ๋‹ค.

DB๊ฐ€ ์‹ ๋ถ„์„ ํ™•์ธํ•˜๊ณ  ์„ธ์…˜์„ ์˜คํ”ˆํ•˜๊ฒŒ๋˜๊ณ , ์ž๋ฐ”๋Š” Connection์„ ๊ฐ€์ง€๊ฒŒ ๋จ.

๊ทธ ํ›„ ์ž๋ฐ”์—์„œ DB๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค. DB๋Š” ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด๋‚ด๋Š”๋ฐ, ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์ž๋ฐ”์— ์‘๋‹ตํ•˜๋Š”๋ฐ

์ž๋ฐ”ํƒ€์ž…๊ณผ DBํƒ€์ž…์ด ๋‹ค๋ฅด๋ฏ€๋กœ, ์ž๋ฐ”๋Š” ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ” ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€๊ฒฝํ•ด์•ผํ•œ๋‹ค. 

์ฆ‰, ์ž๋ฐ”๊ฐ€ ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ์ฟผ๋ฆฌ๋กœ ์ „์†กํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ๋ ค ๋ณด๋‚ด๋Š”๋ฐ, ์ด ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํƒ€์ž…์ด๊ธฐ์—

์ž๋ฐ”๋Š” ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ , ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ”๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž๋ฐ” ์˜ค๋ธŒ์ ํŠธ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ์ผ์„ ํ•ด์•ผํ•œ๋‹ค.

์ด๋Š” ๋‹จ์ˆœํ•œ ๋ฐ˜๋ณต ๋กœ์ง์ด๊ณ , ์ด ๋ฐ˜๋ณต์„ ์ค„์ด๋Š”๊ฒƒ์ด JPA์ด๋‹ค. 

JPA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ชจ๋“  ์ž‘์—…์„ ํ•จ์ˆ˜ ํ•˜๋‚˜๋กœ ์ œ๊ณตํ•ด์ค€๋‹ค.

 

 

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

 

์˜์†์„ฑ: ๋ฐ์ดํ„ฐ๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ

์ž๋ฐ”์—์„œ๋Š” DB์— ์ €์žฅํ•œ๋‹ค.

์ปจํ…์ŠคํŠธ: ๋ชจ๋“ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ

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

 ์˜์†์„ฑ์ปจํ…์ŠคํŠธ์—์„œ ์ผ์–ด๋‚˜๋Š” ๋ชจ๋“  ์ผ๋“ค์€ ์ž๋™์œผ๋กœ ์ง„ํ–‰

์š”์•ฝํ•˜๋ฉด, ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋Š” JPA์˜ ํ•ต์‹ฌ ๊ฐœ๋…์œผ๋กœ, ์—”ํ‹ฐํ‹ฐ ๊ด€๋ฆฌ, ์บ์‹ฑ, ๋”ํ‹ฐ ์ฒดํ‚น ๋“ฑ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ด€๋ฆฌํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ์ถ”์ƒํ™”ํ•˜์—ฌ ๋” ํŽธ๋ฆฌํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

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

 

DB์— Team,Player ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

ID Name Year
1 ๋กฏ๋ฐ 1990
2 NC 2005
ID Name TeamID: FK(์ฐธ์กฐํ‚ค)
1 ์ด๋Œ€ํ˜ธ 1
2 ํ™๊ธธ๋™ 2

๊ฐ๊ฐ์˜ ์ปฌ๋Ÿผ๋“ค์€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๊ธฐ๋ณธ์ž๋ฃŒํ˜•์œผ๋กœ  ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ชป๊ฐ€์ง„๋‹ค.

์ด๋Œ€ํ˜ธ๋Š” 1์ด๋ผ๋Š” Int ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๋Š”๊ฑฐ์ง€, {1,๋กฏ๋ฐ,1990)}์ด๋Ÿฐ ํ†ต์œผ๋กœ ๋“ค๊ณ  ์žˆ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๋ชป๊ฐ€์ง„๋‹ค.

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

Class Player{
    int id;
    String name;
    int teamId;
}

๊ทธ๋Ÿฐ๋ฐ ์ž๋ฐ”๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฌ๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋งŒ๋“ ๊ฒƒ๊ณผ ์ž๋ฐ”๋กœ ๋งŒ๋“ ๊ฒƒ์ด ๋ชจ์ˆœ์ด๋œ๋‹ค.

ORM์„ ํ•˜๊ฒŒ ๋˜๋ฉด ๋ชจ๋ธ์„ ๋งŒ๋“ค ๋•Œ ์ž๋ฐ”๊ฐ€ ์ฃผ๋„๊ถŒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ชจ๋ธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

Class Player{
    int id;
    String name;
    Team team;
}

ORM์„ ํ†ตํ•ด์„œ DB์™€ OOP์˜ ๋ถˆ์ผ์น˜์„ฑ์„ ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

DB๋Š” ๊ฐ์ฒด์ €์žฅ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ์ž๋ฐ”๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค. ์ž๋ฐ”์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐํ• ๋•Œ๋Š” ๊ฐ์ฒด์— ์ €์žฅํ•˜๊ณ , ์ด๊ฑธ DB์— ๋„ฃ์„๋•Œ๋Š” 

JPA๊ฐ€ ์ž๋™์œผ๋กœ foreign key๋ฅผ ์ง‘์–ด๋„ฃ์–ด์ค€๋‹ค.

์ฆ‰, ORM์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐ์ฒด ์ง€ํ–ฅ ๋ชจ๋ธ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

 

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

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

1

Class Car{
    int id;(PK)
    String name;
    String color;
    Engine engine;
}
Class Engine{
    int id;
    int power;
}

JPA๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ํด๋ž˜์Šค๋ฅผ ํ† ๋Œ€๋กœ ์ž๋™ ์ƒ์„ฑํ•ด์„œ DB๋ฅผ ๋งŒ๋“ ๋‹ค.

2Car

id name color enginId
1 BMW white 2
2 sonata black 1

2Engine

id power
1 2000
2 4000

1์„ ํ†ตํ•ด์„œ 2๊ฐ€ ์ž๋™์ƒ์„ฑ๋œ๋‹ค.

์ถ”๊ฐ€๋กœ

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;
}

์ƒ์†ํ•˜๋ฉด, ๋ฐ‘์— ํ•„๋“œ๊ฐ€ ๋” ์ƒ๊ธด๊ฒƒ๊ณผ ๊ฐ™์€ ํšจ๊ณผ

id name color enginId createDate updateDate
1 BMW white 2    
2 sonata black  1    

 

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

์Šคํ”„๋ง - JPA - DB

JPA๋Š” ์ˆ˜๋งŽ์€ ๋ฐฉ์–ธ๋“ค์„ ์ง€์›ํ•ด์คŒ(MySQL,์˜ค๋ผํด,MSSQL ๋“ฑ๋“ฑ)

์ด๊ฑธ ์ •ํ•ด๋†“๊ณ  ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด์•„๋‹Œ, JPA์— ์ถ”์ƒํ™” ๊ฐ์ฒด๋ฅผ ๋‘๊ณ , ์ถ”์ƒํ™”๊ฐ์ฒด๊ฐ€ DB์— ๋‹ฌ๋ผ๋ถ™์–ด์žˆ๋‹ค. 

์ถ”์ƒํ™”๊ฐ์ฒด์— ์˜ค๋ผํด์„ ๋งŒ๋“ค์–ด์„œ ์—ฐ๊ฒฐํ•˜๋ฉด  ์ถ”์ƒํ™”๊ฐ์ฒด๊ฐ€ ์˜ค๋ผํด์ด๋˜์–ด, ์˜ค๋ผํด๋กœ ์—ฐ๊ฒฐ๋œ๋‹ค.

 

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