1:1 단방향
두 Entity가 @OneToOne 을 통해 연관 관계를 맺는 경우를 말한다.
1:1 연관관계 단방향 그림
1:1은 두 entity 중 아무나 외래키의 주인이 될 수 있다.(요기서는 Tutor로 가정)
1:1은 외래 키에 유니크 제약조건이 필요하다
코드 예시
@Entity
@Table(name = "address")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
@Entity
@Table(name = "tutor")
public class Tutor {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "address_id", unique = true)
private Address address;
public Tutor() {
}
public Tutor(String name) {
this.name = name;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
}
실행 결과
Tutor 테이블에 외래키가 들어간 것을 확인할 수 있다.
1:1 양방향
1:1 연관관계 양방향 그림
외래키가 있는 곳이 연관관계의 주인이 되면 된다.
코드 예시
@Entity
@Table(name = "address")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// 읽기 전용
@OneToOne(mappedBy = "address")
private Tutor tutor;
}
Address 테이블은 연관관계의 주인이 아니므로 읽기 전용으로 설정해야 한다.
개발자 관점에서 연관관계 설정
Totor에서 Address 테이블로 접근할 확률이 높으니 Totor 테이블이 외래 키를 가지면 편하다.
- 성능상 이점이 생긴다.
명확한 1:1 연관관계라면 위 방법을 선택하면 된다.
하지만 테이블 설계상 Address에 있는 것이 적절하다. 각 방법 중 장단점을 비교하여 선택하면된다.
외래 키 위치 장단점
외래키가 주 테이블에 있을 때
장점
- JPA로 객체 지향적인 개발이 가능해진다.
- 주 테이블만 조회해도 대상 테이블을 조회할 수 있다.
단점
- 대상 테이블에 값이 없다면 null이 되어야 한다.
- 데이터 무결성을 지키지 못한다.
- 대상 테이블의 데이터를 참조하기 때문에 삭제될 때 외래키 값을 처리하는 관리가 필요하다
외래키가 대상 테이블에 있을 때
장점
- 데이터베이스의 무결성을 보장한다
- 주 테이블과 대상 테이블의 연관관계 변경 시 테이블 구조가 유지된다.
- 1:1에서 N:1으로 변경되도 테이블 구조는 같다.
단점
- 조회 성능이 떨어진다
- 연관관계 매핑 설정이 복잡하다
- 지연 로딩을 설정해도 즉시 로딩된다.(중요)
'JPA' 카테고리의 다른 글
Proxy (0) | 2024.11.28 |
---|---|
상속 관계 매핑 (0) | 2024.11.28 |
N:M 연관관계 (0) | 2024.11.27 |
1:N 연관관계에서 1이 연관관계 주인일 때 (0) | 2024.11.27 |