Community

๐Ÿ•Š๏ธ [Medium] JPA vs Hibernate vs DataJPA

Java์—์„œ ๋ฐ์ดํ„ฐ ์ง€์†์„ฑ์€ ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›์•˜์œผ๋ฉฐ, ๋ˆˆ์— ๋„๋Š” ๋ฐœ์ „์„ ์ด๋ค„์™”์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” JDBC API๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ, ์ ์  ๋” ์ถ”์ƒํ™”๋˜๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ํ‘œ์ค€ํ™”๋œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์œผ๋กœ ๋ฐœ์ „ํ•ด์™”์Šต๋‹ˆ๋‹ค. ย  ์ด๋Ÿฌํ•œ ์ง„ํ™” ๊ณผ์ •์—์„œ ๋งŽ์€ ์ง€์†์„ฑ ๊ธฐ์ˆ ์ด ๊ฐœ๋ฐœ๋˜์—ˆ์œผ๋ฉฐ, ์ด๋“ค ๊ฐ„์˜ ์ฐจ์ด๋Š” ์ข…์ข… ๊ฐœ๋ฐœ์ž๋“ค ์‚ฌ์ด์—์„œ ํ˜ผ๋ž€์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ๋กœ๋Š” Hibernate, JPA, Spring Data JPA๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ย  ๊ฐœ๋ฐœํ•  ๋•Œ ์ด ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผ ํ• ๊นŒ์š”? ์•„๋‹ˆ๋ฉด ์ด๋“ค ๋ชจ๋‘๋ฅผ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? Hibernate Hibernate๋Š” ๊ฐ€์žฅ ์ธ๊ธฐ ์žˆ๋Š” Java ORM(Object Relational Mapping) ํ”„๋ ˆ์ž„์›Œํฌ ์ค‘ ํ•˜๋‚˜๋กœ, Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ„์˜ ์ƒํ˜ธ์ž‘์šฉ์„ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋ ˆ์ž„์›Œํฌ๋Š” Java ํด๋ž˜์Šค์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ…Œ์ด๋ธ”์„ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ์ฒด/๊ด€๊ณ„ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Hibernate๋Š” ์ฃผ์„(annotations)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งคํ•‘์ด ์ด๋ฃจ์–ด์ง€๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์„ ์ค‘ ์ผ๋ถ€๋Š” ์•„๋ž˜์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค. @Entity @Table(name = "CAR") public class Car { @Id @Column(name = "CAR_ID") private Long cardId; @Column(name = "COLOR") private String color; @ManyToOne() @JoinColumn(name = "OWNER_ID") private Owner owner; } Hibernate๊ฐ€ Java์—์„œ ๋งค์šฐ ์ธ๊ธฐ๊ฐ€ ์žˆ๋Š” ์ด์œ ๋Š” ๋ช‡ ๊ฐ€์ง€ ์žฅ์  ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค: ย  * ์ƒ์‚ฐ์„ฑ: ๋Œ€๋ถ€๋ถ„์˜ ๊ตฌํ˜„์ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ˆจ๊ฒจ์ ธ ์žˆ์–ด ๋น„์ฆˆ๋‹ˆ์Šค ๋ฌธ์ œ์— ๋Œ€ํ•œ ์ตœ์„ ์˜ ํ•ด๊ฒฐ์ฑ…์— ์ง‘์ค‘ํ•˜๊ธฐ๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. * ์„ฑ๋Šฅ: Hibernate๋Š” ์บ์‹ฑ(caching) ๋ฐ ๋ฐฐ์นญ(batching)๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์ตœ์ ํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. * ์ง๊ด€์„ฑ: ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ์• ๋…ธํ…Œ์ด์…˜์„ ํ†ตํ•ด ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Hibernate๋Š” ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ JPA ํ‘œ์ค€์„ ์ค€์ˆ˜ํ•˜๊ณ  ๊ทธ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, Hibernate๋Š” ์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ณ  ์ผ๋ถ€ ๊ณ ์œ ํ•œ ๊ธฐ๋Šฅ์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฒด์ ์ธ ๊ตฌํ˜„๋„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” JPA๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”? JPA JPA(Java Persistence API)๋Š” ๊ทœ๊ฒฉ์ด์ž, Java์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ €์žฅํ•˜๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์˜ ์ผ๋ถ€๊ฐ€ ๋˜๊ณ ์ž ํ•˜๋Š” ORM ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ผ๋ จ์˜ ๊ทœ์น™์ž…๋‹ˆ๋‹ค. ย  JPA๋Š” Hibernate์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•„๋‹ˆ๋ผ, ORM ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ๋ถˆ๊ณผํ•ฉ๋‹ˆ๋‹ค. ย  JPA๋Š” ์ง€์†์„ฑ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด EntityManager์™€ EntityManagerFactory์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. EntityManager๋Š” ์—”ํ‹ฐํ‹ฐ์˜ ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ด๋ฅผ SQL ์ฟผ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” Persistence Context๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. JPA์˜ ์ฃผ์š” ์žฅ์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: * ์ƒํ˜ธ ์šด์šฉ์„ฑ(Interportability): ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ JPA๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒฝ์šฐ, ํ•œ ORM ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ด๋™ํ•˜๋Š” ๊ณผ์ •์ด ํ›จ์”ฌ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. * ์‚ฌ์šฉ ํŽธ์˜์„ฑ(Usability): JPQL์ด ์ฟผ๋ฆฌ๋ฅผ ์ •์˜ํ•  ๋•Œ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค์™€ ๊ทธ ํ•„๋“œ๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— SQL ์ฟผ๋ฆฌ ์ž‘์„ฑ์ด ๋”์šฑ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค. Spring Data JPA Hibernate์™€ JPA๊ฐ€ ๋ชจ๋“  Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ˜๋ฉด, Spring Data JPA๋Š” Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. Spring Data JPA๋Š” Spring Data ํ”„๋กœ์ ํŠธ์˜ ์ผ๋ถ€๋กœ, ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๋ฅผ ์ค„์—ฌ์คŒ์œผ๋กœ์จ Spring ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” JPA ์ž‘์—…์„ ๋”์šฑ ์ƒ์‚ฐ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ถ”๊ฐ€์ ์ธ ์ถ”์ƒํ™” ์ˆ˜์ค€์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. Spring Data JPA์˜ ๊ฐ€์žฅ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” Spring์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜์—ฌ, SimpleJpaRepository์˜ ๋„์›€์œผ๋กœ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๊ตฌํ˜„์ด ๋Ÿฐํƒ€์ž„์— ์ž๋™์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜์†์„ฑ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ ์ž ํ•  ๋•Œ, JpaRepository๋ฅผ ํ™•์žฅํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ž‘์„ฑํ•˜๋ฉด ๋ชจ๋“  ๋ฉ”์„œ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ •๋ง ํŽธ๋ฆฌํ•˜์ฃ ! ๊ฒฐ๋ก  ๊ธ€์˜ ์ดˆ๋ฐ˜์— ์ œ๊ธฐ๋œ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: ย  ๋„ค, Hibernate, JPA ๋ฐ Spring Data JPA๋Š” ๊ฐ์ž๊ฐ€ ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ๋‹ค๋ฅธ ๋ชฉ์ ์„ ๊ฐ€์ง€๋ฏ€๋กœ, ๊ทธ ์œ ์‚ฌ์„ฑ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒˆ์—ญ: [https://ducktopia.tistory.com/131] ์›๋ฌธ:

์•Œ๋ฆผ

์•Œ๋ฆผ์ด ์—†์Šต๋‹ˆ๋‹ค