정렬의 실무 — 인기순인데 왜 순서가 계속 바뀌죠?
다중 기준 · 안정 정렬 · key 함수
실무 정렬은 기준이 하나가 아닙니다. 1순위가 같을 때 2순위를 정해 주지 않으면 순서가 흔들려요.
고객 문의가 들어왔습니다.
"인기순으로 보는데, 새로고침할 때마다 상품 순서가 바뀌어요.
버그 아닌가요?"
확인해 보니 정말 그렇습니다. 판매량이 똑같이 0인 신상품 200개가
매번 다른 순서로 나옵니다. 코드는 분명히 ORDER BY 판매량 DESC 인데요.
버그가 아닙니다. 기준이 부족한 것입니다.
튜플을 key로 주면 앞에서부터 차례로 비교합니다.
key 함수 — 정렬의 진짜 도구
sorted(목록, key=함수) 에서 key는
"각 항목을 무엇으로 바꿔서 비교할까"를 정합니다.
key=lambda s: s["가격"] → 가격 오름차순
key=lambda s: -s["가격"] → 가격 내림차순 (숫자는 마이너스로 뒤집기)
key=lambda s: (-s["판매"], s["이름"]) → 판매 내림차순, 동점이면 이름 가나다순
reverse=True → 전체를 뒤집기 (단, 동점 순서도 뒤집힙니다 — 주의!)
실무에서 자주 쓰는 정렬 기준들
| 화면 | 1순위 | 동점 처리(2순위) | 이유 |
| 인기순 | 최근 7일 판매량 ↓ | 등록일 ↓ | 신상품이 뒤로 밀리지 않게 |
| 낮은 가격순 | 가격 ↑ | 배송비 ↑ · 상품ID ↑ | 같은 가격이면 배송비 싼 것 먼저 |
| 리뷰순 | 평점 ↓ | 리뷰 개수 ↓ | 리뷰 1개 5점이 1등이 되는 것 방지 |
| 주문 처리 | 우선순위 ↓ | 주문시각 ↑ | 같은 등급이면 먼저 온 순서 (11강) |
정렬 기준을 잘못 잡으면 조작하기 쉬운 목록이 됩니다.
🤔 확인 문제
인기순 정렬에서 판매량이 같은 신상품들의 순서가 새로고침마다 바뀝니다. 가장 올바른 해결책은?
해설 동점을 가를 기준이 없으면 순서는 보장되지 않습니다. 마지막에 상품ID처럼 유일한 값을 넣으면 순서가 완전히 확정돼요.
🤔 확인 문제
sorted(상품, key=lambda s: (s["판매"], s["이름"]), reverse=True) 의 결과는?
해설 reverse=True는 튜플 전체를 뒤집습니다. 이름까지 역순이 돼요. 각 기준을 따로 뒤집으려면 숫자에 -를 붙이는 방식을 쓰세요.
🤔 확인 문제
페이지를 넘겼는데 1페이지에서 본 상품이 2페이지에도 나옵니다. 가장 유력한 원인은?
해설 정렬 순서가 매 요청마다 달라지면 페이지 경계의 상품이 겹치거나 사라집니다. 유일한 값(상품ID)을 마지막 정렬 기준으로 넣는 것이 표준 처방이에요.