김영한님의 '자바 ORM 표준 JPA 프로그래밍'을 읽고 정리한 글입니다.
2.1 이클립스 설치와 프로젝트 불러오기
인텔리제이에 불러오기로 대체
참고 블로그
2.2 H2 데이터베이스 설치
최신 버전은 오류발생 꼭 1.4.200버전으로 설치해야한다.
CREATE TABLE MEMBER(
ID VARCHAR(255) NOT NULL,
NAME VARCHAR(255),
AGE INTEGER NOT NULL,
PRIMARY KEY(ID)
);
2.3 라이브러리와 프로젝트 구조
Maven과 Gradle?
-> 스크립트 길이, 가독성, 속도 gradle이 우세!
2.4 객체 매핑 시작
package jpabook.start
public class Member {
private String id; //아이디
private String username; //이름
private Integer age; //나이
//Getter, Setter
public String getId() {return id;}
public void setId(String id) {this.id =id;}
public String getUsername() {return username;}
public void setUsername(String username){this.username = username;}
public Integer getAge() {return age;}
public void setAge(Integer age) {this.age = age;}
}
매핑정보 | 회원 객체 | 회원 테이블 |
---|---|---|
클래스와 테이블 | Member | MEMBER |
기본 키 | id | ID |
필드와 컬럼 | username | NAME |
필드와 컬럼 | age | AGE |
package jpabook.start
import javax.persistence.*;
@Entity
@Table(name="MEMBER")
public class Member {
@Id
@Column(name ="ID")
private String id;
@Column(name = "NAME")
private String username;
//매핑정보가 없는 필드
private Integer age;
...
}
Member클래스를 테이블과 매핑한다고 JPA에게 알려주는 것 Member클래스는 엔티티 클래스가 된다.
엔티티 클래스에 매핑할 테이블 정보를 알려준다. name 속성을 생략하면 클래스 이름을 테이블 이름으로 매핑한다.
엔티티 클래스의 필드를 테이블 기본키에 매핑한다. id필드를 식별자 필드라 한다.
필드를 컬럼에 매핑한다.
어노테이션을 생략하면 필드명을 사용해서 컬럼명으로 미팽한다. 데이터베이스가 보통 대소문자를 구분하지 않기 때문에 AGE와 매핑이 된다.
2.5 persistence.xml 설정
JPA는 특정 데이터베이스에 종속적이지 않다!
2.6 애플리케이션 개발
package jpabook.start;
import javax.persistence.*;
import java.util.List;
public class JpaMain {
public static void main(String[] agrs) {
//[엔티티 매니저 팩토리] - 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
//[엔티티 매니저] - 생성
EntityManger em = emf.createEntityManager();
//[트랜잭션] - 획득
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); //[트랜잭션] - 시작
logic(em); //비즈니스 로직 실행
tx.commit(); //[트랜잭션] - 커밋
} catch (Exception e) {
tx.rollback(); //[트랜잭션] - 롤백
} finally {
em.close(); //[엔티티 매니저]
}
emf.close();
}
코드는 크게 3부분으로 구성
JPA 시작위해서는 persistence.xml 설정 정보로 '엔티티 매니저 팩토리'를 생성해야한다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
META-INF/persistence.xml에서 이름이 jpabook인 영속성 유닛(persistence-unit)을 찾아 엔티티 매너지 팩토리를 생성
엔티티 매니저 팩토리는 생성 비용이 커 딱 한번만 생성, 공유해서 사용해야 한다.
(JPA동작 위한 기반객체생성, 커넥션 풀도 생성할 수 있음)
EntityManager em = emf.createentityManager();
팩토리에서 엔티티 매니저를 생성한다. JPA기능 대부분은 이 매니저가 제공한다.
em.close(); //매니저 종료
애플리케이션을 종료시 매니저 팩토리도 종료해야한다.emf.close(); //매니저 팩토리 종료
JPA는 트랜잭션 안에서 데이터를 변경해야 한다. 트랜잭션 없이 데이터를 변경하면 예외가 발생
엔티티 매니저 em에서 트랜잭션 API를 받아와야 한다.
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
logic(em);
tx.commit();
} catch (Exception e) {
tx.rollback();
}
트랜잭션 API를 사용해서 비즈니스 로직이 정상 동작하면 트랜잭션을 커밋하고 예외발생시 rollback한다.
public static void logic(EntityManager em) {
String id = "id1";
Member member = new Member();
member.setId(id);
member.setUsername("준석이");
member.setAge(1);
//등록
em.persist(member);
//수정
member.setAge(24);
//한 건 조회
Member findMember = em.find(Member.class, id);
System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());
//목록 조회
List<Member> members = em.createQuery("select m from Member m", Member.class)
.getResultList();
System.out.println("members.size=" + members.size());
//삭제
em.remove(member);
}
출력결과 : findMember=준석, age=24
member.size=1
INSERT INTO MEMBER (ID, NAME, AGE) values ("id1", '준석', 2)
UPDATE MEMBER SET AGE=24, NAME='준석' WHERE ID='id1'
DELETE FROM MEMBER WHERE ID = 'id1'
SELECT * FROM MEMBER WHERE ID='id1'
select m from Member m //여기서 Member는 테이블이 아닌 엔티티 객체이다.
위 코드는 JPQL이다. JPQL은 데이터베이스 테이블을 전혀 알지 못한다.SELECT M.ID, M.NAME, M.AGE FROM MEMBER M
2.7 정리
JPA는 반복적인 JDBC API와 결과 값 매핑을 처리해준다.그리고 SQL도 작성할 필요가 없어 많은 코드량을 줄일 수 있다.