NewsHeart
테이블은 User
테이블과 News
테이블의 PK를 FK로 가지고있어야한다.
그래야 로그인한 사용자가 해당 기사를 좋아요를 누르는 API를 구현할 수 있기 때문이다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "heartUser_id")
private User heartUser;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "heartNews_id")
private News heartNews;
public NewsHeart(User heartUser, News heartNews) {
this.heartUser = heartUser;
this.heartNews = heartNews;
}
User
와 News
를 N:1 양방향으로 연관관계를 맺어주었고, fetch = FetchType.LAZY
를 옵션을 걸어주어서 지연로딩이 되도록 하였다.
사실 좋아요를 구현할 때 외래키를 걸어서 연관관계를 맺어주는 것을 완벽하게 이해하지 못해서 이 전에 사용했던 코드를 가져오고 양방향으로 관계를 맺어서 구현하였다.
이해를 완벽하게 하지 못한 상태로 구현을 하니 구현을 해도 기분이 찝찝했다.
그래서 다시 외래키 거는 것을 고민해보았다.
NewsHeart Entity
가 필요했다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
일단 PK를 만들어주었다.
User
는 좋아요를 여러 번 누를 수 있다.
News
는 좋아요를 여러 번 누릴 수 있다.
∴ NewsHeart : User = N : 1, NewsHeart : News = N : 1
N 인 관계가 보통 외래키를 가진다.
그러므로 NewsHeart
에 외래키를 준다.
User
의 PK, News
의 PK가 필요하기 때문에
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "heartUser_id")
private User heartUser;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "heartNews_id")
private News heartNews;
NewsHeart Entity
에 이렇게 작성해주었다.
양방향을 걸기 위해서 User
와 News
에도 필드를 만들어준다.
// User Entity
@OneToMany(mappedBy = "heartUser", cascade = CascadeType.REMOVE)
private List<NewsHeart> userHearts;
// News Entity
@OneToMany(mappedBy = "heartNews", cascade = CascadeType.REMOVE)
private List<NewsHeart> newsHearts;
옵션 mappedBy = "외래키를 가지고 있는 Entity의 필드명"
이다.
NewsHeart에서
private User heartUser;
private News heartNews;
라고 했기 때문에 mappedBy
에 heartUser
, heartNews
를 써주어서 외래키를 걸어준다.
나 이제 연관관계 잘 할 수 있겠지?