JPA(5)

2023. 9. 12. 15:27Lecture/JPA

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

MEMBER TABLE 생성

id 컬럼과 name 컬럼을 생성해주고 id는 primary key(pk)로 지정한다.

 

MemberVO 생성

package hellojpa.VO;

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

@Entity
@Table(name = "MEMBER")
public class Member {
    @Id
    private Long Id;

    @Column(name = "name")
    private String name;

    public Long getId() {
        return Id;
    }

    public void setId(Long id) {
        Id = id;
    }

    public String getName() {
        return name;
    }

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

@Entity - 테이블과 매핑할 클래스에 사용하여 JPA가 해당 클래스를 관리하게한다.

@Table - 테이블명과 객체명이 서로 다른 경우 테이블 이름을 지정해 매핑할 수 있다.

@Column - 컬럼명과 필드명이 서로 다른 경우 컬럼명을 지정해 매핑할 수 있다.

@Id - 테이블의 기본키가 지정된 컬럼과 매핑된 필드에 사용한다.

JPA 기본 문법

1. 데이터 Insert

package hellojpa;

import hellojpa.VO.Member;

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

public class Main {
    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();
        System.out.println("Hello world!");
    }
}

 

EntityManagerFactory는 절대 공유해선 안되고 상황에 따라 만들어야한다. - 동시에 접근이 가능하게하면 하나를 수정하고 있을 때 다른 사용자도 수정할 수 있기 때문. 사용이 끝나면 close()로 만납해야한다.

 

EntityManager는 Entity를 관리하는 역할이다. 엔티티 매니저 내부에 영속성 컨텍스트를 만들어서 관리한다. 사용이 끝나면 close()로 반납해야한다.

 

EntityTransaction은 하나의 트랜잭션을 생성한다. tx.begin()을 통해 트랜잭션 시작을 알리고 로직을 수행 후 commit 또는 rollback을 해주어야한다.

 

2.데이터 Update

package hellojpa;

import hellojpa.VO.Member;

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

public class Main {
    public static void main(String[] args) {

        // 서비스에 단 한번
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();

        tx.begin();
        try {
            Member member = em.find(Member.class, 1L);
            member.setName("HelloB");
            tx.commit();
        }catch (Exception e){
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();
    }
}

다른 점은 위에서 설명한 것과 같고 try-catch-finally 구문을 구면 em.find로 해당 객체를 조회한 후 객체의 필드를 변경하고 commit하면 update 구문이 실행된다.

 

3. 데이터 Delete

package hellojpa;

import hellojpa.VO.Member;

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

public class Main {
    public static void main(String[] args) {

        // 서비스에 단 한번
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();

        tx.begin();
        try {
            Member member = em.find(Member.class, 1L);
            em.remove(member);
        }catch (Exception e){
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();
    }
}

em.find로 해당 데이터를 조회 한 후 em.remove()를 실행하면 데이터가 삭제된다.

 

JPQL

- JPA를 사용하면 엔티티 객체를 중심으로 개발

- 문제는 검색 쿼리

- 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색

- 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능

- 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요

package hellojpa;

import hellojpa.VO.Member;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;

public class Main {
    public static void main(String[] args) {

        // 서비스에 단 한번
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();

        tx.begin();
        try {
            List<Member> result = em.createQuery("select m from Member as m where name = 'HelloB'", Member.class)
                    .getResultList();
            System.out.println(result.get(0).getName());
            tx.commit();
        }catch (Exception e){
            tx.rollback();
        } finally {
            em.close();
        }

        emf.close();
    }
}

'Lecture > JPA' 카테고리의 다른 글

JPA(7) - 영속성 컨텍스트2  (0) 2023.09.13
JPA(6) - 영속성 컨텍스트  (0) 2023.09.12
JPA(4)  (0) 2023.09.12
JPA(3)  (0) 2023.09.11
JPA(2)  (0) 2023.09.08