자바 표준 ORM 프로그래밍 기본편 강의를 듣고 정리한 내용입니다.
JPA
JPA는 Java Persistence API로, 자바 진영의 ORM 기술 표준이다.
ORM?
Object-relational mapping(객체 관계 매핑).
객체는 객체대로 설계하고, 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다.
ORM 프레임워크가 그 중간에서 매핑한다.
JPA는 애플리케이션과 JDBC 사이에서 동작한다.
JPA의 특징
- SQL 중심적인 개발에서 객체 중심으로 개발
- 생산성
저장 : jpa.persist(member)
조회 : Member member = jpa.find(memberId)
수정 : member.setName("변경할 이름")
삭제 : jpa.remove(member)
- 유지보수
기존에는 필드 변경 시 모든 SQL문을 수정해야 했지만, JPA는 필드만 추가하면 된다. SQL은 JPA가 처리한다.
- 객체 상속 관계 저장, 조회가 쉽다.
JPA의 성능 최적화 기능
- 1차 캐시와 동일성 보장
- 같은 트랜잭션 안에서는 같은 엔티티를 반환한다.
- DB Isolation Level
(격리 수준:트랜잭션에서 일관성이 없는 데이터를 허용하는 수준)
이 Read Commit 이어도 애플리케이션에서 Repeatable Read (트랜잭션이 범위 내에서 조회한 데이터의 내용이 항상 동일함)
를 보장한다.
- 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
- INSERT - 트랜잭션을 커밋할 때 까지 INSERT SQL을 모았다가,
transaction.commit
커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
- UPDATE - 트랜잭션 커밋 시 UPDATE, DELETE SQL을 실행하고 커밋한다.
지연 로딩과 즉시 로딩
- 지연 로딩 : 객체가 실제 사용될 때 로딩되는 것
- 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회하는 것
데이터베이스 방언
- JPA는 특정 데이터베이스에 종속되어 있지 않다.
- 각각의 데이터베이스가 제공하는 SQL문법과 함수는 조금씩 다르다.
- 가변 문자 : MySQL은 VARCHAR, Oracle은 VARCHAR2
- 문자열을 자르는 함수 : SQL표준은 SUBSTRING(), Oracle은 SUBSTR()
- 페이징 : MySQL은 LIMIT, Oracle은 ROWNUM
방언 : SQL표준을 지키지 않는 특정 데이터베이스만의 고유한 기능
데이터베이스 방언은 persistence.xml 파일에서 hibernate.dialect 속성에 지정한다.
- H2 : org.hibernate.dialect.H2Dialect
- Oracle 10g : org.hibernate.dialect.Orcale10Dialect
- MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
.. 등등 하이버네이트는 40가지 이상의 데이터베이스 방언을 지원한다.