포스트

corou : 추가 기능 구현과 오류 잡기

데이터베이스 문제

연휴를 맞아 블로그는 잠시 휴식을 가졌지만 프로젝트 개발은 꾸준하게 하루에 조금씩이라도 진행했다.

같이 작업중인 성준님과 약 3번의 회의를 가지며 혼자서 확인하기 어려운 부분들을 함께 조율해나가니 진행이 척척 됐다.

우선 루틴을 추가하는 쪽에서 오류가 있었는데 그 중 백엔드쪽 오류로는 데이터베이스쪽 식별자와 조인 문제가 많았다. 첫번째로 마주한 문제는, 루틴이 하나는 제대로 생성됐는데 또 다른 루틴을 생성할려고 하니 데이터베이스에 제대로 등록이 안되는 것이었다.

error

콘솔에 로그를 찍어 어디서 막히나 확인해보니 routine_detail을 생성하는 부분에서 막히고 있었다. 뜬 오류를 확인해보니 중복 키값때문에 그렇다고 뜬다. 분명히 나는 routine_detail은 복합키로 설계하여 routine_key + step_number의 조합으로 식별자를 설정했고 이에 따라 1(루틴키) + 1(스텝넘버), 1 + 2, 2 + 1, 2 + 2 등의 고유한 조합으로만 routine_detail을 생성하도록 설계했는데 왜 이런 문제가 생기는지 모르겠어서 코드를 면밀히 살펴보니…

join

관계를 만드는 부분이 잘못되어 있었다. One-to-one 관계로 routine_detail과 item을 연결해주다 보니 하나의 제품은 하나의 routine_detail에만 귀속되어 있던 것이다.

item_key가 1인 제품이 첫번째로 생성한 루틴의 routine_detail에 외래키로 주어져있어 해당 제품은 더 이상 다른 routine_detail에 연결될 수 없도록 설계되어 있었다.

이를 고치니 제대로 두 번째 루틴이 등록됐다.

routines routineDetail


두번째로 마주친 데이터베이스 문제는 조인과 관련된 문제였는데, 분명 SQL 자격증을 취득했음에도 실제로 써먹으려니 꽤나 까다로웠다. 인라인뷰와 이너조인을 사용해야 했던 경우가 꽤 있었는데, 여러 번의 시행착오를 거쳐야 했다.

우선 클라이언트에 보여줘야 할 데이터 중 제품과 루틴의 평점, 루틴의 총 가격 등이 있었다. 이들은 getAllItems/Routines를 통해 전체 목록이 조회되는 시점에도 보여야 하는 정보라서 우선 엔터티를 변경할 필요가 있었다.

routine item

이를 위해 Query Builder를 사용하여 쿼리를 작성해주었다.

sql querybuilder

먼저 SQL문으로 내가 원하는 것을 작성하여 테스팅 한 후에 Query Builder로 작성해주었다.

2 여러 군데에 사용했다. 확실히 SQL문을 익히니 한번 하는 법을 알게되면 잘 써먹을 수 있다.

필터링 기능

루틴과 아이템 모두 필터링 기능이 필요했다. 전체 목록에서 필터를 적용하여 원하는 루틴만 조회할 수 있는 기능은 파라미터로 들어오는 쿼리를 기반으로 필터링하는 방식으로 구현했다.

filter

page

루틴 목록에서 이런 식으로 사용자 이름도 보여주기 때문에 각 루틴과 연결되어 있는 사용자를 left inner join하여 해당 루틴을 생성한 사용자명도 함께 반환하도록 했다.

items 제품 조회에 대해서도 똑같이 적용해준다.


이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.