내가 사용할 Spring Boot의 Ref-Doc 중 Dependency version
을 보면
위와같이 권장하는 hibernate 버전을 명시해준다. 이거에 맞게 hibernate를 사용하면 된다.
Maven으로 진행
인텔리J에서 File → Project 생성 → Maven 선택
GroupId: jpa-basic
Artificatid: ex1-hello-jpa → 빌드하면 나오는 이름
Version: 1.0.0
-----------------------
Project name: ex1-hello-jpa
Project location: ~/study/ex1-hello-jpa
---------------------------------
porm.xml
에 아래의 dep을 추가한다.
<dependencies>
<!-- JPA 하이버네이트 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.3.10.Final</version>
</dependency>
<!-- H2 데이터베이스 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
</dependency>
</dependencies>
JPA는 인터페이스의 모음이다. 그 중 인터페이스의 구현체로 Hibernate를 선택했다.
그렇기 때문에 Hibernate가 JPA 인터페이스를 가지고 있다.
<artifactId>hibernate-entitymanager</artifactId>
을 쓰면 위의 내용이 알아서 된다.
<version>1.4.199</version>
h2 데이터베이스를 웹상에서 다운로드 받았던 버전이랑 일치시켜줘야한다.
select H2VERSION() from DUAL;
을 통해 알 수 있다.
JAVA처럼 hello world 바로 띄울 수 있는게 아니라 몇가지 추가적인 설정이 필요하다
파일을 복붙하면 되는데 이때 경로가 매우 중요하다
src/main/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">
<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>
이중에서
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
을 보면 어떤 DB를 쓸지 명시해주는데, 오라클DB 쓸거면 value에 오라클DB 넣어주면 된다.
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
[데이터베이스 방언] → JPA는 특정 DB에 종속적x → 프로젝트 중간에 DB 다른거로 바꿔도 ok
방언 == 사투리
따라서 DB마다 같은뜻인대 다릏게 SQL작성해야하는 것이있다.
그중 페이징이 일일이 맞춰줘야되서 까다롭다.
내가 H2라는 사투리를 쓸꺼야 명시하면 JPA가 알아서 번역해준다.
• H2 : org.hibernate.dialect.H2Dialect
• Oracle 10g : org.hibernate.dialect.Oracle10gDialect
• MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
JPA의 구현체로 Hibernate말고 2가지가 더 있는대, javax로 하면 다른거로 바꿔도 그대로 적용가능o
hellojpa
라는 패키지 만들고 그 밑에 JPAMain
이라는 클래스 생성.package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class JPAMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
// DB-CRUD code작성
em.close();
emf.close();
}
}
이제 DB-CRUD하기 전에 테이블을 생성해 놓자
h2 데이터베이스 console 열어서 로그인 할때 localhost:8082 접속 후
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
에 있는 url(value 값)에 맞게
이때
위와 같은 에러가 뜬다면,
C://User/kyung 밑에 test.mv.db
파일을 생성한다(.txt 파일 생성 후 파일명 바꾸자)
이후 연결을 통해 SQL언어 작성 가능하다
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
);
Member 라는 테이블을 생성한다
DB에 생성했으니까 JPA에서도 생성해보자
src/main/java/hellojpa/Member
라는 클래스 만들자
이후 DB와 동일하게 매핑되는 필드를 추가하
@Entity
를 꼭 넣어주어여 한다. 왜냐하면 이걸 넣어줘야 JPA가 “아 이놈은 내가 관리해야하는 놈이구나”라고 인지할 수 있다.
그리고 필드를 생성후 어떤 것이 PK인지 JPA한테 알려줘야하니까 @Id
도 써줘야한다.
이후 아래 빈칸에서 Generate → Getter and Setter
해서 각 필드에 따른 getter/setter
생성한다.
package hellojpa;
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;
}
}