[javascript] Beautiful Dnd를 사용하여 드래그 앤 드롭으로 요소 회전시 충돌감지 및 회피하기

드래그 앤 드롭 기능을 구현할 때 요소의 충돌 감지와 회피는 중요한 요소입니다. 이를 위해 React 라이브러리에서 많이 사용되는 react-beautiful-dnd 라이브러리를 활용할 수 있습니다. 이 라이브러리를 사용하면 요소를 자유롭게 이동시킬 수 있으며, 회전 후 가능한 충돌을 탐지하고 회피할 수 있습니다.

Beautiful Dnd 설치하기

먼저 react-beautiful-dnd를 설치하려면 다음 명령어를 사용합니다:

npm install react-beautiful-dnd

이제 react-beautiful-dnd를 프로젝트의 main 파일에서 import 해줍니다:

import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';

충돌 감지하기

요소의 충돌을 감지하기 위해서는 react-beautiful-dndonDragEnd 콜백 함수를 사용합니다. 이 콜백 함수는 드래그 앤 드롭이 완료되었을 때 호출됩니다. 이 함수에서 충돌 검사 로직을 구현할 수 있습니다.

예를 들어, 드래그 앤 드롭 시 요소간 충돌을 감지하고 회피하는 간단한 예제를 살펴보겠습니다:

onDragEnd = (result) => {
  const { destination, source, draggableId } = result;

  if (!destination) {
    return;
  }

  // 충돌 검사 로직 구현
  const isCollision = checkCollision(source, destination);

  if (isCollision) {
    // 충돌이 발생한 경우 처리 로직 구현
    handleCollision();
  }
};

위의 예제에서 checkCollision 함수는 충돌을 검사하는 함수이며, handleCollision 함수는 충돌이 발생했을 때 처리하는 함수입니다. 이러한 로직을 사용하여 드래그 앤 드롭 시 요소간의 충돌을 감지하고 처리할 수 있습니다.

충돌 회피하기

충돌을 회피하기 위해서는 요소를 이동시키는 과정에서 충돌을 탐지하고 회피해야 합니다. react-beautiful-dnd는 요소를 이동시키기 전에 onDragUpdate 콜백 함수를 호출하여 이를 구현할 수 있습니다.

다음은 요소 이동 중 충돌을 회피하는 예제입니다:

onDragUpdate = (update) => {
  const { destination, source, draggableId } = update;

  if (!destination) {
    return;
  }

  // 충돌 검사 로직 구현
  const isCollision = checkCollision(source, destination);

  if (isCollision) {
    // 요소 이동을 회피하기 위해 유효하지 않은 드랍 영역을 제거
    const droppableId = destination.droppableId;
    const invalidDroppable = document.getElementById(droppableId);
    invalidDroppable.classList.add('invalid');
  }
};

위의 예제에서 checkCollision 함수는 충돌을 검사하는 함수입니다. 만약 충돌이 발생한다면, 유효하지 않은 드랍 영역을 가리키는 CSS 클래스를 추가하여 요소 이동을 회피합니다.

결론

react-beautiful-dnd 라이브러리를 사용하면 드래그 앤 드롭 기능을 구현할 때 충돌 감지 및 회피 기능을 쉽게 구현할 수 있습니다. onDragEnd 콜백 함수를 사용하여 드래그 앤 드롭이 완료된 후 충돌을 검사하고 처리할 수 있으며, onDragUpdate 콜백 함수를 사용하여 요소 이동 중 충돌을 회피할 수 있습니다.

관련 참고 자료: