Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Skipalong's tistory

240102 TIL - 칸반보드 카드의 컬럼간 이동 본문

TIL

240102 TIL - 칸반보드 카드의 컬럼간 이동

Skipalong 2024. 1. 3. 00:19

저번 TIL 에서 작성했고 어려움을 겪었던 칸반보드 카드의 컬럼간 이동기능의 구현을 연휴기간동안 완성했다 문제를 어떻게 해결했는지를 정리해보겠다. 

 

  @Transactional
  public CardResponseDto changeColumn(Long cardId, ChangeColumnRequestDto requestDto) {
    Card card = findCard(cardId);

    Columns newColumns = columnRepository.findById(requestDto.getNewColumnsId()).orElseThrow(
        () -> new CustomException(ErrorCode.COLUMN_NOT_FOUND)
    );

    Integer currentSequence = card.getSequence();
    Integer newSequence = requestDto.getNewSequence();

    Long oldColumnsId = card.getColumns().getId();
    Long newColumnsId = newColumns.getId();

    int lastSequenceInOldColumns = cardRepository.countByColumnsId(oldColumnsId);

    card.setColumns(newColumns);

    int lastSequenceInNewColumns = cardRepository.countByColumnsId(newColumnsId);

    // 기존 컬럼에 있는 기존 카드의 시퀀스보다 큰 카드들은 시퀀스 -1
      cardRepository.decrementSequenceBetween(currentSequence + 1, lastSequenceInOldColumns, oldColumnsId);
	
    // 새로운 컬럼에 있는 새 시퀀스 보다 크거나 같은 카드들은 시퀀스 +1
      cardRepository.incrementSequenceBetween(newSequence, lastSequenceInNewColumns, newColumnsId);

    card.setSequence(newSequence);

    return new CardResponseDto(card);
  }

 

우선 처음에는 위에 보이는 changeColumn 메서드를 cardService에 추가했다. changeColumn메서드 안에서는 파라미터를 통해 cardId, requesetDto 에서 newColumnId와 newSequence값을 받아왔다. 그리고 받아온 값들을 통해 

  • 카드
  • 이동할 컬럼
  • 현재 순번
  • 바꿀 순번
  • 기존 컬럼 id
  • 바꿀 컬럼 id 
  • 기존 컬럼의 마지막 순번
  • 바꿀 컬럼의 마지막 순번(이동한 카드 포함)

등의 변수들을 받아와서 

 

    기존 카드의 시퀀스보다 큰 카드들은 시퀀스 -1
    새로운 컬럼에 있는 새 시퀀스 보다 크거나 같은 카드들은 시퀀스 +1

 

해주는 쿼리를 날린 뒤 마지막으로 카드의 순번을 새로 설정할 값으로 변경해주는 로직을 짰다.

 

이렇게 했을 때 처음에는 기능이 잘 작동하는 듯 보였다. 하지만 예외상황이 있었다.

현재 순번과 바꿀 순번이 같은값일때 컬럼 이동을 하면 순번이 +1이 된 채로 값이 저장되는 것이었다.

 

디버그를 해보고 로직을 하나하나 생각해봤지만 마지막 로직에 값을 설정하는 것이라서 원인을 찾기 힘들었다.

그러다가 api를 동작했을 때 hibernate에서 날라가는 쿼리를 살펴보니 card.setSequence(newSequence)를 했을때 update쿼리가 날라가야 하지만 그렇지 않은 것이었다. 그리고 디버그에서도 card의 sequence값은 정상적으로 나왔었다. 

 

이를통해 내가 생각하는 문제의 원인은 영속성컨텍스트의 문제라 생각했지만 아직 영속성컨텍스트를 다루는데 서툴러서 제대로된 해결책은 아닌 것 같지만

  @Transactional
  public CardResponseDto changeColumn(Long cardId, ChangeColumnRequestDto requestDto) {
    Card card = findCard(cardId);

    Columns newColumns = findColumn(requestDto.getNewColumnsId());

    Integer currentSequence = card.getSequence();
    Integer newSequence = requestDto.getNewSequence();

    Long oldColumnsId = card.getColumns().getId();
    Long newColumnsId = newColumns.getId();

    Integer lastSequenceInOldColumns = cardRepository.countByColumnsId(oldColumnsId);

    card.setColumns(newColumns);
    card.setSequence(null);

    Integer lastSequenceInNewColumns = cardRepository.countByColumnsId(newColumnsId);

    cardRepository.pullSequence(currentSequence + 1, lastSequenceInOldColumns, oldColumnsId);

    cardRepository.pushSequence(newSequence, lastSequenceInNewColumns, newColumnsId);

    card.setSequence(newSequence);

    return new CardResponseDto(card);

 

이렇게 레포지토리에 순서를 맞추는 작업을 하기 전 카드의 순번을 null값으로 설정 한 뒤 순번을 맞추는 작업 후 카드의 순번을 다시 정의해주니 순번이 정상적으로 들어가는 모습을 볼 수 있었다. 자세한 원인과 적절한 해결책은 튜터님에게 여쭤보아야 할 것 같지만 자체적으로 해결을 했다는데에 의의를 두면서 이번 프로젝트를 마무리 하였다. 

 

내일이면 이제 발표뒤 최종프로젝트 팀원이 공개되고 그 다음날부터 바로 최종프로젝트가 시작되니만큼 조금이라도 더 성장해서 최종프로젝트를 무사히 완성할 수 있도록 노력해야겠다!

'TIL' 카테고리의 다른 글

240105 TIL - 최종프로젝트 시작  (2) 2024.01.05
240103 TIL - Trello Project  (0) 2024.01.03
231229 TIL - 칸반보드의 카드 옮기기  (1) 2023.12.30
231228 TIL - 커서기반 페이징  (0) 2023.12.29
231227 TIL - Docker  (0) 2023.12.28