칸반보드 팀 프로젝트 : 컬럼 기능 최적화
public interface TaskColumnRepository extends JpaRepository<TaskColumn, Long> {
/**원래 코드 : Board 조회후 연관된 TaskColumn 다시 조회
* 수정 코드 : Board와 TaskColumn 한 번의 쿼리로 조회 가능 **/
@Query("SELECT tc FROM TaskColumn tc JOIN FETCH tc.board WHERE tc.board.id = :boardId ORDER BY tc.columnOrder")
List<TaskColumn> findAllByBoardIdOrderByColumnOrder(@Param("boardId") Long boardId);
/**원래 코드 : 모든 컬럼을 메모리로 가져와 순서를 변경
* 수정 코드 : 데이터베이스에서 순서를 변경**/
@Modifying
@Query("UPDATE TaskColumn tc SET tc.columnOrder = tc.columnOrder - 1 WHERE tc.board.id = :boardId AND tc.columnOrder > :oldOrder AND tc.columnOrder <= :newOrder")
void decreaseOrderForIntermediateColumns(@Param("boardId") Long boardId, @Param("oldOrder") int oldOrder, @Param("newOrder") int newOrder);
@Modifying
@Query("UPDATE TaskColumn tc SET tc.columnOrder = tc.columnOrder + 1 WHERE tc.board.id = :boardId AND tc.columnOrder >= :newOrder AND tc.columnOrder < :oldOrder")
void increaseOrderForIntermediateColumns(@Param("boardId") Long boardId, @Param("oldOrder") int oldOrder, @Param("newOrder") int newOrder);
@Modifying
@Query("UPDATE TaskColumn tc SET tc.columnOrder = :newOrder WHERE tc.id = :columnId")
void updateColumnOrder(@Param("columnId") Long columnId, @Param("newOrder") int newOrder);
/**원래 코드 : 모든 컬럼을 조회하여 새 컬럼의 순서를 결정
* 수정 코드 : 데이터베이스에서 최대 순서 값만 조회하여 새 컬럼의 순서를 결정**/
@Query("SELECT COALESCE(MAX(tc.columnOrder), 0) FROM TaskColumn tc WHERE tc.board.id = :boardId")
int findMaxColumnOrderByBoardId(@Param("boardId") Long boardId);
}
public class TaskColumnService {
// 컬럼 순서 변경
@Transactional
public void updateTaskColumnOrder(Long columnId, int newOrder, User user) {
validateColumnManager(user);
TaskColumn column = taskColumnRepository.findById(columnId)
.orElseThrow(() -> new ColumnException(ResponseCodeEnum.COLUMN_NOT_FOUND));
int oldOrder = column.getColumnOrder();
if (oldOrder == newOrder) return;
if (oldOrder < newOrder) {
taskColumnRepository.decreaseOrderForIntermediateColumns(column.getBoard().getId(), oldOrder, newOrder);
} else {
taskColumnRepository.increaseOrderForIntermediateColumns(column.getBoard().getId(), oldOrder, newOrder);
}
taskColumnRepository.updateColumnOrder(columnId, newOrder);
}
}