본문 바로가기
프로그래밍/JPA

02. JPA 시작

by 직장인 투자자 2022. 1. 11.

JPA 시작

H2 데이터베이스 특징

  • RDBMS
  • 초경량DB, 인메모리 DB 지원. (테스트의 용도로 주로 사용된다. 굳이 사용하려면 캐싱의용도)

H2v1.4.199설치경로

 

 

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

애플리케이션 개발

  1. 객체매핑
  2. persistence.xml H2DB 등 기본설정.
  3. 코드 작성.엔티티 매니저 설정 & 트랜잭션 획득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

댓글