자바 ORM 표준 JPA 프로그래밍 - (2) JPA 시작

 Date: 2022-02-07

✓︎ 라이브러리와 프로젝트 구조
✓︎ 객체 매핑 시작
✓︎ persistence.xml 설정
✓︎ 애플리케이션 개발

1. 이클립스 설치와 프로젝트 불러오기

『자바 ORM 표준 JPA 프로그래밍』 예제 프로젝트

2. H2 데이터베이스 설치

H2 Database 홈페이지에서 다운로드 H2 설치 참고

3. 라이브러리와 프로젝트 구조

  • JPA 구현체로 하이버네이트를 사용하기 위한 핵심 라이브러리
    • hibernate-core : 하이버네이트 라이브러리
    • hibernate-entitymanager: 하이버네이트가 JPA 구현체로 동작하도록 JPA 표준을 구현한 라이브러리
    • hibernate-jpa-2.1-api : JPA 2.1 표준 API를 모아둔 라이브러리

4. 객체 매핑 시작

@Entity

이 클래스를 테이블과 매핑한다고 JPA에게 알려준다. @Entity가 사용된 클래스를 엔티티 클래스라고 한다.

@Table

엔티티 클래스에 매핑할 테이블 정보를 알려준다. @Table을 생략하면 클래스 이름을 테이블 이름으로 매핑한다. name 속성을 사용하여 원하는 테이블 명을 지정할 수 있다.

@Id

엔티티 클래스의 필드를 테이블의 기본키(Primary Key)에 매핑한다. @Id가 사용된 필드를 식별자 필드라고 한다.

@Column

필드를 컬럼에 매핑한다. name 속성을 사용하여 원하는 컬럼명을 지정할 수 있다.
매핑 어노테이션을 생략하면 필드명을 사용해서 컬럼명으로 매핑한다.

JPA 어노테이션의 패키지는 javax.persistence 이다.

5. persistence.xml 설정

  • JPA는 persistence.xml을 사용해서 필요한 설정 정보를 관리한다. 설정파일이 META-INF/persistence.xml 클래스 패스 경로에 있으면 별도의 설정 없이 JPA가 인식할 수 있다.

  • <persistence-unit name="jpabook">
    JPA 설정은 영속성 유닛이라는 것부터 시작하는데 일반적으로 연결할 데이터베이스당 하나의 영속성 유닛을 등록한다. 영속성 유닛에는 고유한 이름을 부여해야 한다.

  • JPA 표준 속성
    • javax.persistence.jdbc.driver : JDBC 드라이버
    • javax.persistence.jdbc.user : 데이터베이스 접속 아이디
    • javax.persistence.jdbc.passowrd : 데이터베이스 접속 비밀번호
    • javax.persistence.jdbc.url : 데이터베이스 접속 URL
  • 하이버네이트 속성
    • hibernate.dialect : 데이터베이스 방언(Dialect)설정
    • hibernate.show_sql : 하이버네이트가 실행한 SQL을 출력한다.
    • hibernate.formt_sql : 하이버네이트가 실행한 SQL을 출력할 때 보기 쉽게 정렬한다.
    • hibernate.use_sql_comments : 쿼리를 출력할 때 주석도 함께 출력한다.
    • hibernate_id.new_generator_mappings : JPA 표준에 맞춘 새로운 키 생성 전략을 사용한다.
  • JPA 표준 속성은 특정 구현체에 종속되지 않는다. 반면에 하이버네이트 전용 속성은 하이버네이트에서만 사용할 수 있다.

  • SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 방언(Dialect)이라고 한다.

6. 애플리케이션 개발

▪️ 엔티티 매니저 설정

  • 엔티티 매니저 팩토리
    엔티티 매니저 팩토리는 애플리케이션 전체에서 딱 한번만 생성하고 공유해서 사용해야 한다.

  • 엔티티 매니저
    JPA의 기능 대부분은 엔티티 매너저가 제공한다. 엔티티 매니저는 내부에 데이터소스(데이터베이스 커넥션)를 유지하면서 데이터베이스와 통신한다. 엔티티 매니저는 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드 간에 공유하거나 재사용하면 안된다.

▪️ 트랜잭션 관리

  • JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야 한다. 트랜잭션 없이 데이터를 변경하면 예외가 발생한다.

▪️ JPQL

  • JPA는 SQL을 추상화한 JPAL이라는 객체지향 쿼리 언어를 제공한다.
  • JPQL은 엔티티 객체를 대상으로 쿼리한다. 쉽게 이야기해서 클래스와 필드를 대상으로 쿼리한다.
  • JPQL은 데이터베이스 테이블을 전혀 알지 못하고 엔티티 객체를 참조한다.
//목록 조회
TypedQuery<Member> query = em.createQurery("select m from Member m", Member.class);
List<Member> members = query.getResultLiost

Reference

자바 ORM 표준 JPA