1.1 클래스를 테이블에 매핑하기

JDBC를 배운 후에도 Java 애플리케이션에서 데이터베이스로 작업하는 것이 여전히 즐겁다는 인상을 받았을 것입니다. 이 모든 작업을 10배 더 쉽게 수행할 수 있다고 말하면 어떻게 됩니까?

SQL 언어의 주요 이점은 무엇입니까? 이것은 선언적 언어입니다. 우리가 얻고자 하는 것을 설명하고 그것을 수행하는 방법에 대해서는 전혀 언급하지 않습니다. 방법 - 이것은 SQL 서버의 관심사입니다.

데이터베이스로 작업할 때도 동일한 접근 방식을 사용할 수 있습니다.

이상적인 세상에서는 단순히 데이터베이스에 SQL 쿼리를 작성하고 이에 대한 응답으로 여러 조각을 요청하는 경우 기성품 Java 개체 또는 Java 개체 모음을 받을 수 있습니다.

내가 말할 수 있는 것은 이것이 2000년에 몇몇 사람들이 생각하고 그들 자신의 ORM 프레임워크를 작성하기로 결정한 것입니다.

ORM은 Object-Relational Mapping 의 약자 이며 기본적으로 Java 개체를 SQL 쿼리에 매핑하는 것입니다.

그들은 매우 간단한 것을 생각해 냈습니다. 데이터베이스의 각 테이블은 Java 애플리케이션의 일부 클래스와 일치해야 합니다 . Java 응용 프로그램에서 우리는 객체로 작업하며 이러한 객체는 이미 자신을 데이터베이스에 저장하는 방법을 알고 있습니다.

이 문제를 해결하는 데는 세 가지 접근 방식이 있으며 다음과 같습니다.

  1. 개체는 데이터베이스에 자신을 저장하고 데이터베이스의 정보를 기반으로 해당 필드를 업데이트합니다.
  2. 객체는 자신을 데이터베이스에 저장할 수 있지만 이 경우를 시작하지는 않습니다.
  3. 개체에는 데이터만 포함되어 있으며 누군가 데이터베이스에 저장하고 데이터베이스에서 로드합니다.

처음에는 첫 번째 접근 방식이 우세했고 그 다음에는 애플리케이션 서버와 Enterprise Java Beans가 인기를 끌었습니다. 데이터베이스 자체에 저장할 수 있는 Persistence EJB라고 하는 전체 빈 클래스도 있었습니다.

그러나 어느 날 모든 것이 바뀌었다...

1.2 하이버네이트의 등장

2001년에 Hibernate 프레임워크의 첫 번째 버전이 출시되었습니다. 매우 간단한 프레임워크였지만 데이터베이스에 저장하거나 로드하는 방법에 대해 전혀 알지 못하는 일반적인 "멍청한 개체"를 사용할 수 있었습니다.

데이터베이스의 테이블에 있는 Java 클래스 및 열의 필드 매핑은 XML 파일을 사용하여 설정되었습니다. 그리고 때때로 그들은 꽤 부피가 컸습니다. 좋아, 농담이야. 그것들은 XML 코드의 방대한 캔버스였습니다. 그리고 20년 전에는 지금과 같은 거대한 데이터베이스가 없었다는 사실만으로도 상황은 구해졌습니다.

그러나 사실 가장 유력한 결정은 데이터베이스에 저장해야 하는 개체를 데이터베이스에 저장한 코드에서 최종적으로 분리하는 것이었습니다 . 이 솔루션은 실제로 명확하지 않습니다. 캡슐화 원칙에 따르면 개체는 저장 및 로드 방법에 대해 가장 잘 알고 있습니다.

그리고 ORM 접근 방식은 그 개념을 깨뜨립니다. 데이터 클래스는 내부 구조를 노출하지만 다른 유형의 개체 그룹으로 작업하기가 훨씬 쉬워졌습니다.

Java 5가 출시된 후 JDK에 두 가지 기능이 등장하면서 큰 발전이 이루어졌습니다 .

  • 주석
  • 대리

주석XML은 빠르게 대체되었으며 이제 Java 클래스에서 바로 데이터베이스의 테이블에 Java 클래스를 매핑하는 데 필요한 모든 설정을 쉽게 지정할 수 있습니다.

대리Hibernate 사용자에게는 그다지 눈에 띄지 않지만 그들의 기여는 훨씬 더 심각했습니다. Hibernate에서 특정 개체를 요청하면 Hibernate는 단순히 스텁(프록시)을 반환하고 메서드에 대한 모든 호출을 가로챕니다.

이를 통해 다양한 Lazy Loading 메커니즘을 구현할 수 있었고 Hibernate의 속도와 효율성을 당시로서는 완전히 높은 수준으로 끌어올렸습니다. Hibernate는 사실상 산업 표준이 되었을 뿐만 아니라 다른 언어로 번역되기 시작했습니다. 예를 들어 Framework NHibernate는 C#용으로 등장했습니다.

1.3 JPA의 등장

De facto에 이어 de jure 인정. JDK 개발자는 개체를 데이터베이스의 테이블에 적절하게 매핑하는 방법에 대한 사양을 만들기로 결정했습니다. 이 사양은JPA- 자바 퍼시스턴스 API.

이것이 바로 사양입니다. 그것은 모든 것이 어떻게 작동해야 하는지와 객체를 데이터베이스에 저장하려는 경우 클래스의 다른 부분을 표시하는 데 필요한 주석을 설명합니다.

사람들은 Hibernate를 기본으로 삼고 패키지 이름을 변경한 것 같습니다. Hibernate에 있던 모든 주석이 거의 하나씩 JPA로 이동했기 때문입니다.

오늘날 Hibernate는 JPA 사양 전체를 완벽하게 구현하고 있으며 작업을 더욱 편안하게 해주는 몇 가지 추가 기능도 제공합니다. 따라서 표준화 측면에서 Hibernate에는 두 가지 기능 집합이 있다고 말할 수 있습니다.

  • JPA 규격
  • Hibernate Native API (추가 기능)

공식 Hibernate 문서는 다음과 같이 설명합니다.

그러나 내 경험과 Hibernate 문서를 다시 읽은 후 둘 다 JPA와 Hibernate API가 95% 동일하다고 말할 수 있습니다. 그것들은 단지 동일한 개념입니다.

1.4 하이버네이트를 위한 메이븐

그동안 Hibernate를 너무 칭찬해왔으니 이제 조금 더 열심히 작업을 진행해야 할 때인 것 같습니다.

첫째, 많은 영어 문서가 있는 공식 사이트가 있습니다. 물론 그녀는 훈련이 아닌 참조 정보에 편견이 있습니다. 그래도 소스를 디버깅하는 것보다는 낫겠죠? :)

지침:

  1. 당신은 링크를 엽니다 .
  2. 당신은 그녀를 오랫동안 봅니다.
  3. CodeGym로 돌아갑니다.
  4. 당신은 내 추가 강의를 읽었습니다.

내 일은 복잡한 것을 단순화하고 간단한 용어로 설명하는 것입니다. 그리고 당신이 이 수준에 도달했다면, 나는 그것을 할 수 있습니다.

Hibernate를 시작하려면 pom.xml에 Hibernate를 추가해야 합니다. 현재까지 Hibernate의 6번째 버전, 또는 6.1.1이 이미 사용 가능하므로 최신 버전으로 작업하는 방법을 알아봅니다.

pom.xml에 다음 줄을 추가하기만 하면 됩니다.


<dependency>
	<groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
	<version>6.1.1.Final</version>
</dependency>

2023년 이후에 이 강의를 읽는다면 여기에서 새 버전을 다운로드 할 수 있습니다 .

중요한! Hibernate가 사용하는 일부 라이브러리는 JDK 11 및 JDK 17에서 더 이상 사용되지 않으므로 프로젝트를 시작하고 실행하는 데 문제가 있는 경우 다음 종속성을 추가하십시오.


  	<dependency>
        <groupId>jakarta.xml.bind</groupId>
        <artifactId>jakarta.xml.bind-api</artifactId>
      	<version>4.0.0</version>
  	</dependency>
 
  	<dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
      	<version>4.0.0</version>
  	</dependency>
 
  	<dependency>
        <groupId>org.javassist</groupId>
        <artifactId>javassist</artifactId>
        <version>3.29.0-GA</version>
  	</dependency>