개념정복💫/스프링 Spring 정복
JPA 일대일(OneToOne) 관계 매핑
옹쑥이
2025. 2. 23. 00:18
JPA에서 1:1 관계를 설정할 때는 @OneToOne과 함께 @JoinColumn 또는 mappedBy 속성을 사용합니다.
어떤 엔티티가 외래 키를 가질지에 따라 설정이 달라집니다.
1. @JoinColumn 사용 시
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "diary_tags_no")
private DiaryTagsEntity diaryTagsEntity;
- DiaryEntity 테이블에 diary_tags_no 컬럼이 생성됨 (주인, owner)
2. mappedBy 사용 시
@OneToOne(mappedBy = "diaryEntity", cascade = CascadeType.ALL)
private DiaryTagsEntity diaryTagsEntity;
- DiaryTagsEntity 쪽에 외래 키가 존재 (DiaryEntity는 매핑 주인이 아님, non-owner)
3. 예시 코드
@Entity
public class DiaryEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long diaryNo;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "diary_tags_no")
private DiaryTagsEntity diaryTagsEntity;
}
@Entity
public class DiaryTagsEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long tagNo;
@OneToOne(mappedBy = "diaryTagsEntity")
private DiaryEntity diaryEntity;
}
- 실제 외래 키를 DiaryEntity가 가질지, DiaryTagsEntity가 가질지 프로젝트 설계에 맞춰 결정
1:1 관계 매핑은 구조가 단순해 보이지만, 조인 전략과 성능을 면밀히 따져야 합니다.
양방향 매핑 시 무한 루프 문제를 방지하기 위해 DTO 변환 또는 @JsonIgnore 사용이 필요할 수 있습니다.