02. JPA 시작하기
ex1-hello-jpa 프로젝트 코드 에서 실습함
프로젝트 생성#
H2 DB 설치와 실행#
- h2database.com
- Mac이라 All Platform으로 다운
 - download 경로 풀어놓음 (까먹을까봐 ㅎㅎ)
 - 다운로드 경로에 
./bin/h2.sh실행 - Server 모드로 실행
 
 - 로컬 실습용 (테스트용) DB
 - 가벼움
 - 웹 콘솔 환경 지원
 - SQL 지원
 - 시퀀스, AUTO INCREMENT 기능 지원
 
프로젝트 생성#
- Java 8 이상
 - Maven 설정
- groupId: jpa-basic
 - artifactId: ex1-hello-jpa
 - version: 1.0.0
 
 
의존성#
pom.xml 에 dependencies 추가
persistence.xml 추가#
- JPA 설정 파일
 main/resources/META-INF/persistence.xml경로로 세팅- persistence-unit name으로 DB 이름 지정
 
persistence.xml
DB 방언#
- JPA는 특정 DB 종속 X
 - DB 벤더마다 다른 표현들을 방언 
dialect라 표현- 페이징: MySQL은 LIMIT, Oracle은 ROWNUM
 
 - mysql, oracle, h2 등 각각 dialect 가 있음
 - javax 로 시작하는 property
- hibernate에 의존적이지 않음
 
 - hibernate.dialect
- hibernate의 전용 옵션
 
 
앱 개발#
JPA 구동 방식#
Persistence가META-INF/persistence.xml의 설정정보 조회Persistence가EntityManagerFactory를 생성- 팩토리가 
EntityManager를 필요할때마다 찍어냄 
실습#
- option command v -> 변수 자동완성
 - h2 콘솔 시작 시, jdbc url은 persistence.xml 에서 설정한 값과 똑같이 설정
 
JPA 활용한 Member Entity 실습#
- JPA는 transaction 단위가 중요
 
transaction 지정 시, console에 쿼리가 찍힘
- JPA가 맵핑 정보를 보고 쿼리를 만들어 줌
 
주의 사항#
- EntityManagerFactory 는 앱이 실행되는 시점에서 하나만 만들어져야 함
 - EntityManager 는 여러 스레드간 공유 X (사용하고 버려야 함)
- 계속 요청마다 썼다가 지웠다하는 역할 (DB 커넥션을 쓰고 바로 돌려주듯이)
 
 JPA의 모든 데이터 변경은 트랙잭션 안에서 실행
JPQL 소개#
객체 지향 SQL, 뒤에서 상세히 다루게 됨
- 현업에서의 고민
- 필요한건 조인도 해야되고... 원하는 데이터만... 통계성 쿼리도...
 - JPA에선 JPQL로 도와줌
 
 - JPA를 사용하면 엔터티 객체 중심으로 개발 됨
 - 문제는 검색쿼리... 조인 남발..
 - 검색을 할 때도 테이블이 아닌 
엔터티 객체를 대상으로 검색 - 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
 - 앱이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요
 
SQL과 차이#
- JPQL은 엔터티 객체 중심의 쿼리
 - SQL은 DB의 테이블 대상임
 
장점#
- dialect를 바꿔도 JPQL을 바꾸지 안아도 됨
 - 객체 지향 개념을 쿼리에 적용할 수 있음