Post

(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.