JPA란 무엇인가요?

오늘은 Java 진영의 ORM으로 많이 사용되고 있는 JPA 대해서 작성해 보고자 합니다. 제가 JPA를 처음 접한 건 약 2년 전입니다. 국비학원 교육을 받을 때 학원에서는 MyBatis를 가르쳤던 터라 JPA를 사용할 기회가 없었는데요, 교육 막바지에 학원의 협력 기업들과 실무에 관련된 프로젝트를 실제로 경험해 볼 수 있었는데, 그 때 기업 실무자의 권유로 JPA를 사용하게 되었습니다. 그 당시에도 이미 가장 많이 사용되고 있는 ORM이었고, 진행했던 프로젝트 기획도 엄청나게 복잡한 기능을 요구했던 게 아니었기 때문에 JPA를 충분히 고려해 볼 만했습니다. 물론 당시에는 이런 이유들이 와닿지는 않았지만요. 그렇게 JPA를 이해하고 썼다기보다는 비슷한 기능을 구현한 사람들의 래퍼런스들을 찾아가며 카피하기에 바빴던 것 같습니다. 이때까지만 해도 JPA의 필요성을 그다지 체감하지 못했습니다. 지금까지도 개인적인 공부 외엔 JPA를 사용해 볼 수 있는 기회가 없었고, 회사에선 MyBatis나 레거시 프로젝트인 경우엔 iBatis를 이용해서 개발해 왔습니다. 그러면서 들었던 생각은…

“JPA 쓰고 싶다!”

  • 요구사항에 대한 대처가 쉽지 않았다.
  • 컴파일 단계에서 기본적인 에러(잘못된 SQL 문법이나 오타)를 감지하지 않기 때문에 사소한 실수에 시간이 많이 소요되는 경우가 생긴다.

이런 경우를 종종(되짚어보면 종종이 아닌 것 같지만…) 겪을 때마다 JPA를 도입하는 이유에 대해서 점점 이해할 수 있었던 것 같습니다. 각설하고 이제는 Spring Framework를 사용하는 회사라면 대부분 JPA를 도입하거나 사용하는 추세인 것 같습니다.

그렇다면 JPA란 무엇인지 먼저 살펴보도록 합시다!


JPA

JPAJava Persistence API의 약자입니다. JPA는 Java에서 관계형 데이터베이스를 객체에 맵핑해서 사용할 수 있도록 도와주므로 Java의 객체를 관계형 데이터베이스에 저장하고 관리할 수 있게 됩니다. 즉, 관계형 데이터베이스의 테이블과 Java의 객체를 맵핑시켜 관계형 데이터베이스에 있는 테이블들을 객체로 사용할 수 있게 되고, 이에 따라 관계형 데이터베이스와 Java 간에 있던 패러다임의 불일치를 해결합니다. 한 가지 유의할 점은 JPA는 인터페이스로 이루어져 있기 때문에 구현체가 필요하다는 점입니다.


Hibernate

Hibernate는 JPA의 구현체로 가장 많이 사용되고 있습니다. Hibernate 공식 문서를 보면 ‘객체 관계형 임피던스 불일치’를 해소하기 위한 기술이라고 설명하고 있습니다. 표현이 굉장히 어렵지만 앞서 제가 언급한 패러다임의 불일치와 동일한 의미입니다. 공식 문서의 해당 파트에서 패러다임 불일치로 일어나는 문제에 대해 자세히 서술하고 있는데 한 번쯤 읽어보시면 좋은 내용입니다! 물론 김영한 강사님이 집필하신 JPA 도서를 읽으신 분들이라면 굉장히 익숙한 내용일 것입니다. Hibernate는 JPA의 구현체 중 하나일 뿐이기 때문에 다른 구현체(EclipseLink 등)를 이용하거나 본인이 직접 JPA를 구현할 수도 있습니다! 다만 당연히 Hibernate가 많이 사용되는 이유는 다른 방법보다도 개발 방면에서 좋은 생산성을 제공하기 때문이겠죠?


Spring Data JPA

Spring Data JPA는 JPA를 쉽게 사용할 수 있도록 도와주는 기능을 제공합니다. 저도 그렇지만 대부분 JPA를 사용할 때 EntityManager를 직접 구현하여 사용하지 않고 JpaRepository를 상속받아 사용하셨을 겁니다. 바로 Spring Data JPA 때문에 가능한 일입니다.

JpaRepository를 구현하고 있는 SimpleJpaRepository를 보면 내부에 이미 EntityManager를 의존하고 있어 별도의 구현 없이 EntityManager를 구현한 것처럼 사용할 수 있게 되는 것입니다. 즉, Spring Data JPA란 Spring Framework 환경의 애플리케이션에서 JPA를 조금 더 쉽게 사용할 수 있도록 도와주는 역할을 합니다!


Spring Data JPA을 시작하기를 앞서 알고 있어야 할 JPA, Hibernate, Spring Data JPA에 대해 정리해 보았습니다. 저는 Spring Data JPA를 처음 사용했을 때 마법(?)을 보는 것 같았습니다. 개발자가 작성하지도 않은 쿼리가 만들어진다니 하고요. 하지만 JPA를 공부할수록 단순히 생각하고 사용할 수 있는 기술은 아니라는 생각이 듭니다.


Reference

JPA, Hibernate, 그리고 Spring Data JPA의 차이점
Hibernate Document
Spring Data JPA Document