참고
과거에도 ORM기술은 있었다. 바로 EJB라는 것인데, 문제점은 너무 아마추어적이었다.
인터페이스 구현도 많고 느리고 기본동작에도 오류가 많았었다. 그래서 어느 한 SI 개발자가
화가나서 만든 오픈소스가 하이버네이트고 이 하이버네이트를 기반으로 그대로 받아들여서 만든 자바표준이 JPA다.
또한 EJB에 이상한 컨테이너도 있었는데 너무 복잡하여 이것을 좀더 간편하게 오픈소스를 시킨 개발자가 있었는데 그 개발자 이름은 Spring의 창시자 로드존슨이고 그 컨테이너가 Spring이 되었다.
여담이지만, EJB덕분에 JPA와 Spring이 생겼으니 감사히 여겨야 할것 같다. :)
member.setTeam(team);
jpa.persist(member);
Member member = jpa.find(Member.class, memberId);
Team team = member.getTeam();
class MemberService {
...
public void process() {
Member member = memberDAO.find(memberId);
member.getTeam(); //자유로운 객체 그래프 탐색
member.getOrder().getDelivery();
}
}
String memberId = "100";
Member m1 = jpa.find(Member.class, memberId); //SQL
Member m2 = jpa.find(Member.class, memberId); //캐시
println(m1 == m2) //true
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transaction.commit(); // [트랜잭션] 커밋
transaction.begin(); // [트랜잭션] 시작
changeMember(memberA);
deleteMember(memberB);
비즈니스_로직_수행(); //비즈니스 로직 수행 동안 DB 로우 락이 걸리지 않는다.
//커밋하는 순간 데이터베이스에 UPDATE, DELETE SQL을 보낸다.
transaction.commit(); // [트랜잭션] 커밋
ORM은 객체와 RDB 두 기둥위에 있는 기술이다.
JPA를 쓰면 뭐가 편해지고 어떤 기능들이 있는지 많은 것을 느꼈다. 조금은 많은 양이여서
내용이 벅차긴 했지만 하나하나 다시 새긴다는 마음으로 공부를 해나가야겠다.