연관관계 매핑 시 고려사항
- 다중성
- @ManyToOne, @OneToMany, @OneToOne, @ManyToMany
- 데이터베이스의 관점에서 고민하면 쉽게 해결할 수 있다.
- 다대다는 쓰면 안좋다... 하나의 키로 양쪽 다 조회가 가능하니..
- 단방향, 양방향
- 테이블은 외래키 하나로 양쪽의 조인이 가능하다. 따라서 방향이라는 개념이 없다. 반면, 객체의 경우는 참조용 필드가 있는 쪽으로만 참조가 가능하고 이경우 단방향과 양방향의 개념이 생기게된다.
- 즉 객체와 테이블 사이의 괴리로인해 발생하는 문제. 양방향은 곧 단방향이 두개라는 뜻.
- 연관관계의 주인
- 두 테이블 중 외래키를 관리할 곳을 지정하고, 연관관계의 주인은 외래키를 관리하는 객체가 된다.
다대일 단방향 연관관계 [N:1]
- DB테이블 설계시 N쪽에 반드시 외래키가 들어간다.
- 멤버에서 팀으로만 조회하는 경우
- 외래키가 있는 테이블에 참조를 걸면된다.
- @ManyToOne
다대일 양방향 연관관계 [N:1]
- Team에 members필드가 추가되더라도 데이터베이스 설계에는 영향이 없다.
- Team에서 mappedby team의 속성을 지정해주자.
- @OneToMany(mappedBy="team")
일대다 단방향 연관관계 [1:N]
- Team에서 Member로만 조회하는 경우
- DB입장에서 잘못된 설계
- 외래키는 무조건 다쪽에 설정한다.
- 다만 객체의 연관관계는 1쪽에 설정된다.
- 때문에 쿼리가 여러번 나가게 되어 비효율적이다. 연관관계 관리를 위해 추가로 UPDATE SQL이 실행되기 때문
- @JoinColumn(name="TEAM_ID")
일대다 양방향 연관관계[1:N]
- 야매로 만들 수 있다. @JoinColumn(insertable = false, updatable = false)
- 읽기 전용 필드를 사용하여 양방향으로의 접근을 허용하는 방법
일대일 관계 [1:1]
- 주 테이블이나 대상 테이블 중에 외래키를 선택할 수 있다.
- 주 테이블에 외래키를 설정하는 방법
- 대상 테이블에 외래키를 설정하는 방법
- 외래 키에 데이터베이스의 유니크 제약조건을 추가한다.
- 멤버테이블을 주 테이블이라 생각하자
- 회원과 락커는 각각 1대1 관계이다.
- 이 경우 외래키를 Member에 둘 수 있고, 반대로 Locker에 둘수도 있다.
- Unique제약조건을 걸어주면 1대1매핑!
- @OneToOne, JoinColumn, mappedBy활용
- 외래키가 있는 곳이 연관관계의 주인이다.
다대다 연관관계
- 쓰지마라...
- 중간테이블을 만들어서 일대다 관계 2개로 풀어내는것이 가장 좋다.