Step3-kakao-tech-campus / Team3_BE

[카테캠 1기] 번개 지향 볼링 모집 커뮤니티 "번개볼링"의 백엔드 서버입니다.
2 stars 4 forks source link

Post 내부의 applicants(OneToMany 연관관계) 삭제하기 #66

Closed jagaldol closed 11 months ago

jagaldol commented 11 months ago

Description

Post와 Applicant가 현재 양방향으로 이루어져 있습니다. 이 양방향 관계를 끊기 위해 Post 내부의 applicants를 삭제하고자 합니다.

post.applicants를 사용 중인 코드를 서비스쪽으로 끌어내려 applicantRepository에 직접 접근하는 식으로 추가 쿼리를 직접 작성하면 되겠습니다.


추가적으로 서버에서 해당 오류가 발생하고 있습니다.

2023-10-15T11:39:43.549Z  WARN 61780 --- [nio-8080-exec-9] org.hibernate.orm.query : HHH90003004: firstResult/maxResults specified with collection fetch; applying in memory

이는 OneToMany인 applicants를 JoinFetch하려고 하다가 발생한 문제로, hibernate가 페이징을 제대로 확인할 수 없어 결국 모든 걸 메모리에 불러들이고 그 후 자르게 됩니다. 이것 때문에 속도도 느리고 OOM(Out of Memory) 문제도 발생가능합니다.

Post의 applicants를 삭제하면서 이처럼 join fetch하는 부분도 제거하면 될거 같습니다.

PostSpecification의 문제로 추측되는 부분입니다.

public static Specification<Post> conditionEqual(String condition, Long userId) {
    return (root, query, criteriaBuilder) -> {
        ...
        Fetch<Post, District> districtFetch = root.fetch("district", JoinType.LEFT);
        Fetch<District, Country> countryFetch = districtFetch.fetch("country", JoinType.LEFT);
        countryFetch.fetch("city", JoinType.LEFT);
        root.fetch("applicants", JoinType.LEFT); // 문제가 예상되는 부분
        ...
}

Tasks