[JPA] JPA 실습 구성하기 - 1

윤들윤들·2020년 12월 16일
0
post-thumbnail

원래는 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, ?)
profile
Front&BaackEnd를 재미있게 공부하고싶은 개발자 YundleYundle

0개의 댓글