관리 메뉴

bright jazz music

[bootBoard] N:1(다대일) 연관관계: 1.연관관계와 DB 설계 본문

Framework/Spring

[bootBoard] N:1(다대일) 연관관계: 1.연관관계와 DB 설계

bright jazz music 2022. 7. 25. 20:32

● 회원과 게시글과 댓글이라는 주제로 JPA에서의 연관관계를 적용할 수 있는 방법을 학습한다.

 

  • 연관관계를 분석하고 @ManyToOne을 이용한 연관관계 설정하는 법
  • 연관관계가 없는 상황에서 left(outer) join 처리 방법
  • 즉시(Eager) 로딩과 지연(Lazy) 로딩의 차이와 효율적 처리 방법

 

1. 관계형 DB 에서의 entity(개체) 간의 관계(relation)

관계형 DB에서는 아래와 같은 관계로 데이터 간의 구성을 표현한다.

  • 일대일 (1:1)
  • 다대일 (N:1)
  • 다대다 (M:N)

이러한 표현을 구분하는 것이 PK(주키, Primary Key)와 FK(외래키, Foreign Key)의 사용 방식에 대한 설정이다.

 

  • 한 명의 회원이 여러 게시글을 작성할 수 있다. (다대일)
  • 한 게시글에 여러 개의 댓글이 달릴 수 있다. (다대일)

이 경우 회원 데이터의 아이디는 PK다. 게시글 데이터를 보면 작성자 칼럼 값으로 동일한 회원 아이디가 여러 번 등장한다.

따라서 회원 데이터의 입장에서는 하나의 아이디(PK)가 여러 게시글에서 참조(FK)되고 있는 관계다 된다.

 

테이블 간의 관계는 특정한 PK가 다른 곳에서 몇 번이나 FK로 사용되었는지가 중요하다. 우선 어떠한 PK를 기준으로 할 것인지 고민하고 해당 PK가 다른 곳에서 몇 번 사용되었는지를 세어보는 방식으로 찾아낸다.

 

member 쪽이 1 board쪽이 N이다

 

 

DB상에서 관계와 이에 대한 해석의 가장 큰 차이는 PK에 있다. 

DB에서 관계를 해석할 때는 항상 PK 쪽에서 해석하고 이를 반영하면 혼란을 줄일 수 있다.

 

따라서 회원과 게시글의 관계, 게시글과 댓글의 관계는 아래와 같이 표현될 수 있다.

  • 한 명의 회원은 여러 게시글을 작성할 수 있다.(PK 해석)
  • 하나의 게시글은 한 명의 작성자만 표시할 수 있다.

 

  • 하나의 게시글은 여러 개의 댓글을 가질 수 있다.
  • 하나의 댓글은 하나의 게시글에 속한다.

 

2. PK로 설계하고 연관관계는 FK로 해석하라

JPA를 이용해서 연관관계를 해석할 때는 PK를 기준으로 잡고 DB를 모델링 하는 방식으로 구성한다.

 

회원 / 게시글 / 댓글의 관계

 

  • 회원이 있어야만 게시글을 작성할 수 있다. 회원 테이블을 먼저 설계한다.
  • 게시글 테이블을 작성할 때는 특정 회원과의 관계를 설정해 줘야 한다.
  • 게시글이 있어야지 댓글이 존재한다. 게시글 테이블을 설계한다.
  • 댓글 테이블은 게시글을 FK로 하여 작성한다.

 

FK를 기준으로 위 관계를 해석하면 아래와 같다.

  • 게시글(board)는 회원(member)와 다대일(N:1) 관계이다.
  • 댓글(reply)는 게시물(board)와 다대일(N:1)의 관계이다.

 

관계형 DB에서는 관계를  위와 같이 PK와 FK만으로 표현할 수밖에 없다. 그러나 JPA를 사용하면 객체로 관계를 해석할 수 있기 때문에 DB와는 다른 선택도 가능하다.

 

 3. JPA에서의 해석과 선택

JPA에서는 아래와 같이 선택이 가능하다.

 

  • 회원 엔티티가 게시글 엔티티를 참조하게 설정해아 하는가?
  • 게시물 엔티티에서 회원 엔티티를 참조하게 설정해야 하는가?
  • 회원, 게시물 엔티티 객체 양쪽에서 서로를 참조하게 설정해야 하는가?

 

이는 관계를 단방향(unidirictional) 참조와 양방향(bidirectional) 참조 가운데 선택할 수 있기 때문이다.

DB에서는 양방향은 존재하지 않기 때문에 이같은 고민은 객체지향의 관점에서만 가능하다. 

 

우선은 객체지향보다는 관계형 DB 모델링의 관점에서 구성하는 것이 편리하다.

 

FK를 사용하는 엔티티가, PK를 가진 엔티티를 참조하는 구조로 설계하면 DB와 동일한 구조가 되기 때문에 관계를 이해하기 쉽다. 또한 자동으로 테이블이 생성시킬 수도 있다.

 

 

 

 

 

 

Comments