BackEnd/ORM(JPA)

JPA 구동방식 및 CRUD

JPA 구동방식

회원 Entity를 활용한 CRUD

더보기

회원 Entity 생성

package hellojpa;

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

@Entity
public class Member {
    @Id
    private Long id;
    private String name;
    //Getter, Setter …

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

 

 회원 CRUD

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{
            Long id = 1L;
            Member member = new Member();
            member.setId(id);
            member.setName("지한");

            // 등록
            em.persist(member);

            // 수정
            member.setName("수정");

            // 한 건 조회
            Member findMember = em.find(Member.class, id);
            System.out.println("findMember = " + findMember.getName());

            // 목록 조회
            List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
            System.out.println("members.size" + members.size());

            // 삭제
            em.remove(member);

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

        emf.close();
    }
}

 

 

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

 

JPQL 소개

더보기

가장 단순한 조회 방법
EntityManager.find()객체 그래프 탐색(a.getB().getC())
나이가 18살 이상인 회원을 모두 검색하고 싶다면??

 

JPQL활용 코드

...
        try{
//            Member findMember = em.find(Member.class, 1L);
            List<Member> result = em.createQuery("select m from Member as m where m.age >= 18")
                    .setFirstResult(5)
                    .setMaxResults(10)
                    .getResultList();
            // 원하는 Query생성하여 실행
            // Member 객체를 사용함

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

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


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

문제는 검색 쿼리이다

 

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

 

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

 

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

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


SQL과 문법이 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원

JPQL은 엔티티 객체를 대상으로 쿼리

SQL은 데이터베이스 테이블을 대상으로 쿼리

테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리


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

JPQL을 한마디로 정의하면 객체 지향 SQL

JPQL은 뒤에서 아주 자세히 다룸

 

'BackEnd > ORM(JPA)' 카테고리의 다른 글

엔티티 매핑  (0) 2022.12.29
준영속 상태 (Detached)  (0) 2022.12.29
플러시 (Flush)  (0) 2022.12.29
영속성 컨텍스트 (persistence Context)  (0) 2022.12.28
JPA 개요  (0) 2022.12.28