원래는 Sprind-data-jpa로 실습을 하려다가 JPA를 먼저하고 해도 늦지 않을거같아 간단한 예제들만 테스트 하면서 넘어가기 위해 JPA 실습환경을 구축해봤습니다.
먼저 JPA 구현체로 하이버네이트를 사용하기 위한 핵심 라이브러리는 3가지가 있습니다.
hibernate-core
: 하이버네이트 라이브러리hibernate-entitymanager
: 하이버네이트가 JPA 구현체로 동작하도록 JPA 표준을 구현한 라이브러리hibernate-jpa-2.1-api
: JPA2.1 표준 API를 모아둔 라이브러리
실습한 저의 환경구성은 다음과 같습니다SpringBoot 2.4.1
H2 DB
Maven
Lombok
을 사용하였습니다.
h2 db 설치관련된 내용은 검색하면 많이 나오기 때문에 생략하겠습니다.
일단 설정파일부터 작성해보겠습니다. JPA 설정 파일인 persistence.xml은resource/META-INF/persistence.xml
경로에 있어야 합니다. ( 별도의 설정없이 JPA를 인식 가능 )
META-IMF에 안넣었다가 JPA persistence-unit name을 찾지 못하여 뭘잘못한지도 모르고 30분정도 삽질했습니다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
<persistence-unit name="jpa-sample">
<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" />
<!-- 옵션 -->
<!-- hibernate가 DB에 날리는 Query를 보여준다. -->
<property name="hibernate.show_sql" value="true" />
<!-- show_sql로 보여주는 Query를 이쁘게 Formating해준다. -->
<property name="hibernate.format_sql" value="true" />
<!-- 추가적인 주석을 표시해 준다. -->
<property name="hibernate.use_sql_comments" value="true" />
<!-- hibernate에 포함된 모듈로 Entity를 기반으로 DB 스키마를 생성해주거나 삭제 , 업데이트 해준다. -->
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
필수 속성
- javax.persistence.jdbc.driver
JDBC Driver 값
- javax.persistence.jdbc.user
DB 연결시 사용할 ID
- javax.persistence.jdbc.password
DB 연결시 사용할 Password
- javax.persistence.jdbc.url
DB 연결시 사용할 URL
- hibernate.dialect
데이터베이스 방언이라고 부르는데 종속적이지 않은 기술을 의미합니다. 추후 다른 포스팅으로 내용을 작성하겠습니다.
ddl-auto 옵션에는 다음과 같이 4가지 옵션이 있다.
- create : SessionFactory 시작시 Scheme를 삭제하고 다시 생성한다.
- create-drop : SessionFactory 종료시 만들었던 Scheme를 삭제
- update : SessionFactory 시작시 객체의 현재 구성과 기존의 Scheme를 비교하여 컬럼 추가 삭제작업을 진행 단, 기존의 Scheme를 삭제하지 않고 유지한다.
- validate : SessionFactory 시작시 객체구성과 Scheme가 다르다면 Exception 발생
Entity 생성
자 이제 설정은 끝났으니 제대로 Entity가 생성되어 저장되는지 간단한 코드를 작성해보겠습니다.
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int idx;
private String name;
public Member(String name) {
this.name = name;
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Member{");
sb.append("idx=").append(idx);
sb.append(", name='").append(name).append('\'');
sb.append('}');
return sb.toString();
}
}
아직은 코드가 어떤 의미를 갖는지는 알필요가 없습니다. 일단 제대로 연결이 되었는지 확인하고 그 다음 포스팅에 자세히 다뤄보겠습니다.
실행되는 코드는 다음과 같습니다.
public class JpaApplication {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa-sample");
EntityManager em = emf.createEntityManager(); //엔티티 매니저 생성
EntityTransaction tx = em.getTransaction(); //트랜잭션 기능 획득
try {
tx.begin(); //트랜잭션 시작
Member member = new Member("최윤진");
em.persist(member);
tx.commit();//트랜잭션 커밋
} catch (Exception e) {
tx.rollback(); //트랜잭션 롤백
} finally {
em.close(); //엔티티 매니저 종료
}
emf.close(); //엔티티 매니저 팩토리 종료
}
}
다음과 같이 코드를 작성하고 실행하면 SessionFactory가 시작될때
# drop table 이 실행된다음 새로운 Table 이 생성된다. (ddl-auto:create)
drop table if exists Member CASCADE ;
create table Member (
idx integer generated by default as identity,
name varchar(255),
primary key (idx)
);
# 그다음 Member data가 insert되는 것을 확인할 수 있다.
/* insert io.yundle.app.domain.Member
*/ insert
into
Member
(idx, name)
values
(null, ?)
Hibernate:
/* insert io.yundle.app.domain.Member
*/ insert
into
Member
(idx, name)
values
(null, ?)
반응형
'JPA' 카테고리의 다른 글
[JPA] 플러시 ( flush ) (0) | 2020.12.22 |
---|---|
[JPA] 영속성 컨텍스트의 특징 및 기본 구조 (0) | 2020.12.20 |
[JPA] JPA 영속성 및 상태 (0) | 2020.12.20 |
[JPA] JPA 실습 구성하기 - 2 (0) | 2020.12.16 |
[JPA] JPA란?? (0) | 2020.12.16 |
댓글