[JPA] JPA 프로그래밍 기본기 다지기 2강 - JPA 기초와 매핑
업데이트:
💡JPA기초와 매핑
✔H2 데이터베이스
- 최고의 실습용 DB
- 가볍다(1.5M)
- 웹용 쿼리툴 제공
- MySQL, Oracle 데이터베이스 시뮬레이션 가능
- 시퀀스, AUTO INCREMENT 기능 지원
✔메이븐 설정
- 자바 라이브러리, 빌드 관리
- 라이브러리 자동 다운로드 및 의존성 관리
✔객체 매핑하기
- @Entity: JPA가 관리할 객체, 엔티티
- @Id: DB PK와 매핑할 필드
@Entity public class Member{ @Id private Long id; private String name; ... }
Ex)
create table Member(
id bigint not null,
name varchar(255),
primary key (id)
)
✔persistence.xml 파일 생성
JPA 설정 파일
/META-INF/persistence.xml
위치javax.persistence
로 시작: JPA 표준 속성hibernate
로 시작: 하이버네이트 전용 속성
✔데이터베이스 방언
- JPA는 특정 데이터베이스에 종속적이지 않은 기술
- 각각의 데이터베이스가 제공하는 SQL문법과 함수는 조금씩 다르다
- 가변 문자: MySQL은 VARCHAR, Oracle은 VARCHAR2
- 문자열을 자르는 함수: SQL표준은 SUBSTRING(), Oracle은 SUBSTR()
- 방언: SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능
hibernate.dialect
속성에 지정- H2:
org.hibernate.dialect.H2Dialect
- Oracle 10g:
org.hibernate.dialect.Oracle10gDialect
- MySQL:
org.hibernate.dialect.MySQL5InnoDBDialect
- H2:
- 하이버네이트는 45가지 방언 지원
💻실습하기
1.H2 DB를 실행해서 테이블을 생성한다.
2.STS에서 Maven Project 생성
- Create a simple project 체크
- Group Id, Artifact Id 아무거나 쓰면 됨
3.pom.xml에 dependencies 추가
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>hello.jpa</groupId>
<artifactId>hello.jpa</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.3.7.Final</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
</dependency>
</dependencies>
</project>
4.src/main/java
에 Main.java생성
Main.java
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import hellojpa.entity.Member;
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager(); // 엔티티매니저 생성
EntityTransaction tx = em.getTransaction(); // 트랜잭션을 얻음
tx.begin(); // db에 접근해서 커넥션 가져와서 실제 트랜잭션 시작
try {
Member member = new Member();
member.setId(100L);
member.setName("안녕하세요");
em.persist(member); // 영구 저장
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close(); // 엔티티매니저 종료
}
emf.close(); // 엔티티매니저 종료
}
}
- 데이터베이스에서의 트랜잭션: 상태를 변화시키기 위해 수행하는 작업의 단위
5.src/main/resources
에 Member.java 생성
Member.java
package hellojpa.entity;
import javax.persistence.Entity;
import javax.persistence.Id;
@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;
}
}
6.src/main/resources
> META_INF
폴더 생성 > persistence.xml
생성
persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.2">
<!-- hello라는 이름을 가지고 다음 설정정보를 가진다는 의미 -->
<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.user_sql_comments" value="true"/>
<!-- <property name="hibernate.hbm2ddl.auto" value="create"/>-->
</properties>
</persistence-unit>
</persistence>
-
엔티티 메니저 설정
트랜잭션 단위로 업무를 처리할 때 항상 엔티티 매니저를 새로 만들어야한다. -
주의
- 엔티티 매니저 팩토리는 반드시 하나만 생성해서 애플리케이션 전체에서 공유해야한다.
- 엔티티 메니저는 쓰레드간에 공유하면 안된다(사용하고 버려야한다.)
- JPA의 모든 데이터 변경은 트랜잭션 안에서 실행해야한다.
실행 결과
MEMBER테이블안에 데이터가 잘 들어가있는것을 확인할 수 있다.
ID는 PK로 사용되기 때문에 한번 더 실행되면 에러가 발생하니 주의하자.