Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,14 @@ AND NOT EXISTS (
SELECT
hr.mountain_id AS mountainId,
m.name AS mountainName,
m.image_url AS imageUrl,
m.image_urls->>0 AS imageUrl,
COUNT(hr.id) AS hikingCount,
MAX(hr.created_at) AS lastHikedAt
FROM hiking_records hr
JOIN hiking_members hm ON hm.hiking_record_id = hr.id
JOIN mountains m ON m.id = hr.mountain_id
WHERE hm.user_id = :userId
GROUP BY hr.mountain_id, m.name, m.image_url
GROUP BY hr.mountain_id, m.name, m.image_urls->>0
ORDER BY MAX(hr.created_at) DESC, hr.mountain_id DESC
Comment on lines 35 to 46

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

PostgreSQL에서는 GROUP BY 절에 테이블의 기본 키(Primary Key)인 m.id를 지정하면, 해당 테이블의 다른 컬럼들(m.name, m.image_urls->>0 등)은 함수적 종속성(Functional Dependency) 덕분에 GROUP BY 절에 개별적으로 나열하지 않고도 SELECT 절에서 자유롭게 조회할 수 있습니다.\n\n현재 쿼리에서는 m.image_urls->>0과 같은 복잡한 표현식이 SELECTGROUP BY 양쪽에 중복되어 작성되어 있어, 향후 이미지 조회 로직이 변경될 때 두 곳 모두 수정해야 하는 유지보수 상의 번거로움이 있습니다.\n\n따라서 SELECT 절에서 hr.mountain_id 대신 m.id를 조회하고, GROUP BY 절을 m.id로 단순화하면 쿼리의 가독성과 유지보수성을 크게 향상시킬 수 있습니다.

Suggested change
SELECT
hr.mountain_id AS mountainId,
m.name AS mountainName,
m.image_url AS imageUrl,
m.image_urls->>0 AS imageUrl,
COUNT(hr.id) AS hikingCount,
MAX(hr.created_at) AS lastHikedAt
FROM hiking_records hr
JOIN hiking_members hm ON hm.hiking_record_id = hr.id
JOIN mountains m ON m.id = hr.mountain_id
WHERE hm.user_id = :userId
GROUP BY hr.mountain_id, m.name, m.image_url
GROUP BY hr.mountain_id, m.name, m.image_urls->>0
ORDER BY MAX(hr.created_at) DESC, hr.mountain_id DESC
SELECT\n m.id AS mountainId,\n m.name AS mountainName,\n m.image_urls->>0 AS imageUrl,\n COUNT(hr.id) AS hikingCount,\n MAX(hr.created_at) AS lastHikedAt\n FROM hiking_records hr\n JOIN hiking_members hm ON hm.hiking_record_id = hr.id\n JOIN mountains m ON m.id = hr.mountain_id\n WHERE hm.user_id = :userId\n GROUP BY m.id\n ORDER BY MAX(hr.created_at) DESC, m.id DESC
References
  1. 우선순위 가이드에 따라 유지보수성(Maintainability) 및 가독성(Readability)을 개선하기 위해 중복된 표현식을 제거하고 쿼리를 단순화합니다. (link)

""",
countQuery = """
Expand Down