Spring Data JPA #1 JPA 소개

2021. 10. 1. 13:44JAVA/Spring

본 글은 스타트 스프링 부트 도서의 내용을 복습하기 위해 작성된 글입니다.

1. JPA란 무엇인가?

JPA는 'Java Persistence API'의 약자로, Java 관련 기술 스펙의 하나입니다. Java를 이용해서 데이터를 관리(유지)하는 기법을 하나의 스펙으로 정리한 표준입니다.

 

JPA를 이해하기 위해서는 먼저 ORM(Object Relational Mapping)에 대한 것을 알아야 합니다. ORM은 객체지향에서 말하는 객체와 데이터베이스에서 말하는 개체(Entity)가 상당히 유사하다는 입장에서 시작합니다. 에를 들어, 회원 정보를 생각해보면 다음과 같습니다.

위의 그림을 보면 객체지향에서 클래스로 설계하는 모습과 데이터베이스의 테이블 구조가 거의 유사한 것을 볼 수 있습니다. 이러한 유사한 점들이 ORM에서는 '데이터베이스와 객체지향을 한번에 처리할 수 있지 않을까'라는 생각으로 시작하게 됩니다.

 

ORM은 특정한 언어에 종속적인 개념이 아닙니다. 즉, 다른 언어에서도 ORM 관련 프레임워크들이 많이 존재하듯이 ORM 자체는 객체지향과 관계형 데이터베이스를 매핑시킨다는 추상화된 개념입니다.

 

JPA는 ORM의 개념을 Java 언어에서 구현하기 위한 스펙입니다. ORM이 일종의 비전(vision)에 불과했다면, JPA는 Java에서 이를 구현하기 위한 상세화한 통과 기준이라고 볼 수 있습니다.

 

JPA를 좀더 쉽게 설명하자면 기존의 JDBC 등을 이용해서 직접 구현했던 데이터베이스 관련 작업을 대신 처리해주는 추상화된 계층의 구현 스펙이라고 할 수 있습니다.

 

JPA를 이용하면 데이터베이스에 대한 처리를 JPA 게층에서 처리하기 때문에 좀 더 추상화된 형태의 코드를 제작하는 것만으로 개발이 가능합니다.

 

JPA 그 자체로는 스펙에 불과하기 때문에 이를 실제로 구현한 제품이나 프레임워크들이 존재가 필수적입니다. 예를 들어 Servlet이라는 기술 스펙을 Tomcat에서 구현한 것처럼, JPA를 구현한 구현체 중에서 스프링 부트 프로젝트에서는 Hibernate라는 것을 이용하게 됩니다. Hibernate 외에도 여러 제품이 존재하는데 이들의 관계를 그림으로 표현하면 아래와 같습니다.

 

2. JPA의 장점

데이터베이스 관련 코드에 대해 유연함을 얻을 수 있습니다.

데이터베이스 변경은 기존의 소스 코드에 치명적인 영향을 미칩니다. 데이터베이스가 변경되면 이를 사용하는 SQL이 변경되고, DAO나 서비스, 화면까지 영향을 미치게 됩니다. 반면에 JPA를 이용하면 테이블 생성 등과 같은 작업부터 변경되는 DB 설계와 JAVA 설계를 한번에 처리할 수 있어서 익숙해진다면 빠른 생산성을 얻을 수 있습니다.

 

데이터베이스와 독립적 관계입니다.

JPA는 특정 벤더(회사)의 데이터베이스에 종속적이지 않기 때문에 개발자들은 데이터베이스 제품이 변경되거나 버전이 변경되는 것과 같은 골치 아픈 일에서 자유로워질 수 있습니다. 물론 각 데이터베이스 제품에 따라 지원하는 기능에 차이가 있긴 하지만, 설계 당시에 이러한 점을 고려해서 설계할 수 있는 방법을 지원합니다.

3. JPA의 단점

학습 곡선(learning curve)이 큽니다.

기존의 데이터베이스 위주 학습에 비해서 새롭게 배워야 하는 기능들이 많습니다. 따라서, 새로운 개념과 기술을 익히는 학습 곡선이 크기 때문에 선뜻 쉽게 적용하기가 어렵습니다.

 

근본적인 객체지향 설계 사상이 반영되어야 합니다.

JPA는 '어떻게 적합한 객체들의 관계를 작성할 것인가?'가 프로젝트의 성패를 좌우합니다. 이 과정에서는 충분한 설계와 검토 과정을 거쳐야 하는데 현실적으로 바쁜 일정이나 개발의 숙련도 등의 다양한 문제들을 극복해야만 합니다.

 

특정 데이터베이스의 강력함을 활용할 수 없다는 문제가 있습니다.

JPA를 이용하면 SQL 튜닝 등의 제약이 생길 수도 있습니다. JPA에는 native SQL이라는 기능을 지원해서 기존의 SQL을 재사용할 수 있는 방법도 있지만, 이 경우 데이터베이스에 독립적인 개발이 불가능하기 때문에 JPA의 장점을 잃는 한계를 가지게 됩니다.

 

4. JPA를 이용하는 개발의 구조

JPA를 이용하면 Java로 작성된 클래스, 객체들과 데이터베이스상에 테이블, 레코드들을 자동으로 관리하게 됩니다. 개발자는 별도의 SQL을 작성할 필요 없이, 원하는 객체지향의 구조를 설게하는 것만으로 모든 개발을 끝낼 수도 있습니다.

물론 이렇게 되기 위해서는 중간에 놓여있는 JPA의 역할이 중요합니다. Java 쪽의 메모리 상태와 데이터베이스의 상태를 관리해야 하기 때문에 이에 대한 상태 등에 대해서 별도의 용어들을 이용해서 표현합니다.

 

References

스타트 스프링 부트, 구멍가게 코딩단 저