티스토리 뷰
1. 의존성 및 JPA 설정
기본적으로 H2 DB를 설정한 뒤에 Project에 dependency를 설정해주어야 하는데, 이때 하이버네이트 버전은 내가 사용하고자 하는 SpringBoot가 지원하는 버전을 사용하도록 한다.
( 여기에서 Reference Doc. 에서 확인할 수 있다. )
그런 뒤에 아래처럼 의존성을 주입해준다.
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.29.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
</dependencies>
그다음으로 JPA를 띄우기 위하여 JPA 설정이 필요한데 resources 폴더 아래에 META-INF/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">
<!-- Name -->
<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:~/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>
주석 처리해 둔 필수 속성에 DB접근 정보를 넣어주어야 한다. 그 중 가장 중요한 게 가장 아래의 dialect인데, 사전적으로 방언을 뜻한다.
JPA는 특정 데이터베이스에 종속적으로 설계되어 있지 않다. 각각의 데이터베이스가 제공하는 문법과 함수 타입명이 틀리기 때문에, 어떤 데이터베이스의 언어를 사용하는지 이 부분에 명시해주면 JPA가 알아서 SQL 표준으로 변환하여 준다.
ex)
H2 : H2Dialect
Oracle : Oracle10gDialect
MYSQL : MySQL5Dialect
…
2. JPA 구동방식
다음으로 넘어가기 전에, JPA가 어떤 식으로 동작하는지 간단히 살펴보자.
Persistence Class에서 바로 위에서 작성했던 설정 정보를 조회해서 EntityManagerFacotry라는 Class를 만든다.
그리고 필요할 때마다 EntityManager를 찍어내는 방식으로 구동한다.
이를 main 클래스에서 구현해보면, 아래와 같다.
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory em = Persistence.createEntityManagerFactory("hello");
EntityManager entityManager = em.createEntityManager();
entityManager.close();
em.close();
}
}
보면 위에 언급한 대로 Persistence에서 EntityManagetFactory를 만들고, 여기에 인자 값으로 넣어주는 것이 기존에 생성한 persistence.xml의 persistence unit name이다. 바로 이 설정 파일을 사용하겠다고 명시를 하는 것이다.
3. Table 생성
이제 본격적으로 JPA를 통해 테이블을 생성해보자.
객체를 매핑하기 위해서는 @Entity 가 필수! 그래야 JPA가 로딩될 때, 매핑시킬 객체임을 인식한다. 또 PK인 컬럼을 @Id 어노테이션을 통해 명시해준다.
@Entity
public class Member {
@Id
private Long id;
private String name;
//getter setter
}
이렇게 간단한 테이블을 만들어 둔 뒤에 main클래스에서 Member 객체를 직접 DB에 insert 해보자.
4. CRUD
CREATE
JPA에서는 트랜젝션의 단위가 굉장히 중요하다. 모든 Data를 변경하는 작업은 트랜잭션 안에서 작업을 해야 한다.
따라서, 아래와 같이 코드를 작성해야 한다.
public class JpaMain {
public static void main(String[] args) {
// Factory 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// Manager 생성
EntityManager em = emf.createEntityManager();
// Transaction
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
// Member 생성
Member member = new Member();
member.setId(1L);
member.setName("HelloA");
tx.commit();
}catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
위와 같이 작성한 뒤에 main 클래스를 실행해보면 다음과 같은 쿼리가 실행되었음을 볼 수 있다.
그렇다면, 우리가 사실상 작업한 것이라고는 @Entity와 @Id 를 붙여준 것 밖에 없는데 어떻게 테이블과 매핑을 해서 Data를 insert한 걸까?
일반적으로 별다른 설정을 하지 않으면의 이름과 동일한 Table에 insert를 해주는데, 만약 Class이름과는 다른 테이블에 insert를 해줄 때는, @Table(name = ‘USER’) 와 같이 명시를 해주면 된다.
같은 방식으로 만약 filed명과 column명은 동일한 이름끼리 매핑이 되는데, 다른 컬럼에 매핑을 시켜주고 싶을 때는, @Column(name = ‘username’) 과 같이 명시해주도록 한다.
@Entity
@Table(name = 'USER')
public class Member {
@Id
private Long id;
@Column(name = 'username')
private String name;
}
READ
EntityManager의 find 메소드를 사용하면 Entity를 조회할 수 있다. Java의 Collection을 사용하듯이 사용하면 되는데,
1인자에 Entity, 2인자에 PK를 넣어주면 된다.
public class JpaMain {
public static void main(String[] args) {
// Factory 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
// Manager 생성
EntityManager em = emf.createEntityManager();
// Transaction
EntityTransaction tx = em.getTransaction();
tx.begin();
try{
Member findMember = em.find(Member.class, 1L);
System.out.println("Member id : "+findMember.getId());
System.out.println("Member name : "+findMember.getName());
tx.commit();
}catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
REMOVE
삭제의 경우도 마찬가지로 EntityManager의 remove 메소드를 사용하면 된다. 공통적인 코드는 생략한다.
Member findMember = em.find(Member.class, 1L);
em.remove(findMember);
UPDATE
setter를 통해서 값만 바꿔주면 알아서 수정이 된다. JPA를 통해서 Entity를 가져오면 JPA가 커밋 시점에 변경된 것이 있는지 체크를 하고, 바뀐게 있으면 update 쿼리를 날린다.
Member findMember = em.find(Member.class, 1L);
findMember.setName("HelloJPA");
'프로그래밍 > JPA' 카테고리의 다른 글
양방향 연관관계 매핑 (0) | 2021.04.27 |
---|---|
단방향 연관관계 매핑 (0) | 2021.04.27 |
Entity 매핑하기 (0) | 2021.04.26 |
영속성 컨텍스트 (0) | 2021.04.24 |
왜 JPA인가? (0) | 2021.04.21 |