Peony의 기록 창고 🌼
article thumbnail
Published 2022. 6. 22. 18:07
[JPA] JPA 시작하기 SpringBoot/JPA 기본
반응형

JPA 시작하기

프로젝트 생성

  1. DB 설치하기
    ⇒ 실습용으로는 간단하게 사용되고 웹상황에서 콘솔창도 볼 수 있는 H2를 사용한다. H2 설치 가이드는 링크 글을 참고한다.
  2. 프로젝트 생성하기
    • Java 8 이상(8권장)
    • Maven 프로젝트
    • groupId: jpa-basic
    • artifactId: ex1-hello-jpa
    • version: 1.0.0
  3. 프로젝트 설정 : Maven
    • pom.xml
      • 우리가 나중에 사용할 스프링 부트 버전에 있는 org.hibernate 버전을 확인하고, 그에 맞게 바꿔주어야 한다.
        https://spring.io/projects/spring-boot#learn → Reference Doc 클릭, → a single HTML page 클릭
      • H2 데이터 베이스 버전도 변경 필요!
        <?xml version="1.0" encoding="UTF-8"?>
        <project xmlns="http://maven.apache.org/POM/4.0.0"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <groupId>jpa-basic</groupId>
            <artifactId>ex1-hello-jpa</artifactId>
            <version>1.0.0</version>
            <dependencies>
        
                <!-- JPA 하이버네이트 -->
                <dependency>
                    <groupId>org.hibernate</groupId>
                    <artifactId>hibernate-entitymanager</artifactId>
                    <version>5.6.9.Final</version>
                </dependency>
        
                <!-- H2 데이터베이스 -->
                <dependency>
                    <groupId>com.h2database</groupId>
                    <artifactId>h2</artifactId>
                    <version>2.1.214</version>
                </dependency>
            </dependencies>
            <properties>
                <maven.compiler.source>11</maven.compiler.source>
                <maven.compiler.target>11</maven.compiler.target>
            </properties>
        </project>
      • 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>

 

JPA 구동 방식

JPA 구동 방식

JPA 사용해보기

src/main/java/hellojpa/JpaMain.java 생성

 package hellojpa;
 ​
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.EntityTransaction;
 import javax.persistence.Persistence;
 ​
 public class JpaMain {
     public static void main(String[] args) {
         EntityManagerFactory emf =  Persistence.createEntityManagerFactory("hello");
         EntityManager em = emf.createEntityManager();
         emf.close();
     }
 }
  • Persistence 클래스에서 persistence.xml의 persistenceUnitName을 인자 값으로 주면 해당 persistence Unit에 지정된 설정 정보들을 토대로 EntityManagerFactory를 만들어 준다.
  • EntityManagerFactory에서 EntityManager를 만들어 준다.
  • 생성된 EntityManager로 DB에 SQL을 전달한다.

 

그럼 이제 Member 클래스를 만들어보자.

 package hellojpa;
 ​
 import javax.persistence.Entity;
 import javax.persistence.Id;
 ​
 @Entity
 public class Member {
     @Id //pk
     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;
     }
 }
  • @Entity : JPA에서 해당 객체를 관리하겠다는 어노테이션
  • @Id : 해당 필드가 식별자 역할(pk)을 한다는 어노테이션

 

회원 등록

 package hellojpa;
 ​
 import javax.persistence.*;
 import java.util.List;
 ​
 public class JpaMain {
     public static void main(String[] args) {
         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);

             tx.commit();
         } catch (Exception e) {
             tx.rollback();
         } finally {
             em.close();
         }
 ​
         emf.close();
     }
 }
  • 트랜잭션 시작, 커밋 설정이 있어야 오류가 발생하지 않는다.

 

회원 조회

전체 코드는 위에 있는 코드와 같으므로 try구문 안쪽만 수정하면 된다.

 //조회
 Member findMember = em.find(Member.class, 1L);
 System.out.println("findMember.getId() = " + findMember.getId());
 System.out.println("findMember.getName() = " + findMember.getName());            
  • 멤버를 찾을 때는 find (클래스, pk) 메서드를 사용한다.

 

회원 수정

 //수정
 Member findMember = em.find(Member.class, 1L);
 findMember.setName("HelloJPA");
  • setName 만하고 em.persist()를 사용하지 않았음에도 DB에 값이 변경되는 것을 확인할 수 있다. → 자바의 컬렉션을 다루는것 처럼 JPA가 관리해준다.

 

회원 삭제

 //삭제
 Member findMember = em.find(Member.class, 1L);       
 em.remove(1L);
 tx.commit();

 

정리 : EntityManger의 기본적인 CRUD

저장 : persist();
조회: find();
삭제: remove();
변경: 따로 함수를 호출하기보다는 find를 해서 가져온 객체에서 setter 메서드를 통해 값을 변경하면,commit()이 적용되기 전에 기존 객체와 차이점을 찾아서 자동 업데이트를 해준다.



주의점

  • EntityManagerFactory는 시스템마다 1개만 생성해서 애플리케이션 전체에서 공유한다.
  • EntityManager는 쓰레드 간에 공유X (사용하고 버려야 한다.)
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행되어야 한다.

 

JPQL

  • JPA는 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색한다.
    → 테이블에서 가져오면 객체지향의 패러다임이 깨지기 때문
  • 하지만, 모든 DB데이터를 객체로 변환해서 검색하는 것은 불가능하다.
    → 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요.
  • JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
  • SQL 문법과 유사하다. : SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
  • JPQL은 엔티티 객체를 대상으로 쿼리한다. → DB를 바꾸더라도 방언을 교체할 필요가 없다.
  • SQL은 데이터베이스 테이블을 대상으로 쿼리한다.

 

사용 예시

 //전체 회원 조회
 List<Member> result = em.createQuery("select m from Member as m", Member.class)
   .getResultList();
  • 테이블 대상이 아닌 객체 대상 으로 조회하므로 엔티티 객체를 중심으로 개발이 가능하다. (Member.class)

 

JPQL은 한마디로 정의하자면 객체 지향 SQL이다.

 

 

이 글은 김영한 님의 "자바 ORM 표준 JPA 프로그래밍 - 기본편" 강의를 듣고 정리한 내용입니다.

 

반응형
profile

Peony의 기록 창고 🌼

@myeongju