객체는 객체대로 설계
관계형 데이터베이스는 관계형 데이터베이스대로 설계
ORM 프레임워크가 중간에서 매핑
대중적인 언어에는 대부분 ORM 기술이 존재
class MemberService{
public void precess(){
Member member=memberDAO.find(memberId);
member.getTeam();//???
member.getOrder().getDelivery();// ???
}
}
// . 을 이용해 탐색이 되는지 코드를 뜯어봐야 알 수 있다.
객체를 테이블에 맞춰서 모델링하게된다.
객체답게 모델링 할수록 매핑 작업만 늘어난다. 객체를 자바 컬렉션에 저장하듯이 DB에 저장할 수는 없을까? 라는 의문을 해소해주는 것이 JPA ORM이다.
public class Member{
private String memberId;
private String name;
private String tel;// 추가되는 항목
}
Insert into member(member_ID, NAME,TEL) values // tel 추가
select member_ID, NAME,TEL from member //tel 추가
update member set ... tel=? //tel추가
public class Member{
private String memberId;
private String name;
private String tel;// 추가되는 항목
}
JPA를 사용할 경우 필드만 추가하면 된다.
String memberId="111"
Member member1=jpa.find(Member.class,memberId);
Member member2=jpa.find(Member.class,memberId);
member1==member2
동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.
String memberId="111"
Member member1=jpa.find(Member.class,memberId);// sql
Member member2=jpa.find(Member.class,memberId);// 캐시
member1==member2//true
transaction.begin();
jpa.save(member1);
jpa.save(member2);
jpa.save(member3);
//insert sql을 데이터베이스에 보내지 않는다.
transaction.commit();
//커밋하는 순간 데이터베이스에 insert sql을 모아서 보낸다.
transaction.begin();
jpa.UPDATE(member1);
jpa.DELETE(member2);
비지니스_로직_실행();
//비지니스 로직 수행동안 db로우 락이 걸리지 않는다.
transaction.commit();
//커밋하는 순간 데이터베이스에 UPDATE,DELETE sql을 모아서 보낸다.
//지연 로딩
Member member=memberDAO.find(memberId); // select * from member
Team team=member.getTeam();
String teamName=team.getName(); // select * from team
//즉시 로딩
Member member=memberDAO.find(memberId); // select M.*,T.* from member join team ...
Team team=member.getTeam();
String teamName=team.getName();
연관된 객체를 가끔씩만 불러올때는 지연 로딩이 좋다.
연관된 객체를 항상 계속 사용해야 할 경우 즉시로딩으로 한번에 가져오는게 성능상 더 좋다.