개체는 데이터베이스의 테이블이라고 보아도 무방하다. 데이터베이스에선 외래키가 존재하듯, 개체들이 서로 공유하는 필드를 Spring에선 JoinColumn이라고 본다.
관계형 데이터 모델이 제시하는 개체 간 연관관계는 1:1, 1:M, N:M등이 있는데, 여기서 다대다 연관관계는 비즈니스 로직상 구현이 어렵다. 그렇기에 중간에 거쳐가는 개체를 하나 만들어서 일대다 일대다인 관계 2개로 나누어 로직을 구성한다
양방향 연관관계는 연관관계의 주인이 필요하다.
Member <- ManyToOne -> Team
위와 같은 관계에서는 Member가 연관관계의 주인 annotation을 달게된다.
공통 필드를 가지는 개체들이 있을 수 있다.
Book(id, name, price, ...)
Albom(id, name, price, ...)
id, name, price필드가 중복되며, 이 필드들은 새로운 Product라는 부모 개체로 선언하는 것이 타당하겠다.
이 상속관계를 매핑하는 법도 여러가지 있는데, Join전략을 추천한다. Join 전략이 쿼리가 다소 느릴지언정 무결성 보장이 쉽기 때문이
다.
위에서 사용했던 Member와 Team 개체를 예시로 들어보겠다.
select member_id from member; 이 SQL은 Team을 조회하지 않지만, em.find와 같은 명령으로 SQL을 보내면 N+1문제를 일으킨다. 말 그대로 1개의 SQL을 보내려고 했지만, N개의 SQL이 함께 딸려서 전송되는 것이다. 이 때 사용되는 것이 지연 로딩과 프록시 객체 타입이다. 지연 로딩을 사용함으로서 실제로 조회되지 않는 개체의 클래스 타입을 프록시 타입으로 반환시켜 SQL의 효율을 높인 것이다.