앱 목록 정렬 구현: comparator·안정성·성능 점검

핵심 요약
정렬은 알고리즘 이름보다 비교 함수가 일관된 순서를 만드는지, 동률 기준이 필요한지, 원본 목록을 변경해도 되는지를 먼저 정해야 합니다.

검수 범위
검증하기 어려운 후기 표현을 줄이고 Dart List.sort의 비교 함수 계약과 UI 목록 갱신 기준을 중심으로 검수했습니다.

실제 앱에서는 버블 정렬·선택 정렬·삽입 정렬을 직접 구현하기보다 언어와 데이터베이스가 제공하는 정렬 기능을 먼저 사용합니다. 중요한 것은 알고리즘 이름보다 비교 함수가 일관된 순서를 만드는지, 원본 목록 변경이 허용되는지, 동률 항목의 순서가 중요한지를 정하는 일입니다.

Dart List.sort의 기본 동작

List.sort는 목록 자체의 순서를 바꿉니다. 원본을 보존해야 한다면 복사본을 만든 뒤 정렬합니다.

final sortedProducts = [...products]
  ..sort((a, b) => a.price.compareTo(b.price));

원본 목록을 여러 화면이 공유하는데 바로 sort()를 호출하면 예상하지 못한 화면까지 순서가 바뀔 수 있습니다. 상태 관리 방식에 따라 새 목록으로 교체하고 변경을 알립니다.

비교 함수의 계약

비교 함수는 왼쪽 값이 앞이면 음수, 같으면 0, 뒤면 양수를 반환해야 합니다. 단순 숫자 비교를 a.price - b.price로 작성하기보다 compareTo를 사용하면 의도가 분명하고 숫자 표현 차이에도 안전합니다.

  • compare(a, b) < 0이면 a가 먼저
  • compare(a, b) == 0이면 같은 순서로 취급
  • compare(a, b) > 0이면 b가 먼저

a와 b를 바꿨을 때 결과 부호가 반대가 되고, a와 b가 같을 때 0이 나오는지 테스트해야 합니다. 상황에 따라 결과가 달라지는 비교 함수는 정렬 결과를 예측하기 어렵게 만듭니다.

동률 기준을 명시하기

Dart의 List.sort는 같은 값의 기존 순서를 항상 보존한다고 보장하지 않습니다. 가격이 같은 상품을 등록일 순으로 보여줘야 한다면 두 번째 비교 기준을 직접 넣습니다.

final sortedProducts = [...products]
  ..sort((a, b) {
    final byPrice = a.price.compareTo(b.price);
    if (byPrice != 0) return byPrice;
    return b.createdAt.compareTo(a.createdAt);
  });

null 값과 누락 데이터를 먼저 정하기

평점이나 날짜가 없는 항목을 처음, 마지막, 별도 그룹 중 어디에 둘지 제품 규칙이 필요합니다. 비교 함수 안에서 그때그때 처리하면 화면마다 결과가 달라질 수 있습니다. 서버 응답을 모델로 바꿀 때 누락 값의 의미를 확정하고 정렬 규칙에 반영합니다.

문자열과 한글 정렬

단순한 코드 단위 비교가 사용자가 기대하는 사전식 순서와 다를 수 있습니다. 대소문자, 숫자가 섞인 이름, 한글과 영문 혼합, 로케일 규칙이 중요한 경우 플랫폼이나 서버의 로케일 지원을 검토합니다. 검색 결과와 주소록처럼 정렬 품질이 핵심인 기능은 실제 사용자 데이터로 테스트해야 합니다.

데이터가 클 때는 서버 정렬 고려

수천 개 전체 데이터를 앱으로 받은 뒤 매번 정렬하면 네트워크와 메모리를 함께 낭비할 수 있습니다. 페이지네이션을 쓰는 목록은 서버나 데이터베이스에서 정렬 기준과 고유한 동률 기준을 적용해 받아오는 편이 일관적입니다. 예를 들어 가격 뒤에 상품 ID를 추가하면 다음 페이지에서도 항목이 중복되거나 빠지는 문제를 줄일 수 있습니다.

Flutter 화면에서의 점검

정렬 버튼을 누를 때마다 큰 목록을 동기적으로 정렬하면 프레임이 끊길 수 있습니다. 먼저 실제 항목 수와 프로파일링 결과를 확인하세요. 같은 기준을 반복 적용한다면 데이터 변경 시점에만 계산하거나 서버 결과를 재사용할 수 있습니다. 최적화 때문에 오래된 순서를 보여주지 않도록 캐시 갱신 조건도 함께 테스트합니다.

테스트해야 할 입력

  • 빈 목록과 항목 하나
  • 모든 비교값이 같은 목록
  • null 또는 누락 값이 섞인 목록
  • 이미 오름차순·내림차순인 목록
  • 동률 기준이 필요한 목록
  • 페이지 경계에 같은 값이 있는 서버 목록

정렬 알고리즘을 직접 구현하는 연습은 원리를 이해하는 데 유용하지만, 제품 코드에서는 표준 라이브러리의 계약을 이해하고 제품의 순서 규칙을 정확히 표현하는 것이 우선입니다.

페이지네이션 정렬의 고유 기준

서버에서 가격만으로 정렬한 뒤 페이지를 나누면 같은 가격의 항목이 페이지 사이에서 이동해 중복되거나 빠질 수 있습니다. 가격 뒤에 상품 ID처럼 고유하고 변하지 않는 두 번째 기준을 넣고, 다음 페이지 요청에도 같은 정렬 방향과 커서를 사용해야 합니다. 사용자가 정렬을 바꾸면 기존 페이지와 커서를 폐기하고 처음부터 요청합니다.

사용자 선택과 접근성

화면에 오름차순·내림차순 상태를 텍스트와 접근성 라벨로 알려주고, 데이터가 갱신되어 순서가 바뀌어도 현재 선택을 유지할지 제품 규칙을 정합니다. 정렬 버튼을 누른 직후 목록의 스크롤 위치가 갑자기 이동하면 사용자가 보던 항목을 잃을 수 있으므로 위치 유지와 맨 위 이동 중 적절한 동작을 테스트합니다.


검증 기준과 참고 자료

이 글은 2026-09-08에 아래 공식 문서와 공개 기술 문서를 기준으로 내용과 용어를 다시 검수했습니다. 제품 버전과 기기 제조사에 따라 화면 이름은 달라질 수 있으므로 실제 화면과 공식 문서를 함께 확인하세요.

관련 글