티스토리 뷰

 

1.  프로젝트 구성

 

 

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>jpaBasic</groupId>
    <artifactId>ex1-hello-jpa</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <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>2.1.214</version>
        </dependency>

        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.1</version>
        </dependency>

    </dependencies>

</project>

 

3. 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>

 

4. JpaMain 클래스

 

더보기
package hello.jpa;

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){

        // 1. Entity
        // : DB의 테이블과 매칭이 되는 개념이다.
        // : 여기에서 Entity는 Member이며, @Entity를 통해서 DB의 테이블에 있는 컬럼과 매칭되도록 만들었다.
        // : 기본적으로 JPA는 모든 필드를 불러오도록 구현되어 있다.
        // : 참고 - https://perfectacle.github.io/2018/01/14/jpa-entity-manager-factory/

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); // (****)

        // 2. EntityManager
        // : Entity를 관리하는 역할을 수행하는 클래스이다.
        // : EntityManager 내부에 영속성 컨텍스트( Persistence Context )라는 것을 두어 관리한다.
        // : EntityManager는 스레드 간에서 공유되면 안된다.

        // 3. Persistence Context ( 영속성 컨텍스트 )
        // : 프로그램이 종료되기 전까지 엔티티를 영구히 저장하는 환경

        // 4. EntityManagerFactory
        // : EntityManager를 생산하는 찍어내는 공장
        // : DB에서 하나만 생성이 된다. ( 하나만 생성해서 애플리케이션 전체에서 공유 )

        EntityManager manager = emf.createEntityManager(); // (****)

        // + 트랜잭션 생성 (****)
        EntityTransaction tx = manager.getTransaction();
        tx.begin();

        try{

            Member member = new Member();

            member.setId(4L);
            member.setName("HelloD");

            // + 수정할 경우
            // Member find = manager.find(Member.class, 1L); ( pk가 1L인 멤버를 찾아오게 된다. / 조회 )
            // + 삭제할 경우
            // manager.remove(Member.class, 1L);
            // + JPA를 통해 엔티티를 가져올 경우에는 업데이트 쿼리를 생성하기에 따로 .persist를 하지 않아도 된다.

            // + JPA의 모든 데이터 변경은 트랜잭션 안에서 실행된다.

            // List<Member> result = manager.createQuery("select m from Member as m", Member.class).getResultList();

            // 5. JPQL
            // : JPA를 사용하면 엔티티 객체를 중심으로 개발하게 된다.
            // : 그렇게 되면 검색하는 쿼리에서 문제가 날 수 있는데,
            // : 이를 JPQL을 사용하면 검색을 할 때에도 테이블이 아닌 엔티티 객체를 대상으로 검색한다.
            // : JPA는 SQL을 추상화한 JPQL이라는 객체 지향 쿼리 언어를 제공한다.
            // : SQL과 문법과 유사하며, SELECT / FROM / WHERE / GROUP BY / HAVING / JOIN을 지원한다.
            // : JPQL은 엔티티 객체를 대상으로 쿼리를 생산한다.
            // : 반면 SQL은 데이터 베이스 테이블을 대상으로 쿼리를 만든다.

            manager.persist(member);
            // + .persist : 엔티티에 영구히 저장

            // + 정상적으로 작동을 할 경우
            tx.commit();

        } catch (Exception e){

            // + 예외가 발생할 경우에는 rollback을 실행한다.
            tx.rollback();

        } finally {
            manager.close();
        } // try - catch - finally

        emf.close();

    } // main

} // JpaMain

 

5. Member 클래스 ( Entity )

 

더보기
package hello.jpa;

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

@Entity
@Table(name = "MEMBER")
// + @Table의 name 속성을 통해 DB 테이블을 지정할 수 있다.
// + 지정하지 않을 경우 클래스의 이름과 같은 테이블에 저장하려고 한다.
public class Member {

    @Id
    private Long id;
    private String name;

    public Long getId() {
        return id;
    } // getter

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

    public String getName() {
        return name;
    } // getter

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

} // end class

 

 

 

728x90
댓글
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
최근에 올라온 글
Total
Today
Yesterday
공지사항