[TIL]20220905

god1hyuk·2022년 9월 5일
1

TIL / WIL

목록 보기
22/30

오늘은 작업 보다는 대부분의 시간을 회의하는데 시간을 보냈다.

디자이너분과 기존에 논의 했던 페이지별 기능 정의를 수정할 것도 많았고 놓쳤던 부분들도 많아서 다시 논의하여 정리했다.

저녁 식사 이후 까지도 회의하며 API 명세서를 수정하고 9시가 다 돼서야 작업을 다시 시작할 수 있었다.


나는 오늘 Todo List(부모)를 조회하고 Todo List 조회 시 Todo(자식)들 중 아직 이행하지 않은(isAchieved == false) Todo의 개수를 조회하여 응답해주는 로직을 구현했다.

이 기능을 하면서 굉장히 애를 먹었다. 우리가 가지고 있는 데이터는 "2022-09-05" 이런 형태의 하나의 문자열로 이루어진 날짜 데이터 였는데 캘린더에서 해당 월을 조회 하기 위해서는 년, 월만 필요했다. 클라이언트로 부터 어떠한 요청 값을 받아야 할지 부터 막막 했고 년, 월만 받아온다 한들 이 두가지를 가지고 어떻게 한 뭉치로 이루어진 문자열을 비교할지도 문제였다.

일반적인 JPA로는 쿼리하기에 딱히 방도가 보이질 않았다. QueryDSL을 사용하여 조회하기로 결정했다.

하지만 "2022-09-05" 형식에서 어떻게 년, 월을 구분하여 요청받은 년, 월과 비교할지 고민이었다.

public List<TodoList> findAllByYearAndMonth(String year, String month) {
        return queryFactory
                .select(todoList)
                .from(todoList)
                .where(todoList.dueDate.substring(0, 7).eq(year + "-" + month))
                .fetch();
    }

오늘 처음 알게 된 사실인데 sql에서도 substring이 존재한다는 것이다.

실제 sql에서는 첫번째 문자를 1부터 세고 QueryDSL은 Java의 문법에 따라 0번째 부터 센다는 차이만 있을 뿐 substring을 사용할 수 있다는 것이다.

어차피 "2022-09-05" 이 형식은 월, 일이 한 자리수여도 앞에 0이 붙어 2자리수로 문자열의 길이가 달라질 일이 없기 때문에 substring(0, 7)과 매개변수로 받아온 년(year), 월(month) 사이에 "-"로 이어 붙여 문자열로 만들어 비교한 다음 조건과 일치 하는 TodoList만 추려냈다.

그 다음 조회할 데이터는 아직 이행하지 않은 Todo이다.

나는 원래 Todo List 테이블을 조회할 때 Todo 테이블을 join 하여 이행하지 않은 Todo의 개수를 count할 생각이었는데 아무리 시도를 해봐도 원하는 값을 얻어낼 수가 없었다. 팀원들과 몇시간을 검색하고 머리를 맞대어 고민해봤지만 도무지 해결이 되질 않았다.

뭔가 방법이 있을 것 같은데 내가 가진 지식이 아직 얕아서 해내지 못한건지 모르겠지만 join을 한다고 해서 모든 걸 얻어낼 수 없다고 "김영한" 님의 어느 피드백에서 읽은 적이 있다. 이 전에도 DTO List에 join한 테이블의 데이터를 리스트 형태로 담으려 했으나 그 당시에도 join으로 해결하지 않고 결국 각각 쿼리하여 데이터를 모아서 응답했었다.

이번 역시 마찬가지로 Todo 테이블에 직접 쿼리하여 원하는 값인 이행하지 않은 Todo의 개수를 조회했다.

Integer countAllByTodoListAndIsAchieved(TodoList todoList, Boolean isAchieved);

결론적으로는 원하는 데이터를 잘 조회할 수 있었고 생각보다 조회 시간도 짧게 잘 나왔다.

QueryDSL을 사용하지 않는다고, 테이블 join을 하지 않는다고 비효율적이고 시간이 오래 소요 되는 것만은 아닌 것 같다.

아직은 조금 더 사용하며 판단을 할 수 있는 노하우가 생겨야겠지만 이번 기회를 통해서 QueryDSL의 사용 범위를 어느 정도는 깨닫게 되었다.

그래도 아직 join을 통해 얻어낼 수 있지 않을까 하는 조금의 미련이 남아 있긴하다...!

0개의 댓글