Trello프로젝트 진행 과정 중 내가 맡은 기능 중 하나인 Column 이동 기능에 대해서 글을 써보려고 한다.
처음에는 id값을 이동시켜보려고 했으나 id값은 중복이 되어서는 안되기때문에 index변수를 하나 더 만들어서 위치변화를 나타내기로 했다.
Column테이블에 columnIndex를 만들고 생성할 때마다 1씩 증가시켜주기 위해서 처음에는 @GeneratedValue를 사용하려고 했으나 위의 어노테이션은 @Id만 사용이 가능했기때문에 실패했다.
그래서 column을 생성할때마다 index값을 1증가시켜주는 방식으로 해결했다.
Long columnIndex = columnsRepository.countByBoardId(boardId)+1L;
처음에는 단순하게 swap을 사용하면 되는게 아닌가 라고 생각했지만, swap을 사용하게 되면 A와 C가 swap을 했을때의 결과가 원래 정상 동작했을 때의 결과물인 B-C-A가 아닌 C-B-A가 되게 된다.
간단하게 말해서 앞에 있는 컬럼이 뒤로가게되면 그 사이에 있던 컬럼들을 한칸씩 앞으로 밀어줘야한다.
for(Columns columns: columnsList) {
Long columnsIndex = columns.getColumnIndex();
if(currentColumnIndex < targetIndex) {
if(columnsIndex > currentColumnIndex && columnsIndex <= targetIndex) {
columns.setColumnIndex(columnsIndex-1);
}
} else if (currentColumnIndex > targetIndex) {
if(columnsIndex >= targetIndex && columnsIndex < currentColumnIndex) {
columns.setColumnIndex(columnsIndex+1);
}
}
}
기존의 모든 컬럼(columnsList)의 index, 현재 옮기려고하는 column의 index, 옮기려고하는 목표 index 총 3가지를 이용해서 현재 컬럼의 index가 목표 index보다 큰 경우와 작은 경우를 나누어서 기존의 컬럼들의 index값을 변경시켜주는 방식으로 해결하였다.