[JPA] 다양한 연관관계 매핑 - 일대일

Hocaron·2022년 3월 8일
0

Spring

목록 보기
19/44

다중성

JPA는 객체가 기준이지만, 다중성데이터베이스가 기준이다.
연관 관계는 대칭성을 갖는다.

일대일(1 : 1)

게시글(Post)과 첨부파일(Attach)이 있다.

요구사항

  • 게시글에 첨부파일을 반드시 1개만 첨부할 수 있다고 가정한다.
    게시글1 : 첨부파일1, 게시글 테이블에서 외래키인 첨부파일 테이블의 pk를 갖고 있다고 가정하자.

일대일(1 : 1) 단방향

@Entity 
public class Post { 
	@Id @GeneratedValue 
    @Column(name = "POST_ID") 
    private Long id; 
    
    @Column(name = "TITLE") 
    private String title; 
    
    @OneToOne 
    @JoinColumn(name = "ATTACH_ID") 
    private Attach attach; 
    //... getter,setter 
} 

@Entity 
public class Attach { 
	@Id @GeneratedValue 
    @Column(name = "ATTACH_ID") 
    private Long id; 
    
    private String name; 
    //... getter, setter 
}

일대일(1 : 1) 양방향

@Entity 
public class Attach { 
	@Id @GeneratedValue 
    @Column(name = "ATTACH_ID") 
    private Long id; 
    
    private String name; 
    
    @OneToOne(mappedBy = "attach") 
    private Post post; 
    //... getter, setter 
}

mappedBy 설정만 해서 읽기 전용으로 만들어주면 양방향 완성이다.

외래키는 어디에서 관리하는 게 좋을까?
외래 키를 Post에서 관리하는 게 좋을 것인지, Attach에서 관리하는 게 좋을 것인지 생각을 해봐야합니다. 즉 테이블에 어디에 둘 것 인지를 생각해야합니다.
테이블은 한 번 생성되면 보통 굳어집니다. 변경이 어렵다는 얘기입니다.
그러나 비즈니스는 언제든 바뀔 수 있습니다.
게시글이 여러 개의 첨부파일을 첨부할 수 있도록 비즈니스가 변경되면 어떨까요?
그러면 다(N)쪽인 Attach테이블에 외래 키가 있는 것이 변경에 유연합니다.
그러면 다(N)가 될 확률이 높은 테이블에 외래 키를 놓는게 무조건 좋을까요?
그건 또 아닙니다.
객체 입장에서 Post쪽(1)에서 외래 키를 갖게되면 Post를 조회할 때마다 이미 Attach의 참조를 갖고 있기 때문에 성능상 이득이 있습니다.
종합적으로 판단하고 결정해야하는데 단순화해서, 보통 일대일이라고 정할 때도 아주 신중하게 정했다고 가정한다면 주 테이블(Post)에 외래 키를 두는 것이 더 낫습니다.

References

profile
기록을 통한 성장을

0개의 댓글