Hello JPA

RoyBae·2022년 8월 8일
0

Hello JPA

목록 보기
1/2

강의는 매번 반복적으로 들었지만 들을 때마다 새로운 내용이였다...
포스팅을 하면서 내용을 정리하는 시간이 필요하다 생각되어 작성하게 되었다.

프로젝트 구성

1. JPA 설정, 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.Oracle8iDialect"/>
            <!-- 옵션 -->
            <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>

2. 라이브러리 추가, pom.xml

<?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>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>16</source>
                    <target>16</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <!-- 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.200</version>
        </dependency>
        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
    </dependencies>
    <properties>
        <maven.compiler.source>18</maven.compiler.source>
        <maven.compiler.target>18</maven.compiler.target>
    </properties>
</project>

3. Member 클레스 생성

package hellojpa;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class Member {

    @Id
    private Long id;
    private String name;

    public void setId(Long id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }
}

h2 db에 같은 Member Table을 생성하여 주고,

Member Class에 @Entity 맵핑을 해준다.

@Entity : JPA가 관리할 객체
@Id : 데이터베이스 PK와 맵핑

4. 객체를 이용한 회원 등록, 수정, 삭제, 조회

package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.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 mb = new Member();
            mb.setId(1L);
            mb.setName("HelloJPA1");

            em.persist(mb);
            */

            /* 특정 id 찾은 후 수정
            Member findMember = em.find(Member.class, "1L");
            findMember.setName("HelloJPA2");
            */

            /* JPQL을 사용하여 객체 조회
            List<Member> result = em.createQuery("select m from Member as m", Member.class)
                    .setFirstResult(5)
                    .setMaxResults(8)
                    .getResultList();

            for(Member member : result){
                System.out.println("member.name = " + member.getName());
            }
            */

            tx.commit();
        }catch (Exception e){
            tx.rollback();
        }finally {

            em.close();
        }
        emf.close();
    }
}

5. 참고

EntityManagerFactory은

하나만 생성하여 어플리케이션 전체 공유

EntityManager는

쓰레드간에 공유는 하지 않아야 사고를 방지할 수 있고, 사용하고 버려야한다.
JPA의 모든 데이터 변경은 트랜젝션 안에서 실행한다.

JPQL은

SQL을 추상화한 JPQL이라는 객체지향 쿼리언어를 제공

JPQL은 엔티티 객체를 대상 쿼리
SQL은 데이터베이스 테이블 대상 쿼리

SQL을 추상화하여 특정 데이터베이스 SQL에 의존하지 않는다.

출처 : https://inf.run/Q6fc

profile
반도체 IT System Developer

0개의 댓글