✍ORM은 객체와 RDB 두 기둥위에 있는 기술이다.
- JPA
Java Persistence API, 자바 진영의 표준 ORM
JPA는 인터페이스의 모음, JPA를 구현하는 대표적인 구현체로 Hibernate가 있다.
==>
SQL 중심적인 개발 -> 객체 중심의 개발, 생산성, 유지보수
- ORM
Object-relational mapping(객체 관계 매핑)
객체는 객체대로, 관계형 DB는 DB대로 설계
- DAO에서 Entity 객체를 보내면, JPA가 이를 분석하고 쿼리문을 생성해줌. 이후 JDBC API를 사용. => 패러다임 불일치 해결
- 패러다임 불일치 해결
- 상속 - 조회
- 연관관계, 객체 그래프 탐색
- 신뢰할 수 있는 엔티티, 계층
JPA 성능
1차 캐시와 동일성 보장 - 같은 트랜잭션 안에서 같은 엔티티를 반환 (단 아주 짧은 시간의 캐싱) => 약간의 조회성능 향상
지연 로딩 = 객체가 실제 사용될 때 로딩 (객체의 속성에 접근할 때)
즉시 로딩 = JOIN SQL로 한번에 연관된 객체까지 미리 조회 (연관된 테이블을 항상 같이 로딩하는 JPA 옵션이 있다.
🐱🐉🐱🐉🐱🐉
- 스프링 공식 사이트에서 사용할 스프링 부트 버전을 확인한 뒤, Reference Doc에서 라이브러리 버전을 찾아 맞춰준다.
https://spring.io/projects/spring-boot#learn
- persistence.xml 의 필수 속성
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
- JPA는 특정 데이터베이스에 종속되지 않는다.
- 각각의 DB가 제공하는 SQL문법, 함수는 조금씩 다르다. 특히 페이징.
- Dialect는 데이터베이스 각각의 방언들을 JPA가 매핑해주기 위한 추상화 개념.
- HIbernate는 40가지 이상의 데이터베이스 방언 지원.
- Maven JPA 설정
- pom.xml 의존성으로 hibernate-entitymanager에서 Hibernate 라이브러리, 인메모리 DB - H2 추가.
- --> JPA 설정 파일 - resource/META-INF/ 위치에 persistence.xml 으로 이름을 지정, 해당 파일에서 persistence-unit name="이름 지정" 태그 안에 properties 지정
- Gradle JPA 설정 (Spring boot)
build.gradle에 다음과 같은 의존성들을 등록
- org.springframework.boot:spring-boot-starter-data-jpa
- com.h2database:h2
✍JPA 구동
-> META-INF/persistence.xml 파일 -> 설정 정보 -> Persistence -> EntityManagerFatory(DB당 1개씩)에서 EntityManager 생성.
- DB작업을 할 때마다 EntityManger를 통해 작업
- JPA 모든 데이터 변경은 Transaction에서, 단순 데이터 조회 같은 경우는 예외
- commit 필수 / 작업 후, EntityManger, (WAS가 내려갈 때) Factory 닫아준다.
JPQL
- JPA는 SQL을 추상화한 JPQL 이라는 객체 지향 쿼리 언어 제공
- JPQL은 엔티티 객체를 대상으로, SQL은 테이블 대상으로 쿼리
본 게시글은 Inflearn 강의를 토대로 제작되었습니다.
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard