JPA 시작
H2 데이터베이스 특징
- RDBMS
- 초경량DB, 인메모리 DB 지원. (테스트의 용도로 주로 사용된다. 굳이 사용하려면 캐싱의용도)
H2 및 ch02-jpa-start1 프로젝트 테스트시 오류..
- 맥os에서 H2 tcp연결이 안될경우, tcp(소) -> TCP(대문자) 로 변경.
- Table 'Member'not found 에러발생시, persistence에서 주석 해제로 임시 테스트 가능.(인메모리와 비슷한 느낌)(관련내용)
객체 매핑
CREATE TABLE MEMBER (
ID VARCHAR(255) NOT NULL, --아이디(기본 키)
NAME VARCHAR(255), --이름
AGE INTEGER NOT NULL, --나이
PRIMARY KEY (ID)
)
@GETTER
@SETTER
@Entity // JPA 테이블과 매핑할 클래스라는것을 표시.
@Table(name="MEMBER") // 엔티티 클래스에 매핑할 테이블 정보 입력.
public class Member {
@Id //엔티티 클래스의 필드를 테이블의 기본키(Primary)에 매핑.
@Column(name = "ID") // 필드를 컬럼에 매핑.
private String id;
@Column(name = "NAME")
private String username;
// @Entity하위의, @Column 명시가 없는녀석은 자신의 필드명을 column명으로 사용한다. (대소문자를 구분하는 DB라면 소문자 age와 맵핑된다)
@Column(name = "age")
private Integer age;
}
persistence.xml 설정
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
<persistence-unit name="jpabook">
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.use_sql_comments" value="true" />
<property name="hibernate.id.new_generator_mappings" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
데이터베이스 방언 (hibernate.dialect)
JPA는 특정 데이터베이스에 종속적이지 않은 기술이다.
JPA를 이용해 한번 구현하게되면, 다른 데이터베이스로 손쉽게 교체 가능하다. (또는, 개발/운영환경에서 다른DB를 사용할 수 있다)
하지만 각 데이터베이스는 데이터타입/함수명 등 서로다른 특징을 가지고있기때문에, 이를 반영하기위하여 hibernate.dialect기술을 적용하고있다.
하이버네이트가 제공하는 다양한 데이터베이스 방언의 예시
- H2: org.hibernate.dialect.H2Dialect
- 오라클 10g : org.hibernate.dialect.Oracle10gDialect
- MySQL: org.hibernate.dialect.MySQL5InnoDBDialect
애플리케이션 개발
- 객체매핑
- persistence.xml H2DB 등 기본설정.
- 코드 작성.엔티티 매니저 설정 & 트랜잭션 획득EntityManagerFactory는 JPA기반 객체를 생성하고, DB커넥션풀을 생성하는 과정으로 매우비용이 드는 작업이다. 그렇기에 꼭 한번만 생성하고 공유해야한다.
단, 엔티티매니저와 트랜잭션의경우, 데이터베이스 커넥션으로 이루어져있으므로, 스레드간에 공유하면 안된다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager(); //엔티티 매니저 생성
EntityTransaction tx = em.getTransaction(); //트랜잭션 기능 획득
//Logic이 끝날경우 엔티티 매니저 종료 필수.
em.close(); //엔티티 매니저 종료
emf.close(); //엔티티 매니저 팩토리 종료
트랜잭션관리 (시작/커밋/롤백)
** 트랜잭션이 DB와 실제로 어떻게 연동이되는지..(지연쓰기가 시작될 때시작될것인가, 트랜잭션 begin()할때 db 트랜잭션이 시작될 것인가)
tx.begin(); //트랜잭션 시작
logic(em); //비즈니스 로직
tx.commit();//트랜잭션 커밋
tx.rollback(); //트랜잭션 롤백
CRUD
Member member = new Member();
setData(member); //기본데이터 세팅.
//등록
em.persist(member);
//수정
member.setAge(20);
//조회
em.find(Member.class, id);
//삭제
em.remove(member);
같은 트랜잭션에서조회한 객체의 결과.
Member findMember = em.find(Member.class, id);
Member findMember2 = em.find(Member.class, id);
System.out.println(findMember); //=> jpabook.start.Member@5c92166b
System.out.println(findMember2); //=> jpabook.start.Member@5c92166b
JPQL
단순 primaryKey(id)를이용한조회 em.find()가 아닌, 복잡한 쿼리가 필요할 경우를 위해 JPQL 기능을 제공하고있다.
List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
정리
JPA를 활용하면 객체~테이블 간의 매핑, 간단한 CRUD 쿼리를통해 반복적인 코드의 작성을 줄이고, 관리할 수 있다.
반응형
'프로그래밍 > JPA' 카테고리의 다른 글
05장. 연관관계 매핑기초 (4) | 2022.01.22 |
---|---|
04장. Entity Mapping (6) | 2022.01.18 |
03장. 영속성 관리 (2) | 2022.01.14 |
01. JPA 소개 (4) | 2022.01.08 |
댓글