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의 내용이다.
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 쿼리를 날리고 커밋하게 된다.
EntityManager.find()
나이가 18살 이상인 회원을 모두 조회하고 싶다면?
객체를 대상으로 하는 객체지향 쿼리인 JPQL을 사용해야한다. JPQL을 모르면 실무 개발이 불가능하다.
List<Member> result = em.createQuery("select m from Member as m", Member.class)
.getResultList();
엔티티 객체를 대상으로 쿼리를 날리기 때문에 DB에 종속적이지 않다.
SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어
좋은 글이네요. 공유해주셔서 감사합니다.