객체는 참조(주소값)을 이용해 관계를 맺고, 테이블은 외래 키를 사용해서 관계를 맺는다고 함
객체의 참조와 테이블의 외래 키를 매핑하는 것
ORM은 객체와 RDB 둘 다 중요하다고 함..
연관관계 매핑 관련 핵심 개념
방향성
단방향 / 양방향
다중성
ex) 회원:팀
주인
객체가 테이블처럼 양방향 연관관계가 되면, 연관관계의 주인을 정해야 한다고 함.
회원과 팀 예시
객체
member.team으로 team을 알 수 있지만 team은 member를 알 수 없음.
즉, 단방향임
테이블
외래 키로 조인하는 방식이라 member join team이나 team join member, 어떤 방향으로든 관계를 맺을 수 있음.
class Member{
...
@ManyToOne // 다중성 정보
@JoinColumn(name="TEAM_ID") // 외래 키 매핑
private Team team;
// 객체였다면 관계에 방향성이 생기는데 이렇게 테이블에서처럼 외래 키 정보를 이용하면
// 테이블에서처럼 JOIN 하듯이 방향성 문제는 사라지겠지
...
}
class Team{
...
// 양방향 매핑 사용하려면 추가해야 되는 설정.
// 다중성 정보. mappedBy 속성은 양방향 매핑일 때 사용.
// mappedBy 속성은 연관관계 주인이 아님을 설정..
// 반대편 매핑의 필드 이름을 설정해주면 된다고 함..
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
...
}
조회
수정
연관관계의 주인(owner)
양방향 연관관계는 단방향 연관관계 2개.
2개 중 어떤 관계가 외래 키를 관리하게 할 지 정해줘야 함.
그래서 연관관계의 주인 개념이 필요함!
즉, 외래 키 관리자를 선택하는 거라 생각하면 된다고 함!
그리고 테이블에 외래 키 가 있는 곳을 연관관계 주인으로 정하면 된다고 함..!
또 외래 키가 있는 테이블은 다대일 관계에서 '다' 쪽이라 보면 될 듯
JPA는 연관관계 엔티티에 대한 SQL을 처리할 때 외래 키를 이용하고,연관관계의 주인이 외래 키를 관리하니까
연관관계의 주인만 SQL을 자유롭게 생성할 수 있는 듯.
주인이 아닌쪽도 읽기는 가능하다고 함!
연관관계 주인만 DB에 영향을 미칠 수 있다고, 외래 키를 바꿀 수 있다고 생각하면 될 듯!
양방향 연관관계는 양쪽 방향 모두에 값을 입력해주는게 안전하다고 함
class Member{
private Team team;
public void setTeam(Team team){
this.team = team; // 꼭 필요!
team.getMembers().add(this); // 객체 관점에서 필요
}
...
}
객체 그래프 탐색이라는게 자주 쓰이나?
연관된 엔티티 삭제할 때 외래키 제약조건때문에 문제 발생하는거 맞나?
스프링 JPA에서는 발생안했던거 같은데.. 확인 필요
연관관계 주인이 아닌 쪽이 읽기는 가능한 이유는?