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();
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();
꼭 짚고 넘어가기!!
- 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();
기억하자 JPQL
- JPA 를 사용하면 엔티티 객체를 중심으로 개발 => SQL 을 추상화한 JPQL 이라는 객체 지향 쿼리 언어 제공
- 여기서 문제는 검색 쿼리 => 특히 서브 쿼리를 사용하는 쿼리나 join 을 사용하는 쿼리!! => 검색할때도 테이블이 아닌 엔티티 객체를 대상으로 검색
- 단, 당연하게도 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
- 요약하자면 애플리케이션에서 필요한 데이터만 DB에서 불러오기 위해서 결국 검색 조건이 포함된 SQL 이 필요하게 되고 때문에 탄생한 것이 JPQL
- 기본적인 문법 select, from, where, group by, having, join 등 기본 sql 과 유사
- JPQL 은 엔티티 객체를 대상으로 쿼리를 사용하며, SQL 은 DB 테이블을 대상으로 쿼리 사용
'Java - SpringJPA' 카테고리의 다른 글
Spring JPA (6) - JPA 개념 잡기 : 엔티티 연관관계 매핑 1:N, N:1, N:M, 1:1 (1) | 2022.10.03 |
---|---|
Spring JPA (5) - JPA 개념 잡기 : 단방향 연관관계, 양방향 연관관계, 연관관계의 주인 (0) | 2022.10.03 |
Spring JPA (4) - JPA 개념 잡기 : 객체-테이블 매핑, 필드와 칼럼, 기본키 매핑 (0) | 2022.10.02 |
Spring JPA (3) - JPA 개념 잡기 : 영속성 컨텍스트, 플러시, 준영속 상태 (0) | 2022.10.01 |
Spring JPA (1) - JPA 기본 & JPA 프로젝트 생성 (0) | 2022.09.28 |
댓글