ORM
- Objrvy-trlational mapping (객체 관계 매핑)
- 관계형 데이터베이스와 객체지향 언어를 프레임워크가 중간에서 매핑함.
- 애플리케이션과 JDBC 사이에서 JPA가 ORM프레임워크로서 매핑 역할을 함
JPA의 동작위치

객체 지향 언어와 관계형데이터베이스(RDB)의 매핑
Team 이라는 객체과 Member라는 객체가 있고 Team은 Member의 부모라고 가정해보자, 이때 관계형 데이터에서는 Member라는 객체에 Team에 대한 정보를 참조하기 위해 teamId라던가 FK 값으로 참조값을 DB에 저장하게 될것이다.
이때 객체 지향 언어인 자바에서는 Member를 조회해 올때 DAO를 통해 해당 Member와 관련된 Team에 대한 객체도 함께 넣어 주어야 할 것이다. Team과 Member와 같이 단 2개의 객체만 있는것이 아닌 여러게 연관관계가 존재한다면 Member 객체를 찾아올때 관련된 모든 객체를 DAO에 찾아와야 할 것이다. 이러한 작업을 JPA가 매핑을 통해 해결해준다.
저장을 예로들면 Team이라는 부모를 갖는 Member 라는 객체가 있었을 때 관계형 DB에 저장할 시
Insert문을 통해 Team과 Member에 모두 저장해 주어야하지만, JPA를 사용한다면 Team 과 Member에 같이 저장해 준다.
find에서도 Member객체를 가지고 올때 JPA가 중간에서 DB간 매핑하여 Team에 대한 정보를 찾아올 수 있다.
DAO를 통해 객체를 가져오게 된다면 DAO를 통해 가져온 객체의 정보로 새로운 객체를 만들어 반환한다. 따라서 같은 정보를 조회하더라도 같은 객체로 == 비교 할 수 없다.
하지만 JAP는 자바 컬랙션을 사용하여 같은 트랜잭션 커밋 내에서 List에 존재하는 객체를 참조값으로 반환함으로 == 비교가 성립된다.
DAO 케이스
String memberId = "100";
Member member1 = memberDAO.getMember(memberId);
Member member2 = memberDAO.getMember(memberId);
member1!=member2
자바 컬랙션
String memberId = "100";
Member member1 = list.get(memberId);
Member member2 = list.get(memberId);
member1==member2
JPA
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId);
Member member2 = jpa.find(Member.class, memberId);
member1 == member2;
지연 로딩과 즉시로딩
- 지연로딩:객체가 실제 사용할때 로딩
- 즉시로딩: Join SQL로 객체가 조회될때 한번에 연괸된 객체까지 조회
예시)
Member member = memberDAO.find(memberId);
Team team = member.getTeam();
String teamName = team.getName();
만일 위와 같은 Java코드가 있다고 가정한다면 지연로딩과 즉시로딩으로 설정시 날려지는 쿼리문은 각각 아래와 같다.
지연로딩 시 SQL문
SELECT *
FROM MEMBER
SELECT *
FROM TEAM
즉시로딩시 SQL문
SELECT M.*, T.*
FROM MEMBER
JOIN TEAM …
'JPA' 카테고리의 다른 글
| @MappedSuperclass (0) | 2022.12.20 |
|---|---|
| 상속관계 매핑 (0) | 2022.12.20 |
| 연관관계 매핑 (0) | 2022.12.20 |
| 연관관계 매핑 기초 (0) | 2022.12.19 |
| 영속성과 엔티티 매핑 (1) | 2022.12.16 |