본문 바로가기

Programming/과거포스팅

[JPA] - JPA의 시작[기본코드]

JPA의 시작



책을 구매하면 기본적으로 김영한님의 예제 소스를 볼 수 있다. 하지만 예제 코드를 보기만 하는거보다 익숙해 질 수 있는 방법은 그 코드를 직접 작성해 보는 거라고 생각한다.
그래서 김영한님의 코드를 참고해서 코드를 작성할 것이다.


실제 JPA를 사용할 때는 대부분 Spring Boot와 사용할 것이다. 하지만 JPA를 자세히 알기 위해서 순수 자바 코드로 어떻게 JPA가 동작하는지 알아볼 것이다.
예제 코드는 H2 DB를 사용해서 구현할 예정이다.

기본코드는 이번 포스팅에서 한 번만 구현하며 앞으로 나올 코드는 해당 코드에 덧붙여 나가는 식으로 작업하도록 하겠다. 요즘 이클립스에서는 기본적으로 메이븐 플러그인이 설치되어 있으니 별도의 플러그인을 설치할 필요는 없다. Maven프로젝트를 생성한다.

JPA 설정을 위해서 persistence.xml을 만들어야 하는데 JPA ORM Mapper file로 생성하면 된다. 하지만 생성시 오류가 난다면 이 프로젝트가 JPA를 사용한다는 것을 명시해 줘야 한다.


Properties에서 Project Facets에서 JPA를 체크하면 해당 xml이 자동으로 생성이 될것이다.


프로젝트 구조가 다음과 같이 되었으면 4가지를 작업해야한다.
1. H2DB설치 및 테이블 생성 -> http://www.h2database.com/html/main.html

CREATE TABLE MEMBER ( ID VARCHAR(255) NOT NULL, NAME VARCHAR(255), AGE INTEGER NOT NULL, PRIMARY KEY (ID) )


2. pom.xml (하이버네이트와 h2DB 의존성 추가)


<dependency>
	<groupId>org.hibernate</groupId>
	<artifactId>hibernate-entitymanager</artifactId>
	<version>4.3.10.Final</version>
</dependency>

<dependency>
	<groupId>com.h2database</groupId>
	<artifactId>h2</artifactId>
	<version>1.4.187</version>
</dependency>

3. persistence.xml (영속성 추가-데이터소스)


<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1"> <persistence-unit name="jpaTest"> <!-- 데이터베이스당 하나의 영속성 name은 영속성 고유의 이름으로 지정 --> <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="sa"/> <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>


3. persistence.xml (영속성 추가-데이터소스)

package jpa.start; import javax.persistence.*; @Entity @Table(name="MEMBER") public class Member {     @Id @Column(name = "ID") private String id;     @Column(name = "NAME")     private String username;     private Integer age;

public String getId() {     return id; } public void setId(String id) {     this.id = id; }


public String getUsername() {     return username; } public void setUsername(String username) {     this.username = username; } public Integer getAge() {     return age; } public void setAge(Integer age) {

this.age = age;

}

}



package jpa.start; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.Persistence; public class App{ public static void main( String[] args ) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpaTest"); EntityManager em = emf.createEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); logic(em); tx.commit(); } catch (Exception e) { e.printStackTrace(); tx.rollback(); } finally { em.close(); } emf.close(); } public static void logic(EntityManager em) { String id = "id1"; Member member = new Member(); member.setId(id); member.setUsername("name"); member.setAge(2); em.persist(member); member.setAge(20); Member findMember = em.find(Member.class, id); System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge()); // List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList(); System.out.println("members.size=" + members.size()); // em.remove(member); } }


코드 작성중 Entity클래스에서 persistence.xml과 관련한 오류가 발생된다면 persistence.xml에서 우클릭후 JPA Tools-> syschronize Class List를 해주면 Entity 클래스의 오류가 사라진다. 


위의 코드는 정말 간단한데. 엔티티매니저를 만들고 트랜젝션을 열면 Member라는 객체는 영속성을 가지게 되고 엔티티 매너지로 persist, remove하는 것 만으로 데이터 베이스를 조작할 수 있고 set하는 것만으로 업데이트가 가능하다.

엔티티매니저팩토리(EntityManagerFactory) persistence.xml의 정보를 읽고 JPA를 동작시키기 위한 기반 객체를 만들고 JPA 구현체에 따라서 데이터베이스 커넥션 풀도 생산한다. 이 말은 엔티티매니저의 생성비용이 크다는 것이다. 그렇기 때문에 엔티티매니저팩토리는 어플리케이션에서 딱 한 번만 생성하고 공유해서 사용해야 한다.


이정도가 JPA의 가장 기본적인 구조이다.