
이전에 노션에 작성해두었던 부분을 옮겨왔습니다.

Trello에서는 여러 개의 리스트를 만들고, 삭제할 수 있으며 존재하는 리스트들은 드래그&드랍을 통해 순서를 변경할 수 있습니다.
이때, 순서 변경을 어떻게 구현하는 것이 적절할지 고민이었습니다.
순서 컬럼을 1, 2, 3 등 연속적으로 증가하도록 설정하고 순서가 변경되면 연관된 모든 컬럼을 업데이트 하는 방법입니다.
아래와 같은 데이터가 있다고 가정하겠습니다.
| 리스트 ID | 순서 |
|---|---|
| A | 1 |
| B | 2 |
| C | 3 |
| D | 4 |
| E | 5 |
| F | 6 |
이 때, C가 D와 E 사이로 순서 변경이 된다면 아래처럼 변경됩니다.
| 리스트 ID | 순서 |
|---|---|
| A | 1 |
| B | 2 |
| C | 4 |
| D | 3 |
| E | 5 |
| F | 6 |
이렇게 구현하면 앞으로 나올 방법 중 구현이 가장 간단하다는 이점이 있습니다.
그러나 맨 앞 순서의 리스트가 삭제되었을 때나 맨 뒤 순서의 리스트가 맨 앞으로 순서 변경되었을 때와 같은 특정 상황에서 성능 저하가 발생할 수 있습니다.
예를 들어, 100개의 리스트가 존재할 때 100번째 리스트가 맨 앞 순서로 변경된다면 나머지 99개 리스트의 순서 컬럼이 1씩 증가되어야 합니다.
순서 컬럼을 100, 200, 300 등 간격을 두고 설정하고 순서가 변경되면 해당 컬럼만 중간값으로 업데이트 하는 방법입니다.
| 리스트 ID | 순서 |
|---|---|
| A | 100 |
| B | 200 |
| C | 300 |
| D | 400 |
| E | 500 |
| F | 600 |
이 때, C가 D와 E 사이로 순서 변경이 된다면 아래처럼 변경됩니다.
| 리스트 ID | 순서 |
|---|---|
| A | 100 |
| B | 200 |
| C | 450 |
| D | 400 |
| E | 500 |
| F | 600 |
이렇게 구현하면 순서 변경 시, 해당 리스트의 순서 컬럼만 수정하면 된다는 이점이 있습니다.
그러나 순서 변경이 잦은 경우에는 숫자 간 간격이 부족해질 수 있습니다.
이는 숫자 간 간격을 재할당하거나 혹은 처음부터 큰 간격을 지정함으로써 해결할 수 있지만, 이로 인해 로직이 더 복잡해지거나 데이터베이스 공간을 더 차지하는 단점들이 있을 수 있습니다.
순서 컬럼에서 이전 순서 리스트의 ID 값을 가리키게 만들어 LinkedList처럼 사용하는 방법입니다.
아래와 같은 데이터가 있다고 가정하겠습니다.
| 리스트 ID | 순서 |
|---|---|
| A | - |
| B | A |
| C | B |
| D | C |
| E | D |
| F | E |
이 때, C가 D와 E 사이로 순서 변경이 된다면 아래처럼 변경됩니다.
| 리스트 ID | 순서 |
|---|---|
| A | - |
| B | A |
| C | D |
| D | B |
| E | C |
| F | E |
이렇게 구현하면 순서 변경 시, 변경된 리스트와 연결된 리스트들의 컬럼만 수정하면 되므로 순서 변경이 용이합니다.
그러나 리스트를 조회할 때, 모든 순서 컬럼은 이전 순서 리스트의 ID만을 가지고 있기 때문에 순서대로 가져오는 것이 복잡합니다.
순서 정보를 Redis로 관리하고 특정 주기마다 DB에 업데이트 하는 방법입니다.
Redis의 SortedSet 자료구조를 이용해 각 항목의 순서를 score로 관리합니다.
이렇게 구현하면 순서 변경 시, Redis에서 score만 업데이트하면 되므로 순서 변경이 빠르고 효율적입니다. 또한, Redis의 빠른 조회 성능 덕분에 실시간으로 순서를 조회하고 수정하는 데 유리합니다.
그러나 Redis에 의존하게 되므로, 장애나 네트워크 단절 상황에 대비한 로직이 추가로 필요합니다.
만약 리스트가 몇 백개, 몇 만개 이상 존재하는 환경이라면 연속적으로 증가하는 순서 컬럼이 성능에 큰 문제가 될 수도 있지만 Trello는 주로 프로젝트를 관리하기 위해 사용하는 만큼 리스트는 주로 시작 전, 진행중, 완료와 같이 사용되는 경우가 많아 최대 10개 이상의 리스트를 생성하지는 않을거라고 판단하였습니다.
그렇기 때문에 연속적으로 증가하는 순서 컬럼의 방식으로 리스트의 순서 변경을 구현하였습니다.