공부/JPA

JPA 시작하기 - Hello JPA 시작하기 (프로젝트 생성 및 개발)

데부한 2022. 6. 28. 20:52
반응형

출처 : 자바 ORM 표준 JPA 프로그래밍 인프런 강의

 

JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.

 

Hello JPA 프로젝트 생성

  • Language : JAVA 8 이상(8 권장)
  • DB : H2 Database  -  http://www.h2database.com/
    •  최고의 실습용 DB
    • 가벼움 (1.5M)
    • 웹용 쿼리툴 제공
    • MySQL, Oracle DB 시뮬레이션 기능
    • 시퀀스, AUTO INCREMENT 기능 지원
  • Build Tool : Maven
    • 자바 라이브러리, 빌드 관리
    • 라이브러리 자동 다운로드 및 의존성 관리
    • 최근에는 그레이들(Gradle)을 많이 사용하지만 강의에서는 아직도 Maven을 많이 사용하기 때문에 Maven으로 진행

 

IntelliJ에서 프로젝트 생성

 

pom.xml dependency 추가

<!-- 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>

추가 후 라이브러리 글자가 빨간 글자가 되길래 뭐지 하다가 저장해봤더니 라이브러리를 다운이 다 되면 하얀색 글자로 돌아온다.

 

JPA 설정 - persistence.xml

  • src/main/resources/META-INF/persistenct.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>
  • hibernate.dialect 옵션의 경우 각 DBMS마다 기능은 같거나 비슷하지만 명칭이 다른 부분 때문에 Oracle을 사용할 거면 Oracle, MySQL을 사용할 거면 MySQL로 지정해주어야 각 DBMS에 맞게 쿼리가 작성된다.
    ex) MySQL의 Limit, Oracle의 Rownum

 


애플리케이션 개발

  • h2 DB에 MEMBER TABLE 생성
create table Member ( 
 	id bigint not null,
 	name varchar(255),
 	primary key (id)
);

 

  • JpaMain.class 코드 작성
// 저장의 경우 JPA 정석 코드

public class JpaMain {

    public static void main(String[] args) {
        // 엔티티 매니저 팩토리 생성, 파라미터로 넘어가는 값은 persistence.xml에서 persistence-unit의 name 값을 넘겨주면 된다.
        // emf의 경우 애플리케이션 로딩 시점에 딱 하나만 만들면 된다.
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        // 엔티티 매니저 생성
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try {

            // 생성
            Member member = new Member();
            member.setId(1L);
            member.setName("helloA");
            em.persist(member);

            // 조회
            // 첫번째 파라미터 : 엔티티 클래스
            // 두번째 파라미터 : PK 값
            Member findMember = em.find(Member.class, 1L);

            // 삭제
            //em.remove(findMember);

            // 수정
            findMember.setName("HAN");

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            // 엔티티 매니저 종료
            em.close();
        }
        // 엔티티 매니저 팩토리 종료
        emf.close();
    }
}

 

  • JPA 구동 방식

  • EntityManagerFactory 
    • 애플리케이션 전체에서 딱 한 번만 생성해서 애플리케이션 전체에서 공유해 사용한다.
    • EntityManager를 생성한다.
  • EntityManager
    • 쉽게 생각하면 DB 커넥션 풀과 같은 기능을 가지고 있다고 생각하면 된다.
    • DB 커넥션과 밀접한 관계가 있으므로 Thread 간 공유하면 안 되고 사용 후 버려(close)야 한다.

 

 

조회

  • 단건 조회의 경우 위에서 작성했던 코드처럼 간단하게 조회할 수 있다.
Member findMember = em.find(Member.class, 1L);

 

  • 다건 조회일 때는 JPQL을 사용해야한다.
List<Member> result = em.createQuery("select m from Member as m", Member.class)
            .getResultList();
            
// 모든 멤버 이름 출력
for (Member member : result) {
    System.out.println("member.name = " + member.getName());
}

 

 

JPQL

  • SQL을 추상화한 객체 지향 쿼리 언어 -> 특정 DB SQL에 의존하지 않음
  • SQL과 문법이 유사하고 SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
  • JPQL은 엔티티 객체를 대상으로 쿼리를 작성
  • SQL은 데이터베이스 테이블을 대상으로 쿼리를 작성

 

 

반응형