[TIL] 230725 외래키 너무 어려워요

CountryGirl·2023년 7월 25일
0

TIL

목록 보기
33/80

ERD

NewsHeart 테이블은 User 테이블과 News 테이블의 PKFK로 가지고있어야한다.
그래야 로그인한 사용자가 해당 기사를 좋아요를 누르는 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;
}

UserNews를 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에 이렇게 작성해주었다.

양방향을 걸기 위해서 UserNews에도 필드를 만들어준다.

// 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;

라고 했기 때문에 mappedByheartUser, heartNews 를 써주어서 외래키를 걸어준다.



나 이제 연관관계 잘 할 수 있겠지?

profile
💻🌾시골소녀의 엉망징창 개발 성장일지🌾💻 (2023.05.23 ~)

0개의 댓글