자바 ORM 표준 JPA프로그래밍
이란 책을 보고 공부를 위해 작성한 글입니다. 이번 포스팅에서는 JPA, H2
설정을 진행하겠습니다.
1. 환경
IDE
eclipse
JAVA
1.8
DB
h2
, JPA
Build Tool
Maven
2. 프로젝트 생성
Spring MVC 프로젝트를 생성합니다.
3. Maven 의존성 설정
의존성 설정을 위해 pom.xml 을 편집합니다.
<!-- h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
<scope>test</scope>
</dependency>
<!-- JPA, 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.10.Final</version>
</dependency>
<dependencies>
태그 안에 위의 의존성을 추가합니다.
4. H2 DB 설정
h2 db는 초경량의 db로 인메모리 db도 지원하며 웹 콘솔에서도 사용가능한 db입니다. 테스트 환경에 아주 적합합니다.
http://www.h2database.com/html/download.html에서 platform-independent Zip를 설치합니다.
압출을 풀고 위의 경로에서 h2.bat을 실행하면 h2를 서버모드로 실행할 수 있습니다.(Window 기준) linux의 경우 sh를 실행합니다.
웹을 열고 http://localhost:8082 로 접속하면 위와 같이 h2에 연결됩니다. 위 그림과 같이 설정하고 연결을 누르면 연결이 됩니다.
5. Persistence.xml 설정
JPA를 이용하기 위해서는 필요한 설정정보가 담긴 xml 설정 파일을 생성 해야 합니다. META-INF/persistence.xml
의 클래스패스 경로에 존재하면 자동으로 JPA가 인식을 합니다.
<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=""/>
<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>
persistence.xml에 위와 같이 입력합니다. <persistence-unit name="jpabook">
은 EntityManagerFactory
를 생성할 때 영속성 유닛을 지정할 이름
으로 사용됩니다.
6. JPA 사용
6.1 MemberTable 생성
우선 웹 어플리케이션에서 사용할 Member Table을 위와같이 생성합니다.
6.2 MemberEntity 생성
xxxxxxxxxx
package com.java.ex.jpa;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
name="MEMBER") (
public class MemberEntity {
(name="id")
private String id;
(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;
}
}
그 후 Member table
과 mapping될 MemberEntity Class
를 생성합니다. 몇몇의 어노테이션이 보입니다 간단히 살펴보겠습니다.
@Entity
해당 클래스가 테이블과 매핑될 entity Class임을 JPA에게 알려줍니다.
@Table
entity class에 매핑할 table을 지정하는 속성입니다. 이 속성을 생략한다면 entity class를 카멜케이스로 한것을 매핑하게 됩니다. 우리는 Member Table을 생성하였고, 그와 매핑될 Entity Class의 이름은 MemberEntity이므로 이 속성이 필요합니다.
@Id
해당 어노테이션이 부여된 필드를 테이블의 primary key와 매핑되도록 합니다.
@Column
필드를 table의 column과 매핑합니다. 생략한다면 필드의 이름을 그대로 table의 column의 이름과 매핑합니다. userName의 경우 table에서는 name이라는 이름을 사용하므로 별도로 name
속성을 주어 매핑했습니다. 또한 이 어노테이션을 통해 필드에 별도의 제약을 줄 수도 있습니다.
6.3 Member entity 저장 Controller 생성
package com.java.ex.controller;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import com.java.ex.jpa.MemberEntity;
public class HomeController {
public void logic(EntityManager em) {
String id = "galid1";
MemberEntity member = new MemberEntity();
member.setId(id);
member.setUserName("jjy");
member.setAge(20);
em.persist(member);
member.setAge(24);
MemberEntity findMember = em.find(MemberEntity.class, id);
System.out.println("findMember = " + findMember.getUserName() + " " + findMember.getAge());
}
("/")
public String saveMember() {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
logic(em);
tx.commit();
}catch (Exception e) {
e.printStackTrace();
}finally {
em.close();
}
emf.close();
return "home";
}
}
사용자로 부터 /
요청을 받게 될때 Member Entity를 저장하도록 하는 코드입니다.
saveMember()
saveMember() 코드에서는 아래와 같은 일을 처리합니다.
첫번째로 EntityManagerFactory
를 생성하며 이때 Persistence
의 createEntityManagerFactory() 메소드를 사용합니다. 또한 메소드의 인자로 아까 생성한 persitence-unit
의 고유이름을 전달합니다.
두번째로 방금 생성한 EntityManagerFactory를 통해 EntityManager
를 생성합니다.
세번째로 JPA를 이용하기 위한 Transaction 객체를 생성합니다. JPA에서는 Transaction없이 데이터를 변경한다면 예외를 발생시키게 됩니다.
마지막으로 transaction을 시작하고 logic()
을 호출한 뒤 commit()
합니다.
logic(EntityManager)
logic에서는 JPA를 이용하여 MemberEntity를 저장하고, 검색하여 콘솔에 출력을 합니다.
7. 확인
만든 Controller로 요청을 보내기 위해 위의 경로로 요청을 해보겠습니다.
콘솔에 성공적으로 만들었던 entity의 정보가 출력이 됩니다. DB를 확인해 보겠습니다.
성공적으로 레코드가 저장된것을 볼 수 있습니다.
'FrameWork > Spring JPA' 카테고리의 다른 글
JPA - Entity의 가독성을 높이자 - 2 (Embedded Id 사용법) (0) | 2019.08.05 |
---|---|
JPA - Entity의 가독성을 높이자(@Embedded, @Embeddable, @AttributeOverride 사용법) (0) | 2019.07.25 |
JPA - Enum을 이용해 Column 저장하기 (1) | 2019.06.30 |
JPA - JPA 다중 Database 사용법 (2) | 2019.02.04 |
JPA - JPA Hibernate-sequence doesn't exist 오류 (0) | 2018.10.13 |