(JPA)일대일 매핑
연관관계 매핑(일대일)
- 주 테이블이나 대상 테이블 중에 왜래 키 선택 가능
- 주 테이블에 외래 키
- 대상 테이블에 왜래 키
- 왜래 키에 데이터베이스 유니크 제약조건 추가
일대일 객체 연관관계(단방향)
Locker
1
2
3
4
5
6
7
@Entity
public class Locker {
@Id
@GeneratedValue
private Long id;
private String name;
}
Member
1
2
3
4
5
6
7
8
9
10
@Entity
public class Member {
...
@OnetoOne
@JoinColumn(name = "locker_id") // 안넣어 줘도 기본값으로 셋팅되나 기본값이 매우 지저분 하기 때문에 넣어주는게 좋다.
private Locker locker;
...
}
일대일 객체 연관관계(양방향)
Locker
1
2
3
4
5
6
7
8
9
10
@Entity
public class Locker {
@Id
@GeneratedValue
private Long id;
private String name;
@OnetoOne(mappedBy = "locker")
private Member member;
}
Member
1
2
3
4
5
6
7
8
9
10
@Entity
public class Member {
...
@OnetoOne
@JoinColumn(name = "locker_id") // 안넣어 줘도 기본값으로 셋팅되나 기본값이 매우 지저분 하기 때문에 넣어주는게 좋다.
private Locker locker;
...
}
다대일 양방향
이랑 유사하다.다대일 양방향
매핑 처럼 외래 키가 있는 곳이 연관관계 주인- 반대편은
mappedBy
적용 - 대상 테이블에 외래 키가 있는 단방향 관계는 JPA 에서 지원하지 않는다.
DB테이블 입장에서 외래 키 위치
- 정해진 답은 없다. 어느 테이블이 외래 키를 가지던 양,단 방향은 제대로 관계가 맺어지고 동작도 잘 된다. 하지만, DB 입장에서 외래 키의 위치에 따라
trade-off
가 발생한다. - 비즈니스 로직의 변경에 따라 어느곳에 두는게 추후에 좋을지 생각해보고 결정하는것이 좋다.
하나의 Member가 여러 Locker를 갖는 경우
- Member가 외래 키를 갖을때
하나의 Member
가여러 Locker
를 가질 수 있도록 변경되면, 코드의 변경도 많아진다. 즉 변경 포인트가 많아 진다.
- Locker가 외래 키를 갖을때
- 지금은
하나의 Member
가하나의 Locker
를 가지지만 추후에 만약하나의 Member
가여러 Locker
를 가질 수 있도록 변경된다면, 테이블 입장에서일대다 매핑
으로 변경하기 매우 쉽다.(유니크 제약 조건만 없애주면 끝) - 단, 객체 입장에서 Member를 통해 Locker를 단방향으로 조회한다 하더라도, 어쩔수 없이 양방향으로 설계를 해야한다.
- 지금은
- Locker가 외래 키를 갖는 것이 변경에 유리
하나의 Locker가 여러 Member를 갖는 경우
- 위에 상황에서
반대
로 외래 키를 갖는 것이 변경에 유리
ORM 입장에서 외래 키 위치
Member가 외래 키를 갖는 경우
Member테이블
을 많이SELECT
하는 경우 성능 상의 이점이 크고, 로직 작성이 쉽다.- DBA 입장에서는 Member가 Locker를 가지고 있지 않을때
NULL값
을 허용해 줘야하기 때문에 좋아하지 않을 수 있다. - 각자 선호하는 방식에 따라 설계를 진행하는 것이 좋다.
정리
주 테이블에 외래 키
- 주 객체가 대상 객체의 참조를 가지는 것 처럼 주 테이블에 외래 키를 두고 대상 테이블을 찾음
- 객체지향 개발자가 선호
- JPA 매핑이 편리하다.
- 장점: 주 테이블만 조회해도 대상 테이블에 데이터가 있는지 확인이 가능하다.
- 단점: 값이 없으면 외래 키에 NULL을 허용해줘야 한다.(DBA 입장에서 많이 안좋아하는 경우)
대상 테이블에 외래 키
대상 테이블에 외래 키가 존재
전통적인 데이터베이스 개발자가 선호한다.
장점: 주 테이블과 대상 테이블을 일대일에서 일대다 관계로 변경할 때 테이블 구조를 유지하면서 변경이 가능하다.
단점: 프록시의 기능 한계로 지연 로딩으로 설정해도, 항상 즉시 로딩된다.
REFERENCE
#JPA_일대일 #연관관계_매핑
This post is licensed under CC BY 4.0 by the author.