JPA 또는 JDBC는 어떻게 다릅니 까?


119

저는 Java EE를 배우고 있으며 같은 경우 glassfish와 함께 이클립스를 다운로드했습니다. Java EE 5에 대한 모든 것을 알기 위해 몇 가지 예제를보고 Oracle 문서를 읽었습니다. 데이터베이스에 연결하는 것은 매우 간단했습니다. 동적 웹 프로젝트를 열고 EJB 세션을 만들고 EntityManager를 사용했으며 get 메서드를 사용하여 저장된 데이터 테이블에 액세스 할 수있었습니다.

다음 프로젝트에서는 간단한 클래스를 만든 다음 일부 DB 테이블에 액세스했습니다. 내가 만난 첫 번째 문제는 PersistenceUnit 속성이 단순한 Java 클래스가 아닌 EJB, Servlet 등에서 만 인식된다는 것입니다. 그래서 나는 EntityManager 방식을 사용할 수 없었습니다 (또는 할 수 있습니까?)

나는 "JDBC"방식으로 가도록 요청 받았다. 내가 만난 첫 번째 문제는 DB에 연결하는 것이 었습니다. 이 모든 것이 하드 코딩 된 것 같습니다. 데이터베이스 연결을 쉽게 구성 할 수있는 persistence.xml이 있습니다. DB 용 드라이버 설정도 쉬웠습니다. 또한 JDBC에는 테이블 엔티티에 액세스하기위한 get / set 메소드가 없습니다.

JDBC와 관련된 JPA 및 지속성을 어떻게 이해합니까? JPA는 무엇을 생각 했습니까? set / get 메소드가있는 이유는 무엇입니까? 누군가가이 두 가지의 본질에 약간의 빛을 던질 수 있으며 "용어"가없는 장단점은 무엇입니까 ?? 또한 몇 가지 링크를 제안하십시오. JPA와 JDBC의 차이점에 대한 간단한 Google 검색을 통해 "용어"로 가득 찬 사이트를 찾을 수 없었습니다.


2
JDBC 자습서로 시작하지 않는 이유 : docs.oracle.com/javase/tutorial/jdbc/index.html
a_horse_with_no_name

2
JPA는 EJB 또는 Java EE없이 사용할 수 있으며 Persistence에서 직접 EntityManagerFactory를 만들 수 있습니다.
James

답변:


237

평신도의 용어로 :

  • JDBC는 데이터베이스 액세스의 표준입니다.
  • JPA는 ORM의 표준입니다.

예를 들면 - JDBC 직접 DB에 연결하고 이에 대해 SQL을 실행하기위한 표준 SELECT * FROM USERS, 데이터 세트를 앱에서 처리 할 수있는, 당신은 모든 일반적인 일을 할 수있는 반환 할 수 있습니다 등과 같은 INSERT, DELETE실행 저장 프로 시저 등 대부분의 Java 데이터베이스 액세스 (JPA 공급자 포함)의 기본 기술 중 하나입니다.

기존 JDBC 앱의 문제 중 하나는 데이터 세트와 객체간에 많은 매핑이 발생하고 논리가 SQL과 혼합되는 등의 엉뚱한 코드가있을 수 있다는 것입니다.

JPA는 객체 관계형 매핑의 표준입니다. 이것은 코드의 개체와 데이터베이스 테이블 사이를 매핑 할 수있는 기술입니다. 이것은 개발자로부터 SQL을 "숨길"수 있으므로 그들이 처리하는 것은 모두 Java 클래스이며 공급자는이를 저장하고 마술처럼로드 할 수 있습니다. 대부분의 XML 매핑 파일 또는 getter 및 setter의 주석을 사용하여 객체의 어떤 필드가 DB의 어떤 필드에 매핑되는지 JPA 공급자에게 알릴 수 있습니다. 가장 유명한 JPA 공급자는 Hibernate 이므로 구체적인 예제를 시작하기에 좋은 곳입니다.

다른 예로는 OpenJPA, toplink 등이 있습니다.

내부적으로 Hibernate와 JPA를위한 대부분의 다른 공급자는 SQL을 작성하고 JDBC를 사용하여 DB에서 읽고 쓰기를합니다.


3
iBatis (현재 MyBatis)는 JPA 구현이 아닙니다. 살펴보면 개념이 매우 다르다는 것을 알 수 있습니다.
Mikko Maunu 2012 년

감사! 내 실수, 나는 그것이 JPA를 구현했다고 생각했고, 지금 수정되었습니다!
Mark D

3
모든 JPA 공급자가 SQL을 작성하고 JDBC를 사용하는 것은 아닙니다. "다른 유형의 데이터 저장소"(MongoDB, Neo4j 등)에 지속될 수 있기 때문입니다. DataNucleus JPA는 하나의 예이다
DataNucleus

진정한 DataNucleus .. 엑셀 등에 대한 질문도 있습니다. 원래 질문은 JDBC / JPA 였기 때문에 그가 관계형 저장소에 관심이 있다고 옳거나 그르다 고 생각했습니다.
Mark D

52

JPA와 JDBC의 주요 차이점은 추상화 수준입니다.

JDBC는 데이터베이스와의 상호 작용을위한 저수준 표준입니다. JPA는 동일한 목적을위한 더 높은 수준의 표준입니다. JPA를 사용하면 응용 프로그램에서 객체 모델을 사용하여 삶을 훨씬 쉽게 만들 수 있습니다. JDBC를 사용하면 데이터베이스로 더 많은 작업을 직접 수행 할 수 있지만 더 많은주의가 필요합니다. 일부 작업은 JPA를 사용하여 효율적으로 해결할 수 없지만 JDBC로보다 효율적으로 해결할 수 있습니다.


20

JDBC는 JPA보다 훨씬 낮은 수준 (및 이전) 사양입니다. 기본적으로 JDBC는 쿼리를 보내고 결과를 검색하는 순수한 SQL을 사용하여 데이터베이스와 상호 작용하기위한 API입니다. 객체 나 계층에 대한 개념이 없습니다. JDBC를 사용할 때 결과 집합 (본질적으로 SQL 쿼리에서 반환 된 하나 이상의 데이터베이스 테이블 값의 행 / 열 행렬)을 Java 개체로 변환하는 것은 사용자에게 달려 있습니다.

이제 JDBC를 이해하고 사용하려면 SQL에 대한 이해와 실무 지식이 있어야합니다. 이를 통해 관계형 데이터베이스가 무엇인지, 어떻게 작업하는지, 테이블, 열, 키 및 관계와 같은 개념에 대한 필수 통찰력이 제공됩니다. 최소한 데이터베이스, SQL 및 데이터 모델링에 대한 기본적인 이해가 없다면 JDBC를 많이 사용할 수 없을 것입니다. JDBC는 실제로 이러한 것들 위에 얇은 추상화에 불과하기 때문입니다.


10

JDBC는 JPA의 전신입니다.

JDBC는 Java 세계와 데이터베이스 세계를 연결하는 다리입니다. JDBC에서는 테이블 이름, 열 이름과 같은 CRUD 작업에 필요한 모든 더티 세부 정보를 노출해야하는 반면 JPA (아래에서 JDBC 사용)에서는 데이터베이스 메타 데이터의 세부 정보도 지정하지만 Java 주석을 사용합니다.

따라서 JPA는 사용자를 위해 업데이트 쿼리를 생성하고 조회하거나 생성 / 업데이트 한 엔티티를 관리합니다 (더 많은 작업도 수행).

Java EE 컨테이너없이 JPA를 수행하려면 Spring과 해당 라이브러리를 동일한 Java 주석과 함께 사용할 수 있습니다.


"Java EE 컨테이너없이 ??" Spring과 그 라이브러리가 웹 컨테이너와 독립적임을 의미합니까?
Bruce Zu

@BruceZu 물론 그렇습니다. 웹 컨테이너 없이도 많은 Spring 프레임 워크 구성 요소를 사용할 수 있습니다. 예를 들어 종속성 주입은 웹 컨텍스트에서만 필요한 것이 아닙니다.
Dolfiz

1
@Dolfiz는 스프링 웹 라이브러리가 Java 웹 및 Java EE 라이브러리에 대한 래퍼가 아닙니까?
raikumardipak
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.