Java - SpringJPA

Spring JPA (2) - Entity 객체, JPA 로 DB 연결하기, 기본 문법 사용하기

TerianP 2022. 9. 29.
728x90

1. Entity 객체 생성하기

- Entity 객체는 보통 DB 의 정보를 가져와서 저장하는 DTO 객체를 생각하면 편하다

- Entity 객체에는 꼭 @Entity 어노테이션을 붙이고, PrimaryKey 에 해당하는 변수에는 @Id 를 붙여야한다.

package com.use.jpabasic.basic;

import lombok.*;

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

/*
*  DB 테이블과 매핑하기 위한 클래스 ( 보통 DTO ) 에 @Entity 어노테이션을 붙인다
*  이때 PK 에 해당하는 변수에는 @Id 어노테이션을 붙여야 한다
*
* */
@Entity // DB 테이블과 매핑 후 데이터를 가져와 저장하기 위한 클래스에 붙이는 어노테이션
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Member {

    @Id // PK 변수
    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;
    }
}

2. JPA 로 DB 연결하기

- JPA 를 사용하기 위해서는 EntityManagerFactory 를 선언해야 한다.
- 이때 EntityManagerFactory 는 Persistence.createEntityManagerFactory 로 만들게 되고, 매개변수로 Persistence.xml 에 선언한 persistenceUnitName 를 사용한다

- 추가적으로 EntityManager 과 EntityTransaction 을 함께 만들어주어야 한다. 

- EntityManager 는 엔티티 객체에 대한 내용을 쿼리문을 만들어서 DB에 날려주는 객체이며, EntityTransaction 는 단어 그대로 EntityManager 가 쿼리문을 날린 후 해당 DB 의 변경 사항을 commit, rollback 을 하기 위한 객체이다.

/*
    JPA 를 사용하기 위해서는 EntityManagerFactory 를 선언해야 한다.
    이때 EntityManagerFactory 는 Persistence.createEntityManagerFactory 로 만들게 되고,
    매개변수로 Persistence.xml 에 선언한 persistenceUnitName 를 사용한다
 */

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

// 실제로 쿼리를 날리기 위해서는 EntityManager 을 만드는데 이때 emf.createEntityManager 을 사용한다.
EntityManager em = emf.createEntityManager();

// JPA 에서는 DB 와 관련되어지는 대다수의 작업에서 트랜잭션이 매우매우 중요하다
// 따라서 em 을 만든 이후 Transaction 도 같이 만들어서 실행 해주어야 한다.
EntityTransaction ex = em.getTransaction();

매개변수는 persistenceUnitName


3. JPA 사용해서 DB 만져보기

- CRUD 에 해당하는 가장 기본적인 쿼리는 내가 짤 필요없이 EntityManager 의 메서드를 통해 쉽게 사용 가능하다

- 각각에 해당하는 매서드는 아래 표 참고

CRUD 매서드 매개변수
Insert psersist 엔티티 객체
select find 엔티티 클래스, primaryKey
update set컬럼명 변경 내용
delete remove 엔티티 객체
 /*
     쿼리문도 간단한 단순 쿼리가 있는가하면 복잡한 서브 쿼리를 포함한 쿼리, join 쿼리 등등 여러가지가 있다
     이런 경우에 대해서 JPA 는 어떻게 대처할까? => 정답은 JPQL

     JPA 에서는 JPQL 을 사용해서 복잡한 쿼리문을 사용 할 수 있다.
     여기서 JPQL 과 일반 SQL 의 가장 큰 차이는 JPQL 은 객체(Entity) 를 대상으로 쿼리를 한다는 점!!!
     그래서 일반 쿼리와 약간 결이 다르다
*/
 try{
     // JPQL 사용시 createQuery 를 사용한다 => 매개변수로 jpql, Entity 클래스가 들어간다
     // jpql 에서 from 뒤에 오는게 table 이 아닌 "객체" 가 온다
     // .getResultList 를 사용해서 list 형태로 결과를 받아올 수 잇다
     List<Member> list = em.createQuery("select m from Member as m", Member.class)
             .getResultList();

     // 결과 표시
    list.forEach(m -> {
        System.out.println(m.toString());
     });

    /*
       어떻게 활용할까? => 대표적으로 페이징처리할때 사용 가능
    */
     List<Member> newList = em.createQuery("select m from Member as m", Member.class)
             .setFirstResult(5) // 시작 번호
             .setMaxResults(10) // 몇개나 출력할지
             .getResultList();
     newList.forEach(result ->{
        System.out.println(result.toString());
     });


 }catch(Exception e){
     ex.rollback();

 }finally {
     em.close();
 }

 emf.close();

 

insert
select
update


꼭 짚고 넘어가기!!
- EntityManagerFactory 엔티티 매니저 팩토리는 DB 당 하나만 오직 하나만 생성해서 애플리케이션 전체에서 공유해야한다
- EntityManager 앤티티 매니저는 쓰레드 간 공유 절대 X => 사용하고 버려야한다 close
- JPA 의 모든 데이터 변경은 트랜잭션 안에서 실행해야한다
- 당연하지만, 트랜잭션 커밋 안하면 DB 에 내용 반영 X

4. JPA 에서 사용하는 SQL => JPQL

            쿼리문도 간단한 단순 쿼리가 있는가하면 복잡한 서브 쿼리를 포함한 쿼리, join 쿼리 등등 여러가지가 있다
            이런 경우에 대해서 JPA 는 어떻게 대처할까? => 정답은 JPQL

 

 JPA 에서는 JPQL 을 사용해서 복잡한 쿼리문을 사용 할 수 있다.
여기서 JPQL 과 일반 SQL 의 가장 큰 차이는 JPQL 은 객체(Entity) 를 대상으로 쿼리를 한다는 점!!!
그래서 일반 쿼리와 약간 결이 다르다

JPQL 사용시 createQuery 를 사용한다 => 매개변수로 jpql, Entity 클래스가 들어간다
jpql 에서 from 뒤에 오는게 table 이 아닌 "객체" 가 온다
.getResultList 를 사용해서 list 형태로 결과를 받아올 수 잇다
  /*
     JPA 를 사용하기 위해서는 EntityManagerFactory 를 선언해야 한다.
     이때 EntityManagerFactory 는 Persistence.createEntityManagerFactory 로 만들게 되고,
     매개변수로 Persistence.xml 에 선언한 persistenceUnitName 를 사용한다
  */

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

 // 실제로 쿼리를 날리기 위해서는 EntityManager 을 만드는데 이때 emf.createEntityManager 을 사용한다.
 EntityManager em = emf.createEntityManager();

 // JPA 에서는 DB 와 관련되어지는 대다수의 작업에서 트랜잭션이 매우매우 중요하다
 // 따라서 em 을 만든 이후 Transaction 도 같이 만들어서 실행 해주어야 한다.
 EntityTransaction ex = em.getTransaction();

 /*
     쿼리문도 간단한 단순 쿼리가 있는가하면 복잡한 서브 쿼리를 포함한 쿼리, join 쿼리 등등 여러가지가 있다
     이런 경우에 대해서 JPA 는 어떻게 대처할까? => 정답은 JPQL

     JPA 에서는 JPQL 을 사용해서 복잡한 쿼리문을 사용 할 수 있다.
     여기서 JPQL 과 일반 SQL 의 가장 큰 차이는 JPQL 은 객체(Entity) 를 대상으로 쿼리를 한다는 점!!!
     그래서 일반 쿼리와 약간 결이 다르다
*/
 try{
     // JPQL 사용시 createQuery 를 사용한다 => 매개변수로 jpql, Entity 클래스가 들어간다
     // jpql 에서 from 뒤에 오는게 table 이 아닌 "객체" 가 온다
     // .getResultList 를 사용해서 list 형태로 결과를 받아올 수 잇다
     List<Member> list = em.createQuery("select m from Member as m", Member.class)
             .getResultList();

     // 결과 표시
    list.forEach(m -> {
        System.out.println(m.toString());
     });

    /*
       어떻게 활용할까? => 대표적으로 페이징처리할때 사용 가능
    */
     List<Member> newList = em.createQuery("select m from Member as m", Member.class)
             .setFirstResult(5) // 시작 번호
             .setMaxResults(10) // 몇개나 출력할지
             .getResultList();
     newList.forEach(result ->{
        System.out.println(result.toString());
     });


 }catch(Exception e){
     ex.rollback();

 }finally {
     em.close();
 }

 emf.close();

 

list 출력
페이징 처리 예시


기억하자 JPQL
- JPA 를 사용하면 엔티티 객체를 중심으로 개발 => SQL 을 추상화한 JPQL 이라는 객체 지향 쿼리 언어 제공
- 여기서 문제는 검색 쿼리 => 특히 서브 쿼리를 사용하는 쿼리나 join 을 사용하는 쿼리!! => 검색할때도 테이블이 아닌 엔티티 객체를 대상으로 검색
- 단, 당연하게도 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
- 요약하자면 애플리케이션에서 필요한 데이터만 DB에서 불러오기 위해서 결국 검색 조건이 포함된 SQL 이 필요하게 되고 때문에 탄생한 것이 JPQL
- 기본적인 문법 select, from, where, group by, having, join 등 기본 sql 과 유사
- JPQL 은 엔티티 객체를 대상으로 쿼리를 사용하며, SQL 은 DB 테이블을 대상으로 쿼리 사용

댓글