728x90
JPA 구동 방식
코드의 전체적인 흐름이기도 함!!!!!!!!
persistence 클래스가 persistence.xml 설정정보를 읽어서
EntityManagerFactory 클래스를 생성
필요할 때마다 EntityManager를 찍어내서 돌림
객체와 테이블을 생성하고 매핑하기
@Entity @Id @Table @Column
실습
//createEntityManagerFactory 매개변수 : persistence-unit의 name 기재
// persistence.xml에 적어놓은 persistence-unit 정보를 불러옴
// DB와 연결할 수 있는 상태로 만들어줌
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
//createEntityManager 꺼내주기
EntityManager em = emf.createEntityManager();
//실제 동작하는 코드 작성
//실행 코드가 끝나면 닫아줘야함
em.close();
//어플리케이션이 끝나면 닫아줘야함
emf.close();
* 데이터를 변경하는 모든 작업은 꼭 트랜잭션 안에서만 작업해야함
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 사용해야함
실습
- Member 테이블 전체 조회
주석 부분은 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 |