[자바 ORM 표준 JPA 프로그래밍] 2. JPA 시작하기

서요이·2022년 10월 3일
0
post-thumbnail

2. JPA 시작하기

Hello JPA - 프로젝트 생성

H2 데이터베이스 설치와 실행 - 이미 설치됨
window의 경우 H2 데이터베이스 설치 후 cmd 창에서 다음 명령어 실행
cd C:\Program Files (x86)\H2\bin h2.bat

프로젝트 생성

  • 자바 8 이상
  • 메이븐 설정 (groupid: jpa-basic, artifactid: ex1-hello-jpa, version:1.0.0)

pom.xml

  • org.hibernate 버전: Spring Boot Reference Doc. 에서 확인
  • h2.database 버전: 설치한 h2와 같은 버전
    Spring Boot 2.7.4 / hibernate 5.6.11.Final / h2 2.1.214 사용
<?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-SNAPSHOT</version>

    <dependencies>
        <!-- JPA 하이버네이트 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>5.6.11.Final</version>
        </dependency>

        <!-- H2 데이터베이스 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>2.1.214</version>
        </dependency>
    </dependencies>

</project>

JPA 설정하기 - persistence.xml
/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 - 특정 데이터베이스에 종속 X
방언 - SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능
hibernate.dialect 속성에 지정

Hello JPA - 애플리케이션 개발

  1. Persistence → META-INF/persistence.xml 설정 정보 조회
  2. Persistence → EntityManagerFactory 생성
  3. EntityManagerFactory → EntityManager 생성

JpaMain 클래스 생성

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();

        em.close();

        emf.close();
    }
}

H2 데이터베이스 접속
url = jdbc:h2:tcp://localhost/~/test

Member 테이블 생성

create table Member (
	id bigint not null,
	name varchar(255),
	primary key (id)
);

Member 클래스 생성

@Entity
public class Member {

    @Id
    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;
    }
}

회원 등록

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();
}

JPA는 transaction 안에서 실행되어야 함
→ 실행시 DB에 등록됨 - JPA 자동으로 매핑해서 실행

회원 조회
Member findMember = em.find(Member.class, 1L);

회원 삭제
em.remove(findMember);

회원 수정 - 저장할 필요 없음
findMember.setName(”HelloJPA”);
자동으로 Update 쿼리 생성

주의!!!

  • 엔티티 매니저 팩토리는 하나만 생성해서 애플리케이션 전체에서 공유
  • 엔티티 매니저는 스레드 간의 공유 X (사용하고 버리기)
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행!!

JPQL - 객체 지향 쿼리 언어

JPQL로 전체 회원 검색
List<Member> result = em.createQuery(”select m from Member as m”, Member.class).getResultList();

JPQL은 테이블이 아닌 엔티티 객체를 대상으로 쿼리
SQL은 데이터베이스 테이블을 대상으로 쿼리

0개의 댓글