dev-miri

[JPA] 인터페이스, api, 라이브러리, 프레임워크 개념 정리/hibernate와 jpa 본문

JPA

[JPA] 인터페이스, api, 라이브러리, 프레임워크 개념 정리/hibernate와 jpa

miri-dev 2022. 8. 4. 17:58

간단하게 정리하면, JPA는 인터페이스의 모음이다(=기술명세). 특정 기능을 하는 라이브러리가 아니라, 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의하는 한 방법일 뿐이다. 

hibernate는 JPA의 구현체이다. entityManger와 같은 인터페이스를 직접 구현한 라이브러리이다. JPA와 Hibernate는 마치 자바의 interface와 해당 interface를 구현한 class와 같은 관계이다. 

 

 

1. 인터페이스(interface) 

  • 서로 다른 두 개의 시스템, 장치 사이에서 정보나 신호를 주고 받는 경우의 접점이나 경계면이다.
  • 즉, 사용자가 기계를 쉽게 동작시키는데 도움을 주는 시스템을 의미한다.
  • 소프트웨어 인터페이스 : ABI(Application Binary Interface)와 API(Application Programming Interface)
  • 사용자 인터페이스 : UI(User Interface)가 있다.

 

2. API(Application Programming Interface)

  • 프로그래밍에서, 프로그램을 작성하기 위한 일련의 부(Sub) 프로그램, 프로토콜 등을 정의하여 상호 작용을 하기 위한 인터페이스 사양을 말한다. 
  • 라이브러리와 종종 헷갈리곤 한다. API는 단순히 컴퓨터공학 분야의 추상적인 개념이라면, 라이브러리는 이러한 API를 기반으로 개발자에게 기능을 제공할 수 있도록 실제 구현된 구현체라고 볼 수 있다.
    • API의 핵심은 정의된 프로토콜을 기반으로 상호작용을 할 수 있도록 일종의 약속된 시스템이다. 
    • 라이브러리는 실제 이를 바탕으로 구현된 결과물이다.
    • 대개의 경우, 독립된 응용 프로그램(application) 간의 상호작용은 '이미 구현된 코드'의 재사용이기 때문에 라이브러리는 다시 쓰기 위해 미리 짜놓은 코드 뭉치를 의미하는 것이고, API를 기반으로 구현되었다고 볼 수 있다.
  • 프레임워크는 그것을 기반으로 명확하게 정의된 대량의 라이브러리가 있다는 점에서 API와 비슷하다. 하지만 일반적인 API는 전체 제어 구조를 호출하는 쪽에서 원하는대로 진행할 수 있지만, 프레임워크에서는 그럴 수 없는 경우가 많다.

***API와 라이브러리의 차이는? 구현 로직의 유무!

API : 컴포넌트를 사용하는 규약, 호출을 위한 수단, 구현 로직 없음 / 응용 프로그램에서 사용할 수 있도록 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스이다. 

라이브러리 : 컴포넌트 자체, 구현 로직 존재 / 라이브러리에 접근하기 위한 규칙들을 정의한 것이다. 

비유를 하자면, 라이브러리는 도구 자체이고, API는 "도구 주세요!"라고 요청하는 것이라 볼 수 있다. 

 

3. 라이브러리

  • 소프트웨어 개발 시 사용되는 프로그램의 구성요소로, 공통으로 사용될 수 있는 특정한 기능들을 모듈화한 것이다. 대상 환경(플랫폼)에서 바로 실행될 수 있는 형태로 제공된다.
  • 실제 실행되어 수행하는 단편화된 프로그램이라는 점이 API와 다르다. 
    • 프로그래밍 언어에서 라이브러리를 사용할 수 있도록 소스코드 수준에서 인터페이스를 노출시킨 것이 바로 API이다. 
    • 따라서 라이브러리는 동작하는 완전한 프로그램이 아닌, 특정한 부분 기능만을 수행하도록 제작된, 컴파일 되어 기계어의 형태로 존재하는 프로그램이다. 
    • 이 자체로는 사용자가 직접 일반적인 조작으로 실행할 수 없으며, 해당 라이브러리의 기능을 직접 호출하는 프로그램을 실행하거나, 사용자가 해당 라이브러리의 기능을 실행하는 API를 사용하는 프로그램을 직접 개발하면 실행할 수 있다. 

4. 프레임워크

  • 어떠한 목적을 달성하기 위해 복잡하게 얽혀있는 문제를 해결하기 위한 구조며, 소프트웨어 개발에 있어 하나의 뼈대 역할을 한다..
  • 라이브러리와 프레임워크를 헷갈리는 경우도 있는데, 보통 프레임워크라고 하면 여러 기능을 가진 클래스와 라이브러리가 '특정 결과물을 구현하고자' 합쳐진 형태라고 볼 수 있다. 즉 라이브러리보다 상위의 그룹이며, 대부분의 프레임워크들은 다양한 기능들을 지원하기 위해 많은 라이브러리들을 가지고 있다. 
  • 메소드 및 클래스화, 즉 모듈화를 하는 이유 중 하나가 재사용성인데, 프레임워크는 이 재사용성을 큰 그룹 단위로 묶어주었다고 보면 된다. 재사용 가능한 수많은 클래스들과 라이브러리들을 융합한 채로 처음부터 제공해 주기 때문에, 여러 개의 표준을 만들지 않아도 돼서 개발자의 피곤함을 덜어준다.
  • 예시) Spring(Java의 웹 프레임워크), Apache 시리즈, JWT, Django(Python의 웹 프레임워크)

 

 

 

헷갈리는 개념을 정리하였으므로, 이제 JPA, Hibernate, 그리고 Spring Data JPA의 차이점에 대해 알아보자. 

JPA는 기술 명세이다 - JPA는 인터페이스이다.

JPA는 Java Persistence API의 약자로, 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다. 여기서 중요하게 여겨야 할 부분은, JPA는 인터페이스라는 점이다. JPA는 특정 기능을 하는 라이브러리가 아니다. 마치 일반적인 백엔드 API가 클라이언트가 어떻게 서버를 사용해야 하는지를 정의한 것처럼, JPA 역시 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의하는 한 방법일 뿐이다.

 

JPA는 단순히 명세이기 때문에 구현이 없다. JPA를 정의한 javax.persistence 패키지의 대부분은 interface, enum, Exception, 그리고 각종 Annotation으로 이루어져 있다.

예를 들어, JPA의 핵심이 되는 EntityManager는 아래와 같이 javax.persistence.EntityManager 라는 파일에 interface로 정의되어 있다. 

 

Hibernate는 JPA의 구현체이다 - Hibernate는 라이브러리이다. 

hibernate는 JPA라는 명세의 구현체이다. 즉 위에서 언급한 javax.persistence.EntityManager와 같은 인터페이스를 직접 구현한 라이브러리이다. JPA와 Hibernate는 마치 자바의 interface와 해당 interface를 구현한 class와 같은 관계이다.

Spring Data JPA는 JPA를 쓰기 편하게 만들어놓은 모듈이다. 

Spring data JPA의 핵심은 repository이다.

Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로, 개발자가 JPA를 더 쉽고 편하게 사용할 수 있도록 도와준다.

이는 JPA를 한 단계 추상화시킨 Repository라는 인터페이스를 제공함으로써 이루어진다. 

Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해준다.

 

Spring Data JPA가 JPA를 추상화했다는 말은, Spring Data JPA의 Repository의 구현에서 JPA를 사용하고 있다는 것이다.

Repository 인터페이스의 기본 구현체인 simpleJpaRepository의 코드를 보면 아래와 같이 내부적으로 EntityManager을 사용하고 있는 것을 볼 수 있다. 

 

위 사진은 JPA, Hibernate, Spring Data JPA의 전반적인 개념을 그림으로 표현한 것이다. 

 

출처 : https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/

 

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

개요 Spring 프레임워크는 어플리케이션을 개발할 때 필요한 수많은 강력하고 편리한 기능을 제공해준다. 하지만 많은 기술이 존재하는 만큼 Spring 프레임워크를 처음 사용하는 사람이 Spring 프레

suhwan.dev

 

Comments