친구와 프로젝트를 하던 중 구현 로직에 막힌 부분이 있었다.
우리가 플레이리스트를 생각해보면 노래의 순서가 굉장히 중요하다. 빵빵 터지는 음악이 계속될 수도, 터지다가 가라 앉을 수도, 가라 앉다가 다시 터지게 노래를 배치할 수 있다. 즉, 노래의 순서는 계속해서 취향에 따라 바뀔 수 있는 부분이다. 그렇다면 이 부분에 대한 로직은 어떻게 작성되어야 할까?
1번 - 4번 까지의 노래가 있다는 가정 하에
4번이 1번과 2번 사이의 위치하기 위해 이동시킨다면, 배열이라면 거의 전부가 이동해야한다. 1번 4번 2번 3번 -> 2 3 4가 모두 이동해야하는 비효율적인 코드이다.
그렇다면 딕셔너리 형태로 구현한다면 {노래_id: index} 꼴 : [{1 : 1 }, {2 : 2} , {3 : 3}, {4 : 4}] 여기서도 마찬가지로 하나 하나 요소에 접근하는 것은 빠르지만, 전부 다 바꿔야 할 것이다. [{1:1},{4:2},{2:3},{3:4}]
뭔가 순서가 바뀔 때마다 계속해서 업데이트가 일어나는 것이 올바른 상황일까?
당연하게 순서가 바뀌고 저장되면 업데이트는 일어나야 한다. 하지만 업데이트가 일어날 때마다 너무나 많은 양의 연산이 들어간다. 그러면 이 부분을 어떻게 하면 줄일 수 있을까. 또한 프론트와 백 중에서 어느 부분에서 이 업무를 하는게 맞을까?
백이 하게 된다면, 즉각적인 정보 접근이 어렵다. 순서를 한 번, 두 번 바꾸는 것이 아니라 계속 바꾸게 될 것이고, Music_id가 없는 상황에서 index 정보와 결과 만으로 어떤 노래가 살아남게 되었는 지 알기가 어렵다. (이 상황이면 결국 playlist를 통으로 갈아버리고 새로 업데이트를 해야한다)
해당 부분에 대한 결과로는
이런 로직을 통해 구현하는 것으로 하였다. 저 index의 변화의 경우 프론트에서 저장을 한 후, 백 쪽으로 결과만 전송하게 된다. 이렇게 하여 playlist_music 테이블의 인덱스 값만 업데이트를 하고 삭제된 노래의 경우 -1의 인덱스를 전송하게 되어 playlist_music 테이블을 삭제하게 된다.
float값이 계속해서 업데이트 될 경우 1.5 -> 1.25 -> 1.125 ... 등의 기하급수적으로 자릿수가 늘어나게 되며 금방 제한될 수 있다.
따라서 한번 사용한 값은 언젠가 다시 1 , 2 ... 등의 int 값으로 업데이트 해줘야 한다.
이 경우 float index의 최소 간격(threshold)을 정한 후 해당 값 보다 작아지게 되면 re-indexing을 시켜줘야 한다.
추가적으로 유지하는 입장이 아닌 프론트의 호출 입장에선, ORDER BY index 를 통하여 실수 / 정수 상관없이 불러오면 된다.
re-indexing의 경우는 playlist_id로 접근하여 전체 노래에 대해서 전부 크기 순으로 index를 새로 할당하면 된다.
이런 로직으로 플레이리스트의 노래 인덱스를 관리하게 된다.
| [Redis] 바이트 반환 값 (1) | 2025.07.24 |
|---|---|
| [백엔드 논문] Zanzibar: Google's Consistent, Global Authorization System #1 (2) | 2025.07.23 |
| [Serendi] 프로젝트 #3.1 DB 수정 (0) | 2025.07.13 |
| [Serendi] 프로젝트 #3 DB설계 (0) | 2025.07.03 |
| [Serendi] 프로젝트 #2 - 이메일 인증 (0) | 2025.07.01 |