The problem of data navigation
참조 : Java Persistence With Hibernate
객체에서는 . 을 사용해서 다른 객체로 이동하곤 합니다. 하지만 SQL db에서 데이타를 이런식으로 가져오는 것은 효율적이지 않습니다.
db의 성능을 높이는 방법으로 SQL 쿼리 숫자를 줄이는 겁니다. 그래서 연관된 table 간의 join을 이용해서 data를 가져 옵니다.
만약에 Member에 있는 데이타만 관심이 있다면 Select * From member; 이렇게 하면 되겠지만 Member와 Messenger의 데이터에 모두 관심이 있다면 outter join을 이용해서 member를 가져와 두면 나중에 messenger의 데이터를 위해 쿼리를 날릴 필요가 없습니다.
하지만 Object persistence의 경우 객체에 처음 접근 할 때 fetching이라는 기능으로 연관된 객체를 붙여오는 기능을 제공하는데 이것은 각 노드 또는 콜렉션 마다 하나의 쿼리문을 실행하도록 요구하기 때문에 비효율적일 수 있습니다. 이것을 바로 무서운 n+1 selects problem 이라고 한다는 군요.
이 문제에 관해서는 13, 14, 15장에서 Hibernate가 제공해 주는 효율적이면서도 투명한 fetching 기능을 공부할 수 있을 것 같습니다.