RISK IT

[TIL34_23.2.11] [1st-project] postman 갑자기 통신 안되는 에러 해결(router 순서 문제) 본문

IT/TIL

[TIL34_23.2.11] [1st-project] postman 갑자기 통신 안되는 에러 해결(router 순서 문제)

nomoremystery 2023. 2. 11. 16:31
반응형

작업 내용

상품 정보를 불러오는 엔드포인트를 리팩토링 하는 작업을 진행중이었다. 특정 서브 카테고리의 상품 조회와 필터링(query parameter) 기능을 구현 완료하고 다른 엔드포인트들도 포스트맨으로 실행시켜보았다. 그런데 productId로 상품 디테일을 불러오는 엔드포인트가 갑자기 작동하지 않는 문제가 발생했다. 상품 디테일 조회 엔드포인트는 처음에 잘 작동했고, 이번에 건들지도 않았는데 자꾸 통신이 실패하는 것이었다.

2월 9일에 올린 TIL에 적었듯이 잘 조회가 됐던 내용이었다.
(그 후로 테이블에 main, sub category id도 추가)

⬇️ 제품 상세 페이지 조회 코드

const getProductById = async (productId) => {
  return await mysqlDataSource.query(
    `
    SELECT
      p.id,
      p.sub_category_id,
      sub_c.name AS sub_category,
      sub_cat.main_category_id AS main_category_id,
      sub_cat.name AS main_category,
      p.name,
      p.image_url,
      p.description,
      prod_f.feeling_of_use,
      prod_s.scents,
      p.main_ingredient,
      p.ingredient,
      prod_o.options,
      prod_g.guides,
      pfm.formulation
    FROM products p
    INNER JOIN (
      SELECT
        sc.id,
        sc.name
      FROM sub_categories sc
    ) sub_c ON sub_c.id=p.sub_category_id
    INNER JOIN (
    SELECT
        subc.id,
        subc.main_category_id,
        mc.name
    FROM sub_categories subc
    INNER JOIN main_categories mc ON mc.id=subc.main_category_id
    ) sub_cat ON sub_cat.id = p.sub_category_id
    INNER JOIN (
        SELECT
            po.product_id,
            JSON_ARRAYAGG(
                JSON_OBJECT(
                    "size", po.size, 
                    "price", po.price
                )
            ) AS options
        FROM product_options po
        INNER JOIN products ON products.id = po.product_id
        GROUP BY po.product_id
    ) prod_o ON p.id=prod_o.product_id
    INNER JOIN (
        SELECT
            pps.product_id,
            JSON_ARRAYAGG(ps.scent) AS scents
        FROM products_product_scents pps
        INNER JOIN product_scents ps ON ps.id=pps.product_scent_id
        GROUP BY product_id
    ) prod_s ON p.id=prod_s.product_id
    INNER JOIN (
        SELECT
            ppf.product_id,
            JSON_ARRAYAGG(pf.name) AS feeling_of_use
        FROM products_product_feelings ppf
        INNER JOIN product_feelings pf ON pf.id=ppf.product_feeling_id
        GROUP BY product_id
    ) prod_f ON p.id=prod_f.product_id
    INNER JOIN (
        SELECT
            pg.product_id,
            JSON_ARRAYAGG(
                    JSON_OBJECT(
                        "image_url", pg.image_url, 
                        "usage_description", pg.usage_description,
                        "usage_amount", pg.usage_amount, 
                        "texture", pg.texture
                    )
                ) AS guides
        FROM product_guides pg
        INNER JOIN products prod ON prod.id=pg.product_id
        GROUP BY product_id
    ) prod_g ON p.id=prod_g.product_id
    INNER JOIN product_formulations pfm ON p.product_formulation_id=pfm.id
    WHERE p.id=?;
    `,
    [productId]
  );
};

뭐가 문젠가 하고 한참을 뜯어보았다. 원래 잘 됐던 코드이기에 오타일리는 없었지만, 그래도 하나하나 코드를 확인해보았다. 역시나 문제가 없었다.

내가 가진 단서는 터미널에서 보여주는 에러메시지 뿐이었다.

  code: 'ER_BAD_FIELD_ERROR',
  errno: 1054,
  sqlMessage: "Unknown column 'detail' in 'where clause'",

...


    'WHERE sub_cat.main_category_id=detail AND p.sub_category_id=5\n' +

이런 에러 메시지가 출력됐다. 애초에 나는 detail이란 칼럼도 없고 WHERE 조건 절에 있는 서브카테고리 아이디와 메인 카테고리 아이디를 조회하는 기능을 넣지 않았는데 왜 저런 에러메시지가 뜨는지 도무지 이해를 할 수가 없었다. detail은 상세페이지를 조회하기 위한 엔드포인트였는데 왜 저기에 들어가는지 이해가 안갔다.

단서를 찾았다

그러다가 문득! 라우터의 순서가 잘못됐다는 생각이 들었다. 에러메시지에 있는 조건절은 mainCategoryId와 subCategoryId로 상품을 조회하는 쿼리문인데, 저기에 detail이 들어가있는 것을 보니까 순간적으로 라우터의 순서가 중요하다고 배운 것이 떠오르면서 확인해 보기로 했다.

원래 라우터 순서 사진

변경 이후 라우터 순서 사진

순서를 바꾸고 나서, 다시 포스트맨으로 통신을 시도하니까 잘 됐다.

배운 점

  • 오류 메시지를 잘 뜯어보자.
  • 라우터의 순서를 잘 생각하자.
반응형