JPA

JPA) 어플리케이션 개발

na_o 2022. 1. 30. 05:21
728x90

JPA 구동 방식

코드의 전체적인 흐름이기도 함!!!!!!!!

persistence 클래스가 persistence.xml 설정정보를 읽어서 

EntityManagerFactory 클래스를 생성

필요할 때마다 EntityManager를 찍어내서 돌림

 

 

 

객체와 테이블을 생성하고 매핑하기

@Entity        @Id        @Table        @Column

 

 

Member 엔티티 추가 · NayoungBae/jpa-basic@cca452e

Permalink This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. Browse files Member 엔티티 추가 Loading branch information Showing 1 changed file with 31 additions and 0 deletions. +31 −0 s

github.com

 

 

실습

//createEntityManagerFactory 매개변수 : persistence-unit의 name 기재
// persistence.xml에 적어놓은 persistence-unit 정보를 불러옴
// DB와 연결할 수 있는 상태로 만들어줌
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

//createEntityManager 꺼내주기
EntityManager em = emf.createEntityManager();


//실제 동작하는 코드 작성


//실행 코드가 끝나면 닫아줘야함
em.close();

//어플리케이션이 끝나면 닫아줘야함
emf.close();

 

 

 

Member 엔티티 데이터 저장 - 예외처리 · NayoungBae/jpa-basic@a09638b

Permalink This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. Browse files Member 엔티티 데이터 저장 - 예외처리 Loading branch information Showing 1 changed file with 11 additions an

github.com

 

Member 데이터 수정 · NayoungBae/jpa-basic@d81d941

Permalink This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. Browse files Member 데이터 수정 Loading branch information Showing 1 changed file with 2 additions and 2 deletions. +2 −2 src

github.com

 

Member 데이터 삭제 · NayoungBae/jpa-basic@479010c

Permalink This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. Browse files Member 데이터 삭제 Loading branch information Showing 1 changed file with 2 additions and 3 deletions. +2 −3 src

github.com

 

Member 데이터 검색 · NayoungBae/jpa-basic@395d918

Permalink This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. Browse files Member 데이터 검색 Loading branch information Showing 1 changed file with 3 additions and 5 deletions. +3 −5 src

github.com

 

* 데이터를 변경하는 모든 작업은  트랜잭션 안에서만 작업해야함

EntityTransaction tx = EntityManager.getTransaction();
//트랜잭션 시작
tx.begin();
//커밋
tx.commit();
//롤백
tx.rollback();
//작업 후 마무리로 닫아야함
tx.close();

 

* DB 작업 도중 에러가 나서 중단되는 경우를 대비해 try-catch 사용

try { 코드 } 
catch(...) { 롤백 }
finally { 커밋 }

 

 

 

주의

  • 엔티티 매니저 팩토리는 어플리케이션 로딩 시점에 하나만 생성해서 어플리케이션 전체에서 공유
  • 엔티티 매니저는 쓰레드간에 공유하지 않음(한번 사용하고 버려야 함)
    (고객의 요청이 올 때마다 매번 생성해서 사용하고 버려야함)
  • JPA의 모든 데이터 변경은 트랜잭션 안에서 실행

* "DB에서 작업할 때 트랜잭션 쓴 적이 없는뎁쇼?"

   -> 내부적으로 트랜잭션이 알아서 처리하고 있던 것임

 

 

 

JPQL 소개

  • 가장 단순한 조회 방법
    • EntityManager.find()
    • 객체 그래프 탐색(a.getB().getC())
  • 그러면 나이가 18살 이상인 회원을 모두 검색하고 싶을 때는? -> 이럴 때 JPQL 사용해야함

 

 

 

실습

 

JPQL 사용하여 Member 테이블 전체 조회 · NayoungBae/jpa-basic@28e00f1

Permalink This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository. Browse files JPQL 사용하여 Member 테이블 전체 조회 Loading branch information Showing 1 changed file with 16 additions an

github.com

 

주석 부분은 JPQL, 주석이 아닌 부분은 실제 실행된 MySQL 쿼리

JPQL은 객체 중심으로 조회, SQL은 테이블 중심으로 조회

 

 

 

JPQL

  • JPA를 사용하면 엔티티 객체를 중심으로 개발
  • 문제는 검색 쿼리! JOIN할 때는? 상위 10% 회원을 검색하라고 할 때는? 어쩔?
  • 검색을 할때도 테이블이 아닌 엔티티 객체를 대상으로 검색
    (그래서 엔티티 대상으로 쿼리를 짤 수 있는 문법이 있는 것임)
  • 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능하기 때문
  • 어플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요함
    (RDB 테이블 대상으로 쿼리를 날리면 DB에 종속적으로 설계가 되어버림. 그래서 객체 중심인 JPQL이 제공)
  • JPA는 SQL을 추상화한 JPQL이라는 객체지향 쿼리 언어 제공
  • SQL과 문법 유사, SELECT, FROM, WHERE, GROUP BY, HAVING, JOIN 지원
  • JPQL은 엔티티 객체를 대상으로 쿼리
  • SQL은 데이터베이스 테이블을 대상으로 쿼리
  • 테이블이 아닌 객체를 대상으로 검색하는 객체 지향 쿼리
  • SQL을 추상화해서 특정 데이터베이스 SQL에 의존하지 않음
  • JPQL을 한 마디로 정의하면 객체지향 SQL

'JPA' 카테고리의 다른 글

JPA) 프로젝트 생성  (0) 2022.01.29
JPA) JPA 소개  (0) 2022.01.21
JPA) SQL 중심적인 개발의 문제점  (0) 2022.01.20