221031 TIL @OneToMany, @ManyToOne (feat. mappedby)

오늘은 게시판 객체 간의 구조 설계를 위해 @ManyToOne과 @OneToMany에 대해서 공부했다.

 

현재 진행 중인 게시판 프로젝트를 예시로 User(사용자)가 1개 이상의 Post(게시글)을 작성할 수 있기 때문에 아래처럼 테이블 구조를 설계했다. 우선 간단하게 OneToMany와 ManyToOne을 먼저 맛보면 아래 구조에서 User 입장에서는 @OneToMany이고 Post입장에서는 @ManyToOne이다.

  

 

우선 두 객체를 연결하기 위해서 Pos 객체에 User 객체를 만들고, User 객체에는 User가 쓴 글 모두를 담을 수 있는 List타입의 posts를 만들었다.

 

Post객체에 User에는 @ManyToOne 붙여주고 User객체에 Post List에는 @OneToMany를 붙여주었다.

 

@ManyToOne : 다대일(N : 1) 관계 , 한 명의 유저가 여러 게시글을 작성할 수 있기 때문에 게시글을 기준으로 @ManyToOne을 추가해준다. --> 여러 개의 게시글을 한 명의 유저가 작성할 수 있다.

Post 클래스

@OneToMany : 일대다(1 : N)관계, 한 명이 게시글을 여러 개 작성할 수 있으므로 유저를 기준으로 @OneToMany을 추가해준다.

User 클래스

이렇게 설계를 하면 객체가 양방향 연관관계로 만들어지기 때문에 연관관계의 주인을 정해주어야 한다.

연관관계의 주인을 정하기 위해 @OneToMany에 mappedBy 속성을 추가해주었다.

 

양방향 관계로 설정하면 객체의 참조는 양쪽에서 하게 되는데 외래 키는 하나이기 때문에 서로 참조하는 객체 중 연관관계의 주인을 정해 테이블의 외래 키를 관리(등록, 수정, 삭제) 해야 한다. 양방향 관계로 만들려면 일(1) 쪽에 @OneToMany를 추가하고 mappedBy 속성을 사용해서 연관관계의 주인이 아님을 알려줘야 한다.

 

연관관계의 주인을 정하는 방법

  • 주인이 아니면 mappedBy속성을 사용해서 주인을 정할 수 있다.
  • 주인은 mappedBy속성 대신 @JoinColumn을 사용한다.

 

참조 :

https://jyami.tistory.com/21

https://soojong.tistory.com/entry/JPA-ManyToOne-OneToMany-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0