berryberrybin / board-project

0 stars 0 forks source link

[JPA] 연관 관계 매핑 #16

Open berryberrybin opened 1 year ago

berryberrybin commented 1 year ago

단방향 VS 양방향

연관관계 주인

berryberrybin commented 1 year ago

N:1 다대일 단방향

@Entity public class Board { @Id @GeneratedValue private Long id; private String title; //... getter, setter }


### N:1 다대일 양방향
- 코드
   - 양방향 만들기 위해선 (1)쪽에 `@OneToMany` 추가
   - 양방향 매핑 사용시 연관관계 주인을 `mappedBy`로 지정 
   - Posts(N) : Board(1)에서 **Post가 PK를 가지고, 주인역할을 함**
```java
@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;
    //... getter, setter
}

@Entity
public class Board {
    @Id @GeneratedValue
    private Long id;
    private String title;

    @OneToMany(mappedBy = "board") // posts 테이블에 있는 board 필드에 의해 매핑되었다는 의미
    List<Post> posts = new ArrayList<>();
    //... getter, setter
}
berryberrybin commented 1 year ago

1:N 일대다 단방향

@Entity public class Board { @Id @GeneratedValue private Long id; private String title;

@OneToMany
@JoinColumn(name = "POST_ID") //일대다 단방향을 @JoinColumn필수
List<Post> posts = new ArrayList<>();
//... getter, setter

}

- 문제점
    - post 저장시에는 insert 쿼리 잘 나가지만 board 저장시에 Board insert 쿼리 나간 후 post를 update하는 쿼리가 나감
    - `board.getPosts().add(post);` 부분에서 Board 엔티티는 Board 테이블에 매핑되기때문에 Board 테이블에 직접 지정할 수 있지만, Post 테이블의 FK(Board_ID)를 저장할 방법이 없으므로, 조인 및 업데이트 쿼리를 날려야 함
    - 즉, Board만 수정했는데 다른 수정이 생겨 쿼리가 발생함
  - 1:N 단방향 연관관계 매핑이 필요한 경우에는 ❗차라리 N:1 양방향 연관관계 매핑이 유지보수가 더 쉬움 ❗
```java
//...
Post post = new Post();
post.setTitle("가입인사");

entityManager.persist(post); // post 저장

Board board = new Board();
board.setTitle("자유게시판");
board.getPosts().add(post);

entityManager.persist(board); // board 저장
//...

1:N 일대다 양방향

berryberrybin commented 1 year ago

1:1 일대일 단방향

1:1 일대일 양방향

berryberrybin commented 1 year ago