자바 ORM 표준 JPA 프로그래밍 2장
02 JPA 시작
객체 매핑 어노테이션
- @Entity
- 해당 클래스를 테이블과 매핑함을 알린다.
- @Entity가 사용된 클래스를 엔티티 클래스라 한다.
- @Table
- 엔티티 클래스에 매핑할 테이블 정보를 알려준다.
- 해당 어노테이션을 생략하면, 클래스 이름을 테이블 이름으로 매핑한다.
- @Id
- 엔티티 클래스의 필드를 테이블의 기본 키에 매핑한다.
- @Id가 사용된 필드를 식별자 필드라 한다.
- @Column
- 필드를 컬럼에 매핑한다.
- 매핑 어노테이션을 생략한 필드는 필드명을 사용해 컬럼명으로 매핑한다.
데이터베이스 방언
방언(Dialect)은 SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능을 말한다.
JPA는 특정 데이터베이스에 종속적이지 않다. 특정 데이터베이스에 의존적인 SQL은 데이터베이스 방언이 처리해준다.
JPA를 사용할 때, 데이터베이스가 변경되어도 애플리케이션 코드를 변경할 필요 없이 데이터베이스 방언만 교체하면 된다.
- H2: org.hibernate.dialect.H2Dialect
- 오라클 10g: org.hibernate.dialect.Oracle10gDialect
- MySQL: org.hibernate.dialect.MySQL5InnoDBDialect
엔티티 매니저 설정
- 엔티티 매니저 팩토리 생성
- persistence.xml의 설정 정보를 사용해 엔티티 매니저 팩토리를 생성한다.
- JPA를 동작시키기 위한 기반 객체를 만들고 JPA 구현체에 따라서 데이터베이스 커넥션 풀도 생성한다.
- 엔티티 매니저 팩토리는 애플리케이션 전체에 한 번만 생성하고 공유해서 사용해야 한다.
-
EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
- 엔티티 매니저 생성
- 엔티티 매니저 팩토리에서 엔티티 매니저를 생성한다.
- JPA의 기능 대부분을 제공한다.
- 엔티티를 데이터베이스에 등록/수정/삭제/조회할 수 있다.
- 내부에 데이터소스(데이터베이스 커넥션)을 유지하면서 데이터베이스와 통신한다.
- 데이터베이스 커넥션과 밀접한 관계가 있으므로 스레드 간에 공유하거나 재사용하면 안 된다.
-
EntityManager em = emf.createEntityManager();
- 종료
- 사용이 끝난 엔티티 매니저는 종료해야한다.
-
em.close();
-
- 애플리케이션을 종료할 때는 엔티티 매니저 팩토리도 종료해야 한다.
-
emf.close();
-
- 사용이 끝난 엔티티 매니저는 종료해야한다.
트랜잭션 관리
JPA를 사용하면 항상 트랜잭션 안에서 데이터를 변경해야 한다.
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); // 트랜잭션 시작
logic(em); // 비즈니스 로직 실행
tx.commit(); // 정상동작 시 트랜잭션 커밋
} catch (Exception e) {
tx.rollback(); // 예외 발생 시 트랜잭션 롤백
}
데이터베이스 등록/수정/삭제/조회
등록
엔티티 매니저의 persist()
메소드에 저장할 엔티티를 넘긴다.
JPA는 엔티티의 매핑 정보(어노테이션)를 분석해 SQL을 만들어 데이터베이스에 전달한다.
Member member = new Member("mindock", 27);
em.persist(member);
수정
em.update() 같은 메소드를 호출하지 않고, 단순히 엔티티 값만 변경한다. JPA는 어떤 엔티티가 변경되었는지 추적하는 기능을 가지고 있어 엔티티 값만 변경하면 UPDATE SQL을 생성해 데이터베이스에 값을 변경한다.
member.setAge(20);
삭제
엔티티 매니저의 remove()
메소드에 삭제하려는 엔티티를 넘겨준다.
JPA는 DELETE SQL을 생성해 실행한다.
em.remove(member);
단건 조회
엔티티 매니저의 find()
메소드에 엔티티 타입과 기본키(@Id)와 매핑한 식별자 값을 넘겨준다.
JPA는 SELECT SQL을 생성해 데이터베이스에 결과를 조회하고, 조회한 결과 값으로 엔티티를 생성해 반환한다.
Member findMember = em.find(Member.class, id);
JPQL(Java Persistence Query Language)
SQL을 추상화한 객체지향 쿼리 언어
- SQL과 문법이 거의 유사하다.
- SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 등을 사용할 수 있다.
- JPQL은 엔티티 객체를 대상으로 쿼리한다. 즉, 클래스와 필드를 대상으로 쿼리한다.
- SQL은 데이터베이스 테이블을 대상으로 쿼리한다.
- 필요한 데이터만 데이터베이스에서 불러오기 위해 검색 조건이 포함된 SQL을 사용해야 할 때 주로 사용한다.
사용방법
- em.createQuery(JPQL, 반환 타입) 메소드 실행해 쿼리 객체 생성
- 쿼리 객체의 getResultList() 메소드를 호출