spring으로 게시글에 좋아요 등록 / 취소 기능을 구현하고
게시글 response에 해당 게시글의 총 좋아요 수를 구하려고 했다.
그때 heart 테이블을 구성했던 필드는
Heart.java
public class Heart {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@JoinColumn(name = "member_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
private Member member;
@JoinColumn(name = "post_id", nullable = false)
@ManyToOne(fetch = FetchType.LAZY)
private Post post;
}
member 모델의 id와 post 모델의 id를 관계 매핑한 것이어서
처음 딱 들었던 생각이
post 테이블에도 heart가 @OneToMany에 orphanRemoval = true로 관계되어 있으니 해당 게시글의 id가 포함된 heart의 개수를 알 수 있는 옵션이 있지 않을까..?
하고 찾다가 발견한게 @Formula 어노테이션이다.
Hiberante에서 제공하는 @Formula 어노테이션으로 사용하면 가상 컬럼을 매핑할 수 있다. 가상 컬럼이란 jpa상에는 존재하지만 실제 DB에는 저장되지 않는 컬럼을 말한다.
Post.java
@Formula("(select count(1) from heart he where he.post_id = id)")
private int totalHeartCount;
heart 모델의 post id가 id인 값을 모두 count한다는 sql문이다.
게시글 response를 빌드할 때 totalHeartCount만 담아주면 좋아요 개수가 잘 구해졌다.
count(*) = count(1)로 해당 조건 전체를 count 한다는 뜻
근데 양방향 관계매핑으로 여러 모델이 얽혀있는 코드는 여러가지로 속을 썩여서 웬만하면 다신 안하려고 한다..
더 좋은 해결방법이 있었을 것 같은데 다음엔 다른 방법을 써봐야지!