연관관계가 필요한 이유
-객체를 테이블에 맞추어 데이터 중심으로 모델링하면, 협력관계를 만들수 없음
-테이블은 외래키로 JOIN을 사용해서 연관된 테이블을 찾는데 객체는 참조를 사용해서 연관관계를 찾음
-단방향 연관관계 지향(가급적 좋음)
-객체 지향 모델링(연관관계 매핑(@JoinColumn))
양방향 연관관계(반대 방향으로 객체 그래프 탐색)
-테이블은 외래키로 다 조인할수 있음
-객체는 둘다 클래스 속성으로 가지고 있어야함
연관관계의 주인과 mappedBy
-객체와 테이블의 연관관계 차이
-객체는 단반향이 두개
-테이블은 양뱡향 한개(외래키 조인)
-둘중 하나로 외래 키를 관리해야함(외래키는 멤버객체를보고 바꿔야하나 팀 객체를 보고 바꿔야하나)
연관관계의 주인(Owner)
-객체의 두관계중 하나를 연관관계의 주인으로 지정
-연관관계 주인만이 외래 키를 관리(등록,수정)
-주인이 아닌 아닌쪽은 읽기만 가능
-주인은 mappedBy 속성 사용 X
-주인이 아니면 mappedBy 속성으로 주인 지정
누구를 주인으로?
-외래 키가 있는곳을 주인으로 정할것: 관례(그래야 헷갈리지 않음), 다대일(N:1)이면 다(N)에 포커스
-비지니스적으로 중요한것과는 별개고 테이블로 따지는것임(e.g. 바퀴(N)와 자동차(1)면 바퀴가 주인)
-양방향 매핑시 가장 많이 하는 실수: 연관관계 주인객체에 값을 입력하지 않고 읽기전용 객체(mappedBy)에 넣음
-객체지향적으로 그냥 양쪽에 다 넣는것이 좋음
-연관관계 편의 메서드를 만드는게 좋음(세터같은 메서드에서 해결): 주의, 기준하나를 선택
-양방향 매핑시에 무한루프 조심(컨트롤러에서 절대 엔티티 반환하지 말것)
-toString(),lombok 등
정리
-단방향 매핑만으로도 이미 연관관계 매핑은 완료(설계시 양방향 지양)
-양방향 매핑은 반대방향으로 조회기능만이 추가된것뿐
-JPQL에서 반대방향으로 탐색할 일이 많긴함
-단방향 매핑을 잘하고 양방향은 필요할때 추가하는 식(어차피 테이블에 영향을 주지않음)