'7월 14일' 견우직녀 달 둘째 주 일요일의 기록 [TIL]

가은·2024년 7월 14일
0

I Learned [본 캠프]

목록 보기
98/135
post-thumbnail

📑오늘 학습한 내용

칸반보드 팀 프로젝트 : 컬럼 기능 최적화

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);
    }
}
  • JPQL 사용
  • 콘솔에서 인덱스 사용
  • JOIN FETCH 사용

0개의 댓글