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

2022. 6. 28. 20:52·공부/JPA
반응형

출처 : 자바 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은 데이터베이스 테이블을 대상으로 쿼리를 작성

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)
'공부/JPA' 카테고리의 다른 글
  • JPA 영속성 관리 - 내부 동작 방식 준영속 상태
  • JPA 영속성 관리 - 내부 동작 방식 플러시
  • JPA 영속성 관리 - 영속성 컨텍스트
  • JPA 소개
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Java
    oracle
    IT
    전자정부프레임워크
    react
    코딩테스트
    토이프로젝트
    MSA
    Spring
    스프링부트
    프로그래머스
    알고리즘
    운영체제
    에러해결
    방통대
    springboot
    개발자
    SQL
    백준
    JPA
    넥사크로
    토비의스프링부트
    SpringBoot를 이용한 RESTful Web Service 개발
    자바스크립트
    RESTful
    egov
    프론트엔드
    기출문제
    QueryDSL
    인프런
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
JPA 시작하기 - Hello JPA 시작하기 (프로젝트 생성 및 개발)
상단으로

티스토리툴바