Line에서 드래그 앤 드롭 리스트의 정렬을 구현하는 방법에 대해서 설명한 글입니다. 여기서 드래그 앤 드롭 리스트라는 것은 todo 리스트 등 어떤 리스트가 있을 때 다양한 정렬 기능을 제공할 수
Line에서 드래그 앤 드롭 리스트의 정렬을 구현하는 방법에 대해서 설명한 글입니다. 여기서 드래그 앤 드롭 리스트라는 것은 todo 리스트 등 어떤 리스트가 있을 때 다양한 정렬 기능을 제공할 수 있지만 사용자가 드래그 앤 드롭으로 순서를 바꾸게 하는 경우 이 정렬 순서를 저장해 두어야 하기 때문에 필요한 내용입니다. 이 방법에는 보통 Integer, GreenHopper, Linked List가 있습니다. Interger는 각 아이템이 숫자 값을 가지고 있고 드래그 앤 드롭으로 위치를 변경하면 정렬된 순서대로 숫자가 정렬되어야 하므로 하위 모든 아이템의 숫자값도 변경해 주어야 합니다. GreenHopper는 1, 100, 200처럼 각 아이템사이에 충분한 숫자 간격을 두어서 정렬 순서가 바뀌더라도 그 중간의 숫자를 사용하도록 하는 방식이다. 평소에는 잘 동작하지만 잦은 이동으로 아이템 사이의 간격이 모두 고갈되면 문제가 생깁니다. Linked List는 위치 이동을 하더라고 각 앞뒤 아이템만 업데이트해 주면 되므로 간편하지만 전체를 조회할 때는 풀 스캔을 해야합니다. 이 세가지 방식의 문제를 해결하기 위해 Jirra를 만드는 Atlassian에서 LexoRank라는 방식을 만들었습니다. 이 방식은 Bucket|FixedKey:VariableKey 형태의 값을 사용하는데 앞의 Bucket을 이용해서 사전적 정렬을 이용할 수 있고 정렬을 할때 버킷을 순환해 가면서 만들고 간격 고갈시의 문제도 VariableKey를 활용할 수 있습니다. 드래그 앤 드롭 정렬은 자주 사용하는 UI라서 꽤 친숙하면서도 직접 구현해보거나 고민하지 않으면 이러한 어려움을 깨닫기 어려운데 이 글에서 다양한 방법과 해결책을 잘 정리해 주어서 재밌었습니다. https://techblog.lycorp.co.jp/ko/about-atlassian-jira-ranking-algorithm-lexorank