DB 관계

itonse·2023년 12월 22일
0

CS 스터디

목록 보기
13/56

DB 연관관계 매핑 시 고려사항

  1. 방향: 단방향, 양방향
  2. 다중성: 일대일(1:1), 다대일(N:1), 일대다(1:N), 다대다(N:M)
  3. 연관 관계의 주인: 양방향일 때, 연관 관계에서 관리 주체 ( mappedBy 속성을 사용해서 주인을 지정)

1. 다대일(N:1) 단방향

게시판(1) ← 게시글(N)(외래키 관리)

@Entity 
public class Post { 
	  @Id @GeneratedValue 
    @Column(name = "POST_ID") 
    private Long id; 		
    
    @Column(name = "TITLE") 
    private String title; 
    
    @ManyToOne   
    @JoinColumn(name = "BOARD_ID")   // 외래키 관리
    private Board board; 

 }
  • 위의 코드에서 보는 다대일 단방향 관계의 특징
    • Post 엔티티가 외래키(BOARD_ID)를 관리하며, 이를 통해 관계 설정과 데이터베이스 반영이 이루어진다.
    • Board에서는 Post 리스트에 직접 접근이 불가능하다.

2. 다대일(N:1) 양방향

게시판(1) ↔ 게시글(N)(관계주인)

  • 다대일 단방향 + 반대쪽에서 일대다 단방향 매핑
  • 엄밀하게는 양방향 관계는 없고 두 객체가 단방향 참조를 각각 가져서 양방향 관계처럼 사용
@Entity 
public class Post {  
	  @Id @GeneratedValue 
    @Column(name = "POST_ID") 
    private Long id; 
    
    @Column(name = "TITLE") 
    private String title; 
    
    @ManyToOne 
    @JoinColumn(name = "BOARD_ID")   // 외래키 관리
    private Board board; 
} 

@Entity 
public class Board { 
	  @Id @GeneratedValue 
    private Long id; 
    
    private String name; 
    
    @OneToMany(mappedBy = "board")   // Post가 관계의 주인임을 나타냄
    List<Post> posts = new ArrayList<>();  // 리스트 형태
}

관계의 주인이 되는 것은 해당 관계에서 외래키의 관리 및 데이터베이스 반영 방식을 결정한다.

  • 다대일 양방향 관계에서의 관계 주인
    • 관계의 주인이 외래키를 관리하지만, 양쪽 엔티티 모두에서 서로를 참조할 수 있어 더 유연한 데이터 접근이 가능하다.
    • 하지만 관리 복잡성과 성능 고려가 필요하다.

3. 일대일(1:1) 단방향

상품(1) <- 상품정보(1)

@Entity 
public class ProductDetail { 
	  @Id @GeneratedValue 
    @Column(name = "PRODUCT_DETAIL_ID") 
    private Long id; 		
    
    @Column(name = "TEXT") 
    private String text; 

@OnetoOne
@JoinColumn(name = "PRODUCT_ID") 
private Product product;

4. 일대일(1:1) 양방향

상품(1) ↔ 상품정보(1)(관계주인)

  • 관계주인은 더 적절한 엔티티에 지정
@Entity 
public class ProductDetail {
    @Id @GeneratedValue 
    @Column(name = "PRODUCT_DETAIL_ID") 
    private Long id;      
    
    @Column(name = "TEXT") 
    private String text; 

    @OneToOne
    @JoinColumn(name = "PRODUCT_ID")    // 외래키 관리
    private Product product;
}

@Entity
public class Product {
    @Id @GeneratedValue
    @Column(name = "PRODUCT_ID")
    private Long id;

    @Column(name = "NAME")
    private String name;

    @OneToOne(mappedBy = "product")    // ProductDetail 이 관계의 주인임을 나타냄
    private ProductDetail productDetail;   // 리스트
}

5. 다대다(N:M) 관계

다대다 관계를 갖게 되면 다음과 같은 위험한 상황이 발생할 수 있어, 잘 사용을 하지 않는다.

  • Hibernate에 의해 생성되는 중간 테이블은 PK 외에 다른 컬럼을 추가할 수 없다.
  • 중간이 숨겨져 있기 때문에 예상치 못한 쿼리가 실행될 가능성이 있다

대안으로 연관 테이블(중간 엔티티)을 추가하여 다대다(N:M) 관계를 두 개의 일대다(1:N) 및 다대일(N:1) 관계로 분해하여 관리하는 방법이 있다.


단방향으로 할 지, 양방향으로 할 지 결정해야 할 때

  • 양방향 매핑을 하면 불필요한 연관관계 매핑으로 인해 복잡성이 증가될 위험이 있다.
  • 기본적으로 단방향 매핑으로 하고, 나중에 역방향으로 객체 탐색이 꼭 필요할 때 추가하는 것이 권장된다.

0개의 댓글