Native Query 사용 → query dsl 리팩토링

문제 상황

  1. Parameter로 Skill Id의 List를 받아오며, 여러 개의 skill Id를 WHERE 조건문에서 IN 연산을 통해 검색

  2. 만약 넘어온 Skill ID가 1과 2라면, 1이 들어가는 Meeting / 1과 2가 들어가는 Meeting / 2가 들어가는 Meeting이 모두 출력되는 상황

    → 레퍼런스로 점핏, 원티드 사이트를 보았을 때, 해당 사이트는 IN 연산자로 하나라도 조건에 걸리면 나오는 것으로 추측

  3. 만약 1과 2가 반드시 들어가도록 Group By와 Having 을 통해 검색하는 경우, 1과 2가 들어가는 결과만 출력할 수 있다.

    → 이 경우는, 1, 2, 3을 skill Id로 갖는 데이터를 찾을 수 없음

    → 따라서, 이 방법은 사용하지 않는 것이 좋아 보임

해결 방안 모색

  1. 기존의 IN 방식을 사용하여, 해당 스킬이 하나라도 걸리는 경우를 모두 출력하는 방법

    → 상단 기준 16개만 출력하므로, DB 조회가 가장 우수할 것으로 예상

  2. 1번 방법으로 DB에서 데이터를 50개 정도 가져온 뒤, 자바 코드를 통해 데이터를 압축하는 방법

    → 예를 들어, IN(1, 2)로 조회를 할 경우, 1 혹은 2가 포함되는 모든 경우를 50개 정도 가져온 뒤

    → 해당 데이터들 중, 1과 2를 반드시 포함하는 데이터를 찾아서 정제하기

    → 1과 2를 가지면서 동시에 3을 갖는 데이터도 포함할 수 있음

@Query(value = "SELECT m.* FROM meeting m "
            + "JOIN meeting_skill ms ON m.id = ms.meeting_id "
            + "WHERE ms.skill_id IN (:skillId) "
            + "ORDER BY (6371 * acos(cos(radians(:locationLat)) * cos(radians(m.location_lat)) * cos(radians(m.location_lng) - radians(:locationLng)) + sin(radians(:locationLat)) * sin(radians(m.location_lat)))) ASC "
            + "LIMIT :limit OFFSET :page",
            nativeQuery = true)
    List<Meeting> getMeetingsWithSkill(Double locationLat, Double locationLng, List<Short> skillId, int limit, int page);