Hayden's Archive
[JPA] 자바 ORM 표준 JPA 프로그래밍 2장 본문
- JPA 구현체로 하이버네이트를 사용하기 위한 핵심 라이브러리
- hibernate-core : 하이버네이트 라이브러리
- hibernate-jpa-2.1-api : JPA 2.1 표준 API를 모아둔 라이브러리
- hibernate-entitymanager : 하이버네이트가 JPA 구현체로 동작하도록 JPA 표준을 구현한 라이브러리
- hibernate-core와 hibernate-jpa-2.1-api를 함께 내려받음
- 매핑 어노테이션
어노테이션 | 설명 |
@Entity | 이 클래스를 테이블과 매핑한다고 JPA에 알려줌 @Entity가 사용된 클래스=엔티티 클래스 |
@Table | 엔티티 클래스에 매핑할 테이블 정보를 알려줌 |
@Id | 필드를 Primary Key에 매핑 @Id가 사용된 필드=식별자 필드 |
@Column | 필드를 컬럼에 매핑함 |
매핑 정보가 없는 필드 | 매핑 어노테이션을 생략하면 필드명을 사용해서 컬럼명으로 매핑 |
- JPA를 실행하기 위한 기본 설정 파일 : persistence.xml
- 스프링에서의 사용
- 참고 : https://www.inflearn.com/questions/273750
- 스프링 부트가 내부에서 JPA를 만들 때 persistence.xml 없이도 동작하도록 구현되어 있음
- 스프링 부트를 사용한다면 persistence.xml이 없어도 됨. 스프링과 JPA를 함께 사용한다면, application.yml을 사용
- JPA 설정은 영속성 유닛(persistence-unit)부터 시작. 일반적으로 연결할 데이터베이스당 하나의 영속성 유닛 등록
- JPA 표준 속성 (특정 구현체에 종속되지 않음)
- javax.persistence.jdbc.driver : JDBC 드라이버
- javax.persistence.jdbc.user : 데이터베이스 접속 아이디
- javax.persistence.jdbc.password : 데이터베이스 접속 비밀번호
- javax.persistence.jdbc.url : 데이터베이스 접속 URL
- 하이버네이트 속성
- hibernate.dialect : 데이터베이스 방언 설정
- hibernate.show_sql : 하이버네이트가 실행한 SQL 출력
- hibernate.format_sql : 하이버네이트가 실행한 SQL을 보기 좋게 정렬
- hibernate.use_sql_comments : 쿼리를 출력할 때 주석도 함께 출력
- hibernate.id.new_generator_mappings : JPA 표준에 맞춘 새로운 키 생성 전략 사용
- 스프링에서의 사용
- 방언(dialect) : SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능
- 대부분의 JPA 구현체들은 다양한 데이터베이스 방언 클래스를 제공
- 개발자는 JPA가 제공하는 표준 문법에 맞추어 JPA를 사용하면 되고, 특정 데이터베이스에 의존적인 SQL은 데이터베이스 방언이 알아서 처리해줌
- 데이터베이스가 변경되면 데이터베이스 방언만 교체하면 됨
- 하이버네이트에서 제공하는 대표적인 데이터베이스 방언
- H2 : org.hibernate.dialect.H2Dialect
- 오라클 10g : org.hibernate.dialect.Oracle10gDialect
- MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
- 애플리케이션 개발
- 엔티티 매니저 설정
- Persistence 클래스가 persistence.xml 설정 정보를 읽어서 EntityManagerFactory 클래스 생성
- JPA를 동작시키기 위한 기반 객체
- JPA 구현체에 따라서는 데이터베이스 커넥션 풀도 생성
- 생성 비용이 아주 크므로 애플리케이션 전체에서 딱 한 번만 생성하고 애플리케이션 전체에서 공유
- 여러 스레드가 동시에 접근해도 안전함
- EntityManagerFactory 클래스에서 EntityManager 생성
- JPA의 기능 대부분을 EntityManager가 제공 (엔티티를 데이터베이스에 등록/수정/삭제/조회)
- 내부에 데이터소스(데이터베이스 커넥션)을 유지하면서 데이터베이스와 통신
- 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드 간에 공유하거나 재사용 금지
- 여러 스레드가 동시에 접근하면 동시성 문제 발생
- 종료
- EntityManager의 사용이 끝나면 EntityManager 종료
- 애플리케이션을 종료할 때 EntityManagerFactory도 종료
- Persistence 클래스가 persistence.xml 설정 정보를 읽어서 EntityManagerFactory 클래스 생성
- 트랜잭션 관리
- JPA 사용시 항상 트랜잭션 안에서 데이터 변경
- EntityManager로부터 EntityTransaction을 받아옴
- 트랜잭션 API를 사용해서 start() → 정상 동작하면 commit(), 예외 발생시 rollback()
- 비즈니스 로직
- EntityManager가 등록, 수정, 삭제, 조회 작업
- 등록 : persist()
- 수정 : update() 메서드 없음. setAge(20)처럼 엔티티 값만 변경하면 됨
- 삭제 : remove()
- 조회 : find() - 엔티티 타입과 기본키로 조회
- EntityManager가 등록, 수정, 삭제, 조회 작업
- 엔티티 매니저 설정
- JPQL (Java Persistence Query Language)
- JPA는 엔티티 객체를 중심으로 개발하므로 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색해야 함
- 모든 데이터를 애플리케이션으로 불러와서 엔티티 객체로 변경한 다음 검색하는 것은 불가능
- JPQL = 객체지향 쿼리 언어
- SQL과 사용 방법 거의 유사.
- JPQL : 엔티티 객체를 대상으로 쿼리
- SQL : 데이터베이스 테이블을 대상으로 쿼리
- JPA는 엔티티 객체를 중심으로 개발하므로 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색해야 함