프로젝트 생성

OneTwoThree·2023년 7월 22일
0

출처


H2 database

cmd상에서 .\h2.bat 명령어 입력한다.
최초로 접속할 때만 jdbc:h2:~/test 로 db 생성, 이후로는
jdbc:h2:tcp://localhost/~/test 로 접속해야 한다.

프로젝트 생성

maven으로 프로젝트를 생성한다.
의존성을 추가해주고 persistence.xml 을 추가한다.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="hello">
        <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.hbm2ddl.auto" value="create" />-->
        </properties>
    </persistence-unit>
</persistence>

persistence.xml의 내용이다.

JPA 구동 방식

persistence.xml 을 통해 Persistence를 만들고 Persistence가 EntityManagerFactory를 만들고 EntityManagerFactory가 필요할 때마다 EntityManager를 만드는 방식으로 동작함

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class JpaMain {
    public static void main(String[] args) {
        // 만드는 순간 DB랑 연결도 되고 다 됨
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();
        //실제 동작하는 코드는 여기서 쓴다 
        em.close();

        emf.close();

    }
}

위 코드를 보면 EntityManagerFactory를 생성하고 그것을 통해 EntityManager를 만든다.

create table Member (
 id bigint not null,
 name varchar(255),
 primary key (id)
);

h2 db에 다음 쿼리문을 입력해 테이블을 만들어 준다.

@Entity
public class Member {

    @Id
    private Long id;
    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

위와 같이 Member Entity를 만든다. Member Entity에 @Entity 애노테이션을 달아주고 @Id 애노테이션으로 PK가 뭔지 알려준다.


쿼리를 실행하기 위해서
트랜잭션 단위 마다 EntityManager를 만들어서 사용하면 된다.

public class JpaMain {
    public static void main(String[] args) {
        // 만드는 순간 DB랑 연결도 되고 다 됨
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        Member member = new Member();
        member.setId(1L);
        member.setName("HelloA");
        em.persist(member);
        tx.commit();

        em.close();

        emf.close();

    }
}

getTransaction으로 트랜잭션을 얻고 begin으로 트랜잭션을 시작하고 commit으로 커밋해준다. 코드를 실행하고 h2 db를 확인해보면

다음과 같이 생성된 데이터를 확인할 수 있다.

쿼리를 실행할 대상은 규칙상 MEMBER 테이블이 된 것이고 이것을 바꾸고 싶으면 @Table(name="USER) 와 같은 애노테이션을 붙여줄 수 있다. 컬럼에는 @Column(name="username") 과 같이 붙여줄 수 있다.

public class JpaMain {
    public static void main(String[] args) {
        // 만드는 순간 DB랑 연결도 되고 다 됨
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try{
            Member member = new Member();
            member.setId(2L);
            member.setName("HelloB");
            em.persist(member);
            tx.commit();
        } catch(Exception e){
            tx.rollback();
        } finally {
            em.close();
        }
        
        emf.close();

    }
}

예외 발생시 롤백이 되고 EntityManager는 반드시 받아줘야 하므로 위와 같이 코드를 짤 수 있다.

            //조히
            Member findMember = em.find(Member.class, 1L);

            //수정
            findMember.setName("HelloJPA");

            //삭제
            em.remove(findMember);

조회, 수정, 삭제는 다음과 같이 각각 하면 된다.
수정 하고 나서 persist로 다시 저장할 필요가 없다.

JPA를 통해서 엔티티를 가져오면 JPA가 해당 객체를 관리한다. 변경이 되는지 안 되는지 트랜잭션을 커밋하는 순간에 모두 체크해서 UPDATE 쿼리를 날리고 커밋하게 된다.

  • 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유한다.
  • 엔티티 매니저는 쓰레드간 공유 X
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 진행

JPQL

EntityManager.find()
나이가 18살 이상인 회원을 모두 조회하고 싶다면?
객체를 대상으로 하는 객체지향 쿼리인 JPQL을 사용해야한다. JPQL을 모르면 실무 개발이 불가능하다.

  List<Member> result = em.createQuery("select m from Member as m", Member.class)
                    .getResultList();

엔티티 객체를 대상으로 쿼리를 날리기 때문에 DB에 종속적이지 않다.
SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어

1개의 댓글

comment-user-thumbnail
2023년 7월 22일

좋은 글이네요. 공유해주셔서 감사합니다.

답글 달기