corou : 추가 기능 구현과 오류 잡기
데이터베이스 문제
연휴를 맞아 블로그는 잠시 휴식을 가졌지만 프로젝트 개발은 꾸준하게 하루에 조금씩이라도 진행했다.
같이 작업중인 성준님과 약 3번의 회의를 가지며 혼자서 확인하기 어려운 부분들을 함께 조율해나가니 진행이 척척 됐다.
우선 루틴을 추가하는 쪽에서 오류가 있었는데 그 중 백엔드쪽 오류로는 데이터베이스쪽 식별자와 조인 문제가 많았다. 첫번째로 마주한 문제는, 루틴이 하나는 제대로 생성됐는데 또 다른 루틴을 생성할려고 하니 데이터베이스에 제대로 등록이 안되는 것이었다.
콘솔에 로그를 찍어 어디서 막히나 확인해보니 routine_detail을 생성하는 부분에서 막히고 있었다. 뜬 오류를 확인해보니 중복 키값때문에 그렇다고 뜬다. 분명히 나는 routine_detail은 복합키로 설계하여 routine_key + step_number의 조합으로 식별자를 설정했고 이에 따라 1(루틴키) + 1(스텝넘버), 1 + 2, 2 + 1, 2 + 2 등의 고유한 조합으로만 routine_detail을 생성하도록 설계했는데 왜 이런 문제가 생기는지 모르겠어서 코드를 면밀히 살펴보니…
관계를 만드는 부분이 잘못되어 있었다. One-to-one 관계로 routine_detail과 item을 연결해주다 보니 하나의 제품은 하나의 routine_detail에만 귀속되어 있던 것이다.
item_key가 1인 제품이 첫번째로 생성한 루틴의 routine_detail에 외래키로 주어져있어 해당 제품은 더 이상 다른 routine_detail에 연결될 수 없도록 설계되어 있었다.
이를 고치니 제대로 두 번째 루틴이 등록됐다.
두번째로 마주친 데이터베이스 문제는 조인과 관련된 문제였는데, 분명 SQL 자격증을 취득했음에도 실제로 써먹으려니 꽤나 까다로웠다. 인라인뷰와 이너조인을 사용해야 했던 경우가 꽤 있었는데, 여러 번의 시행착오를 거쳐야 했다.
우선 클라이언트에 보여줘야 할 데이터 중 제품과 루틴의 평점, 루틴의 총 가격 등이 있었다. 이들은 getAllItems/Routines를 통해 전체 목록이 조회되는 시점에도 보여야 하는 정보라서 우선 엔터티를 변경할 필요가 있었다.
이를 위해 Query Builder를 사용하여 쿼리를 작성해주었다.
먼저 SQL문으로 내가 원하는 것을 작성하여 테스팅 한 후에 Query Builder로 작성해주었다.
여러 군데에 사용했다. 확실히 SQL문을 익히니 한번 하는 법을 알게되면 잘 써먹을 수 있다.
필터링 기능
루틴과 아이템 모두 필터링 기능이 필요했다. 전체 목록에서 필터를 적용하여 원하는 루틴만 조회할 수 있는 기능은 파라미터로 들어오는 쿼리를 기반으로 필터링하는 방식으로 구현했다.
루틴 목록에서 이런 식으로 사용자 이름도 보여주기 때문에 각 루틴과 연결되어 있는 사용자를 left inner join하여 해당 루틴을 생성한 사용자명도 함께 반환하도록 했다.