2024. 11. 6. 18:02ㆍJAVA/JPA
ORM - Object Rerational Mapping 객체 관계 매핑
객체는 객체대로 설계
관계형 db는 관계형 db대로 설계
객체와 db 테이블을 매핑해주는 기술. ORM 되시겠다.
JPA는 자바 진영 표준 ORM 기술이다.
JPA 동작 순서
1. DAO 요청 정보를 토대로 crud 등 sql 생성
2. JDBC 에 생성한 sql 전달
3. jdbc가 받아온 결과를 ResultSet 객체를 통해 매핑
4. 패러다임 불일치 해결
5. Entity 객체 생성 및 반환
JPA는 표준 명세(인터페이스)로
구현체로 하이버네이트, 이클립스링크, 데이터뉴클리우스 등이 있다.
거의 하이버네이트를 쓴다.
sql 을 자동으로 생성해주기 때문에 객체답게 개발할수록 늘어나는 sql 작업이 줄어든다.
그렇다. 객체답게 개발하기 쉽게 만들어주는 것이다. 너무 좋다.
기존 문제점
1. 상속문제
2. 연관관계 문제
3. 객체 그래프 탐색
4. 비교하기
상속문제
table 에 Super, sub 는 있지만, 상속관계는 없다. 이에 따라 , 상속관계에 있는 두 클래스의 정보를 db에 저장하기 위해서
상위, 하위를 위한 SQL 을 개발자가 두 번 작성해야 했으나, 이제 JPA가 매핑을 자동으로 작성 해준다.
Join 도 JPA가 알아서 작성 해준다. 편하다.
join이 너무 과도하게 발생하면 그것도 문제겠으나, 굉장히 많은 이점이 생긴다.
연관관계 문제
상속 문제와 비슷한 결이다.
db에 저장할 객체가 참조객체를 가지고 있으면, 해당 객체에 대한 정보도 db에 저장 해준다.
조회할 때에도 참조 객체의 정보를 가지고 와준다.
SQL을... 추가로 작성하지 않아도 된다.
??? 오.. 너무 좋은데
의문이 한층 깊어진다.
항상 모든 정보가 필요하지는 않은데?? 참조 객체 정보까지 전부 가져와? 항상?
이것도 해결해준다 JPA!!! 우야!!
JPA 성능 최적화
1. 1차 캐시와 동일성 보장
2. 트랜잭션을 지원하는 쓰기 지연
3. 지연 로딩
1차 캐시와 동일성 보장
같은 트랜잭션 안에서는 같은 엔티티를 반환한다.
DB Isolation Level 이 Read Commit 이어도 애플리케이션에서는 Repeatable Read 를 보장한다.
**1차 캐시
동일한 작업을 반복할 때마다, db를 사용하게 되면 너무 많은 소비가 발생한다. ( db 연결, sql 생성 등 등)
이런 작업 중복을 막기 위해 1차 캐시 기술이 도입된다.
sql 을 db에 한 번 날리면, 그 결과값을 1차 캐시에 저장.
동일한 요청이 오면 1차캐시에 저장된 데이터를 반환한다.
이를 통해 db 연결과 sql 날리기 등의 작업 등의 반복 작업을 줄일 수 있다.
동일 요청 시, 1차 캐시에 저장된 객체를 반환받게 되므로,
같은 트랜잭션 안이라면 계속해서 같은 엔티티를 반환 받는다.
트랜잭션을 지원하는 쓰기 지연 - insert
1. 트랜잭션을 커밋할 때까지 Insert SQL을 갖고 있는다.
2. JDBC BATCH SQL 기능을 사용해 한번에 SQL을 전송한다.
지연 로딩(Lazy), 즉시 로딩(Eager)
데이터를 조회할 때, 객체가 참조를 갖고 있으면 해당 객체도 JPA가 자동으로 조회해서 값을 넣어준다고 했다.
하지만, 항상 참조값까지 필요할 일이 없다면,
불필요한 sql, join 등이 발생한다.
이를 위해 참조 필드가 사용될 때만 sql이 발생하도록 로딩을 지연하는, 지연 로딩 기술이 제공된다.
항상 함께 조회해서 쓸것이라면 즉시 로딩을 써도 좋다.
지연 로딩
참조되는 객체가 실제로 사용될 때 db를 조회하게 되므로,
Select 쿼리가 2번 발생한다.
즉시 로딩
주체가 되는 객체를 조회할 때 db에서 참조 객체까지 모두 합쳐 가져오게 되므로
Join 이 발생한다.
참조
JPA - 인프런 - 김영한