ORM이란?
오브젝트와 RDB 사이에 존재하는 패러다임의 불일치 때문에 요구되는 불편한 작업들(sql 작성, 자바 객체에서의 상속 - DB에서는 외래키로, 다형성, 레퍼런스, 오브젝트 합성)을 대신 해결해준다. DB와 자바 객체의 자동 매핑, SQL자동생성 등이 존재.
JPA vs Mybatis
- mybatis
- 단
- SQL을 직접 작성하고, 결과를 따로 xml에 매핑해서 자바 객체에 담아주는 작업이 번거롭다.
JDBC -> Mybatis -> JPA
- mybatis
- 자바오브젝트만을 이용해 데이터 로직 작성 가능(이전에는 ResultSet으로 담아옴)
- JPA
- 데이터베이스의 오프젝트와 자바의 객체 간 매핑을 자동적으로 해줌
JPA
EntityManager
- DAO에서 주입받아서 사용해야 함
- @PersistenceContext EntityManager em;
- 트랜잭션마다 한번 만들어지고, 종료되면 함께 제거되어야하는데 어떻게 이 코드로? 이 코드는 마치 DAO에서 한번 주입받고 계속 쓰는 것 같음
- => 저 EntityManager은 실제 EntityManager이 아니라 프록시임. 각 트랜잭션마다 다른 EntityManager을 보장
바이트코드 향상 기법
- 바이트코드를 직접 조작해서 지연 로딩, 엔티티 값 변화 추적, 최적화와 그룹 페칭 등의 고급 기능 적용 가능
- 방법
- 바이트 코드를 빌드 중에 변경: JPA가 제공하는 바이트코드 컴파일러가 필요하다는 단점이 있음
- 바이트 코드를 로딩하면서 다이내믹하게 바이트코드를 변경해 기능 추가(로드타임 위빙)
- 지연로딩을 위해 프록시를 사용
Hibernate
- JPA의 구현체
- JPA의 EntityMangerFactory처럼 핵심 역할을 하는 SessionFactory존재
- TransactionManager존재