자바 ORM 표준 JPA 프로그래밍 - (2) JPA 시작
✓︎ 라이브러리와 프로젝트 구조
✓︎ 객체 매핑 시작
✓︎ 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