JiwonDev

JPA #2 ๋ณธ๊ฒฉ์ ์œผ๋กœ ์•Œ์•„๋ณด์ž.

by JiwonDev

ํ•ด๋‹น ๊ธ€์€ https://www.inflearn.com/course/ORM-JPA-Basic ์„ ๊ณต๋ถ€ํ•˜๊ณ  ์ •๋ฆฌํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

 

๐Ÿ“Œ Java Persistenec API

์ค„์—ฌ์„œ JPA, ํ˜„๋Œ€์˜ ์ž๋ฐ” ์ง„์˜์˜ ORM ๊ธฐ์ˆ  ํ‘œ์ค€.

์ฐธ๊ณ ๋กœ ์ด์ „์—๋Š” EJB(์—”ํ‹ฐ๋”” ๋นˆ)์„ ํ‘œ์ค€์œผ๋กœ ์ œ๊ณตํ–ˆ์—ˆ๋Š”๋ฐ, ์ด๊ฒŒ ์„ฑ๋Šฅ๋„ ๊ตฌ๋ฆฌ๊ณ  ์‚ฌ์šฉ๋ฒ•๋„ ๊ตฌ๋ ค์„œ ์•„๋ฌด๋„ ์“ฐ์ง€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ๊ฐœ๋ฐœ์ž๊ฐ€ ๋นก์ณ์„œ ๋งŒ๋“  ๊ฒƒ์ด 'ํ•˜์ด๋ฒ„๋„ค์ดํŠธ' ์˜€๊ณ  ์ด ์˜คํ”ˆ์†Œ์Šค ๊ฐœ๋ฐœ์ž๋ฅผ ์ž๋ฐ” ์ง„์˜์—์„œ ๋‚ฉ์น˜(?)ํ•ด์„œ ํ‘œ์ค€์œผ๋กœ  ๋‹ค๋“ฌ์–ด ์ƒˆ๋กœ ๋งŒ๋“  ๊ฒƒ์ด JPA ์ด๋‹ค.

JPA๋Š” 2006๋…„์— ์ฒซ ๋“ฑ์žฅํ•œ ์ž๋ฐ” ์ง„์˜์˜ ORM ๊ธฐ์ˆ  ํ‘œ์ค€์ด๋‹ค. 

 

 

๐Ÿ“Œ JPA๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ด๋‹ค.

Java Persistence API. ์ด๋ฆ„์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด JPA๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ ํ˜€์žˆ์œผ๋ฉฐ ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋ฒค๋”(๊ตฌํ˜„์ฒด)๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต์€ JPA์˜ ์‹œ์ดˆ์ธ Hibernate๋ฅผ ๊ตฌํ˜„์ฒด๋กœ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

์ฐธ๊ณ ๋กœ EclipserLink์™€ DataNucleus๋Š” JPA2.1 ๋•Œ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

 

2.0 ์ดํ›„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๊ด€๋ จ๋œ ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ๋‹ค ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.


๐Ÿ“Œ ORM

Object-Realtional mapping, ๊ฐ์ฒด - ๊ด€๊ณ„ํ˜• DB ๋งคํ•‘ ๊ธฐ์ˆ ์ด๋‹ค. ๊ฐ์ฒด๋Š” ๊ฐ์ฒด๋Œ€๋กœ, DB๋Š” DB๋Œ€๋กœ ์„ค๊ณ„ํ•˜์—ฌ ORM์„ ์ด์šฉํ•˜์—ฌ ์ค‘๊ฐ„์—์„œ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

ORM ๊ธฐ์ˆ ์€ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด์—์„œ ์ง€์›ํ•ด์ฃผ๊ณ  ์žˆ๋‹ค.

 

Java๋Š” JDBC API๋ฅผ ์ด์šฉํ•ด์„œ DB๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰ JPA๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค.

์„œ๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ์„ค๊ณ„ํ•ด๋„ ๊ดœ์ฐฎ๊ฒŒ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ์ˆ . ORM (=JPA)

 


๐Ÿ“Œ JPA์˜ CRUD

์ •๋ง ์‰ฝ๋‹ค. ๊ทธ๋ƒฅ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  DB๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

// Create
jpa.persist(member)

// Read
Member member = jpa.find(memberId)

// Write
member.setName("๋ณ€๊ฒฝํ•  ์ด๋ฆ„")

// Delete
jpa.remove(member)

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒˆ๋กœ์šด ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜๋”๋ผ๋„ ๋ณ„๋‹ค๋ฅธ ์ˆ˜์ • ์—†์ด ์œ„์˜ CRUD ์ฝ”๋“œ๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// ํ•„๋“œ ์ถ”๊ฐ€๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
// SQL ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
Public class Member {
	private String newTitle;
}

 

๊ธฐ์กด JDBC๋ฅผ ์‚ฌ์šฉํ•ด๋ดค๋‹ค๋ฉด, ์ด๊ฒŒ ์–ผ๋งˆ๋‚˜ ๋†€๋ผ์šด ์ผ์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

์™œ๋ƒํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ๊ฐ์ฒด๋กœ ์ €์žฅ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ํ…Œ์ด๋ธ”๋กœ ์ €์žฅ๋˜๊ธฐ๋•Œ๋ฌธ์—, ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด ์ปฌ๋ ‰์…˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘๊ฐ„์— ์ •๋ง ๋งŽ์€ ์˜ค๋ฅ˜๋“ค์ด ์ƒ๊ธฐ๊ณ , ์œ ์ง€ ๋ณด์ˆ˜ํ•˜๊ธฐ๋„ ๋งค์šฐ ๋ณต์žกํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ž๋ฐ” ์ปฌ๋ ‰์…˜์ฒ˜๋Ÿผ ๊ฐ์ฒด ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์—์„œ๋Š” ์ด๋Ÿฐ ๊ธฐ๋Šฅ์ด ์—†๋‹ค.

์‹ค์ œ๋กœ ๊ธฐ์กด์˜ JDBC๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ๊ฐ์ฒด๋กœ ์ „ํ™˜ํ•˜๋Š”๊ฒŒ ์–ด๋ ค์›Œ ๊ทธ๋ƒฅ SuperDTO ๊ฐ™์€๊ฑธ ๋งŒ๋“ค์–ด์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค ํ•œ๋ฒˆ์— ๊ฐ€์ ธ์˜ค๊ณ  ํ•˜๋‚˜์”ฉ ๊ฐ์ฒด์— ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์„ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณค ํ–ˆ์—ˆ๋‹ค.

 


๐Ÿ“Œ JPA๋Š” ์•ฑ๊ณผ JDBC ์ค‘๊ฐ„์—์„œ ๋™์ž‘ํ•œ๋‹ค.

JPA์€ ์•Œ์•„์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ํ†ต์‹ ํ•˜๋Š” ๋งˆ๋ฒ•์˜ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•œ ๊ฐ์ฒด์ง€ํ–ฅ ์ฝ”๋“œ๋ฅผ ํ† ๋Œ€๋กœ SQL๋ฌธ์„ ์ž‘์„ฑํ•˜๊ณ  JDBC์™€ ์—ฐ๊ฒฐํ•œ๋‹ค. JPA์˜ ํ•ต์‹ฌ์€ ORM ๊ธฐ์ˆ ์„ ์ด์šฉํ•˜์—ฌ ๊ฐ์ฒด์™€ RDB์˜ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

 


๐Ÿ“Œ ๊ทธ๋Ÿผ JPA๋ฅผ ์“ฐ๋ฉด ์„ฑ๋Šฅ์ด ๋–จ์–ด์ง€๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€์š”?

JPA๋กœ ์ธํ•ด ๊ณ„์ธต์ด ํ•˜๋‚˜ ๋” ์ƒ๊ธฐ๋ฉฐ ๋Š๋ ค์ง„๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์„ฑ๋Šฅ์— ์ตœ์ ํ™”์™€ ๊ธฐ๋Šฅ๋“ค์ด ๊ฐ•๋ ฅํ•ด์„œ '์ž˜ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด' ๊ธฐ์กด์˜ JDBC ์ฝ”๋“œ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ๋” ์ข‹์•„์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” JPA๋ฅผ ๊นŠ๊ฒŒ ๊ณต๋ถ€ํ•˜๋ฉด ๋ฌด์Šจ ๋ง์ธ์ง€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ดํ•ด๋  ๊ฒƒ์ด๋‹ค.

  • 1์ฐจ ์บ์‹œ์™€ ๋™์ผ์„ฑ(identity)๋ณด์žฅ
    - ๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ์•ˆ์—์„œ๋Š” ๊ฐ™์€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    - DB Isolation Level์„ ํ•œ ๋‹จ๊ณ„ ๋‚ฎ์ถฐ๋„(Read Commit) JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•ฑ์—์„œ Repetable Read๋ฅผ ๋ณด์žฅํ•œ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๋Š” Lazy ์“ฐ๊ธฐ ์ง€์›(transcational write-behind)
    - ํŠธ๋žœ์žญ์…˜์„ ์ปค๋ฐ‹ํ•  ๋•Œ๊นŒ์ง€ INSERT SQL๋ฌธ์„ ๋ชจ์€๋‹ค.
    - JDBC Batch SQL์„ ์ด์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์š”์ฒญ๋ฌธ์„ ๋„คํŠธ์›Œํฌ์—์„œ ํ•œ ์š”์ฒญ์œผ๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
    - JPA์—์„œ๋Š” ๊ฐ„๋‹จํ•œ ์˜ต์…˜ ์„ค์ •์„ ํ†ตํ•ด ์ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ฆ‰์‹œ ๋กœ๋”ฉ๊ณผ ์ง€์› ๋กœ๋”ฉ(Lazy Loading)์„ ์„ค์ • ํ•˜๋‚˜๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํŠœ๋‹ ๊ฐ€๋Šฅ.
    - ์ฆ‰์‹œ ๋กœ๋”ฉ : Join๋ฌธ์œผ๋กœ ์—ฐ๊ด€๋œ ๊ฐ์ฒด๋ฅผ ๋ฏธ๋ฆฌ ๋‹ค ๊ฐ€์ ธ์˜ด
    - ์ง€์—ฐ ๋กœ๋”ฉ : ๊ฐ์ฒด๊ฐ€ ์‹ค์ œ ์‚ฌ์šฉ๋  ๋•Œ ๋กœ๋”ฉํ•จ. ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒŒ ์•„๋‹˜
    ์ฆ‰์‹œ๋กœ๋”ฉ์„ ์‚ฌ์šฉํ•ด์„œ [ํ•ญ์ƒ ๋ฌถ์–ด์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ]๋ฅผ ํ•จ๊ป˜ ๊ฐ€์ ธ์™€ ์„ฑ๋Šฅ์„ ๋†’์ผ ์ˆ˜๋„ ์žˆ๋‹ค.

 


๐Ÿ“Œ JPA์™€ DB SQL๋ฅผ ๋‘˜ ๋‹ค ์ž˜ ์•Œ์•„์•ผ ํ•œ๋‹ค.

JPA๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•ด๋‹น ๋ฌธ์žฅ์ด ์–ด๋– ํ•œ SQL์„ ๋งŒ๋“ค์–ด๋‚ด๋Š”์ง€ ์œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฒŒ ์•ˆ๋œ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ์ถ”์ƒํ™”๋œ JPA ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ ๋Š” ์›์ธ์„ ์ ˆ๋Œ€ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ฐจ๋ผ๋ฆฌ JDBC๋กœ ์“ฐ๋Š”๊ฒŒ ๋” ํŽธํ• ๊ฑฐ์—์š”.

๊ฒฐ๊ตญ JPA๋„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” JDBC๋กœ ๋™์ž‘ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ƒํ™ฉ์— ๋Œ€์ฒ˜ํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ด€๊ณ„ํ˜• DB์— ๋Œ€ํ•œ ๊ณต๋ถ€๋Š” ํ•„์ˆ˜์ ์ด๋‹ค. ์ตœ๊ทผ ๋“ค์–ด JPA๊ฐ€ ๋Œ€์„ธ๊ฐ€ ๋˜๋ฉฐ 'JPA๋Š” ์“ธ ์ค„ ์•„๋Š”๋ฐ, SQL๋ฌธ์€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์–ด์š”'๋ผ๊ณ  ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ข…์ข… ๋ณด์ด๋Š”๋ฐ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•œ ์ดํ•ด ์—†์ด ๋‹จ์ˆœํžˆ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์ƒ๊ฐํ•˜๋‹ค๊ฐ€๋Š” ๋‚˜์ค‘์— ํฐ ๋ฌธ์ œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

์ถ”์ƒํ™”๋œ JPA ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฌธ์ œ๋ฅผ ์ฐพ๋Š”๊ฑด ๋ถˆ๊ฐ€๋Šฅ์— ๊ฐ€๊น๋‹ค. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด ํ•ด๋‹น JPA๊ฐ€ ์–ด๋– ํ•œ SQL์„ ๋งŒ๋“ค์–ด๋‚ด๋Š”์ง€ ์ •๋„๋Š” ์œ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.

 

SQL๊ณผ JPA, ๋‘˜ ๋‹ค ํ•  ์ค„ ์•Œ์•„์•ผ ํ•œ๋‹ค.

๋ธ”๋กœ๊ทธ์˜ ์ •๋ณด

JiwonDev

JiwonDev

ํ™œ๋™ํ•˜๊ธฐ