DEV_COURSE

투두리스트(2)

Lim임 2025. 9. 18. 04:27

트러블슈팅

출처

 

KeyboardEvent에는 isComposing이라는 값이 존재하는데, 문자가 조합 중인지를 boolean 값으로 알려준다.

현재 해결하고자 하는 문제가 한글이 조합 중인지를 판단하지 못해 발생한 문제이기 때문에 이를 사용하면 될 듯하다. 

따라서, 아직 글자가 조합 중인 경우에는 ealry return 시켜주고, 조합이 완료된 경우에만 태그 생성 로직을 실행시켰다.

 

const onKeyDown = (e) => {
if (e.key === 'Enter') {
e.preventDefault(); // 기본 동작 방지 (줄바꿈 방지)
if (e.nativeEvent.isComposing) return; // 한글 입력 중일 때는 무시
insertList();
}
};

 

e.prevenDefault();

Enter키의 기본행동은 두 가지이다

1. 줄바꿈 2. 폼 제출

그 두가지 행동을 제어해줍니다.

 

isComposing

글자가 조합중인지를 true/false를 통해 알려줌 (한글/일본어/중국어 등)

 

e.nativeEvent

isComposing함수를 사용하려면 e객체의 진짜 native한 내부를 써야함!!

 

---

react  beautiful dnd

출처

기껏 설치해놨더니 노드버전 안맞아 지원안해 이슈

 

챗지피티한테 물어봤더니

문법 또옥같은 포크버전 쓰라고 전해줌

 

npm install @hello-pangea/dnd

import {
  DragDropContext,
  Droppable,
  Draggable,
} from "@hello-pangea/dnd";

젠장안됨

 

열받네 너가 코드 고쳐?? 내가 손수할거야 이 ai녀석아 물론 널 따라할거지만

하나하나 손으로 치면서 이해하겠어

 

App.jsx

 

얘 말 보니까 일단 app.jsx 에 

태그안에 인라인으로 있었던 함수들을 모두 모아서~

변수?로 저장하고 그 변수를 불러와라 라는 것 같음

 

 

완전히 이해했으나

이따 코드리뷰할때 말해봐야겠다

 

근데 이해하고 나니까 개재밋음

이거맞나?

 

 

---

git untracked 이슈

 

폴더에 .git 파일이 숨겨져 있을거임

그거를 없애면 됨

 

땡스투빵재

그러나 어케 했는지 모르겠음

어케든,,해냈다,,,(내가아니고걔가,,,)

 

 

---

toast 알림띄우기

npm install react-hot-toast​

토스트(Toast) 알림이란?

화면의 한쪽 구석(예: 상단 중앙, 우측 상단 등)에 잠시 나타났다가 스르륵 사라지는 작은 메시지 창입니다. 사용자의 작업을 막지 않으면서 "성공적으로 추가되었습니다" 또는 "내용을 입력해주세요" 같은 피드백을 줄 수 있어 매우 유용합니다.

가장 인기 있고 사용하기 쉬운 라이브러리 중 하나인 **react-hot-toast**를 기준으로 구현 방법을 안내


react-hot-toast로 상냥한 알림창 띄우기 (단계별 가이드)
1단계: 라이브러리 설치하기
먼저 터미널을 열고 프로젝트 폴더에서 아래 명령어를 실행해 라이브러리를 설치합니다.


2단계: 앱 최상단에 알림 컨테이너 추가하기
토스트 알림이 앱 어디에서든 나타날 수 있도록, 알림을 관리하는 컴포넌트를 앱의 최상위 레벨(주로 App.jsx 또는 main.jsx)에 추가해야 합니다. App.jsx가 가장 간단합니다.

이 <Toaster /> 컴포넌트가 앞으로 모든 알림을 화면에 그려주는 역할을 합니다.

3단계: alert를 toast로 바꾸기
이제 알림을 띄우고 싶은 파일(예: InputBox.jsx)에서 toast 함수를 사용하면 됩니다.

toast 함수의 종류:

toast('기본 메시지'): 기본 스타일의 알림
toast.success('성공!'): 성공 아이콘과 함께 녹색 계열 알림
toast.error('실패!'): 실패 아이콘과 함께 붉은 계열 알림
toast.loading('로딩 중...'): 로딩 스피너 아이콘 알림
이처럼 간단한 몇 단계만으로 alert를 훨씬 보기 좋고 사용자 친화적인 토스트 알림으로 바꿀 수 있습니다. 직접 적용해 보세요

----

사라지는 효과 넣기

 

1. 원하는 위치에 transition 속성과 opacity 속성 부여하기

transition: all 0.5s ease-out;

all: 모든 속성을

ease-out : 부드럽게 처리

 

opacity:1 투명도 불투명으로 처리

 

 

+추가된 클래스 disappearing 추가

.disappearing {
opacity: 0;
transform: scale(0.95); /* 살짝 작아지는 효과 추가 */
}

---

 

드래그 중일때 잔상이 남는 오류

 

 

아마 브라우저의 렌더링 지연으로 판단된다고 함 코드뇨속이

Draggable의 snapshot 속성을 사용해 

 

snapshot.isDragging을 사용해 드래그 중일 때 opacity: 0 스타일을 적용하면, 브라우저가 렌더링을 지연하더라도 해당 항목은 투명해져서 테두리가 보이지 않게 하겠읍니다.

 

 

열받네 해결안됨

 

 

사진보내서 판단하라했더니

드래그앤 드롭하는데 원본을 숨기는 과정에서 브라우저 렌더링이 그 속도를 따라가지 못해서 발생한다

특히 li 의 border 스타일이<<

 

위에처럼 인라인으로만 해결하는 게 아니고

snapshot.isDragging이면 투명하게 만들어주는 class를 하나 생성해서 붙여줄거시긔

 

두근두근
ㅋㅋ

 

난장판

 

 

아니 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 되돌리래ㅋㅋㅋ너 내 시간이,,,그리 많아보이니?

 

내가 좀 쟤한테 말을 잘못한 것 같기도하고

졸린걸어떡해

 

전혀해결되지않음 뭐가문젤까

네, 알겠습니다. CSS로 해결이 안 되니, 사용자의 제안대로 App.jsx에서 드래그 상태를 직접 관리하는 방식으로 접근해 보겠습니다. 이 방법이 더 확실할 수 있습니다.

 

드래그가 시작되고 끝나는 시점을 App 컴포넌트가 직접 알게 하고, 드래그 중일 때만 전체 앱에 특정 클래스를 부여해서 문제를 해결해 보겠습니다.

원리
상태 추가: App.jsx에 isDragging이라는 상태를 추가하여, 현재 드래그 중인지 아닌지를 앱 전체가 알게 합니다.
상태 변경: 드래그가 시작되면(onDragStart) isDragging을 true로, 드래그가 끝나면(onDragEnd) false로 변경합니다.
전역 클래스 적용: isDragging이 true일 때, 앱의 최상위 div에 dragging-active 같은 클래스를 추가합니다.
CSS로 제어: 이 전역 클래스를 이용해, 드래그 중일 때만 잔상이 남는 마지막 li 항목을 제어하는 스타일을 적용합니다.
1단계: App.jsx 파일 수정
isDragging 상태와, 이 상태를 제어할 onDragStart, onDragEnd 함수를 수정합니다.

2단계: Cards.jsx 파일 수정
App.jsx에서 넘겨준 onDragStart를 DragDropContext에 연결합니다.

3단계: App.css 파일 수정
이제 전역 클래스 dragging-active를 사용해, 드래그 중일 때만 마지막 li의 테두리를 투명하게 만들어 잔상을 없앱니다.

중요: 위 코드의 ._listItem_1rqw_18 부분은 사용자 환경마다 다릅니다. 이것은 CSS 모듈이 자동으로 생성하는 클래스 이름입니다.

정확한 클래스 이름을 찾는 방법:

앱을 실행하고 개발자 도구(F12)를 엽니다.
리스트 항목(li) 중 하나를 선택(inspect)합니다.
class 속성에 있는 _listItem_으로 시작하는 긴 이름을 복사하여 위 CSS 코드에 붙여넣으세요.
이 방법은 드래그하는 동안에만 마지막 항목의 테두리를 강제로 투명하게 만들어, 렌더링 버그가 발생할 틈을 주지 않는 가장 확실한 해결책이 될 것입니다.

아몰라~~~~~~~~~~~~~~다음에 해결하자 중요한건저게아님!!!

 

---

카테고리 추가하기

🗺️ 카테고리 기능 구현 가이드
1️⃣ 데이터 구조 설계
현재 { id, text } → { id, text, category } 로 확장
기본 카테고리들 정의 (예: "개인", "업무", "쇼핑", "기타")
App.jsx에서 카테고리별로 todos를 그룹핑할 방법 고민
2️⃣ InputBox 컴포넌트 개선
텍스트 입력창 옆에 카테고리 선택 드롭다운 추가
선택된 카테고리와 함께 할 일 추가되도록 onAdd 함수 수정
CSS로 입력창과 드롭다운이 한 줄에 예쁘게 배치
3️⃣ Cards 컴포넌트 리팩토링
단일 Cards에서 → 카테고리별 여러 Cards로 변경
각 Cards에 카테고리 제목 헤더 추가
카테고리 간 드래그앤드롭 가능하도록 DragDropContext 범위 확장
4️⃣ App.jsx 상태 관리 업데이트
todos 배열을 카테고리별로 분류하는 로직 추가
onDragEnd에서 카테고리 간 이동 처리 로직 구현
카테고리별 할 일 개수 표시 기능 고려
5️⃣ UI/UX 개선사항
빈 카테고리도 표시할지 결정
카테고리별 색상 테마 적용
반응형 레이아웃 (모바일에서는 세로 배치)
🎯 구현 순서 추천
먼저 데이터 구조부터 변경
InputBox에 드롭다운 추가
카테고리별 필터링 로직 구현
Cards 컴포넌트 복수 렌더링
마지막에 드래그앤드롭 개선
💡 주의사항
기존 드래그앤드롭 기능이 깨지지 않도록 주의
카테고리 없는 기존 데이터 호환성 고려
카테고리 추가/삭제 기능도 나중에 확장 가능하게 설계

Claude Sonnet 4인데 꽤나 앙큼하게 일을 잘한다

 

 

개,,,,만은대,,,어케,,,,,여기다 올리지? 아무튼 얘가 가이드 해주기로 했다

 

 

---

트러블 슈팅

코드를 이리저리 옮기다가

저장했던 라이브러리의 정보가 package.json에 저장되지 않는 이슈가 생겼다

처음 라이브러리를 install 할 때 --save 옵션을 달면 package.json에 저장되는데(아니?npm install 라이브러리명만 해도 가능)

(분명하긴했는데 src파일만 옮겨와서 에러가 난 듯 하다)

 

 

npm install react-hot-toast

로 간단,, 해결

앞으로는 패키지.json 파일도 잘 챙기도록 하자

---

 

 

 

+ 251002추가)

코파일럿 코드를 그대로 긁어왔더니

코드부분이 모두 날아갔군요!!!

코파일럿의 코드는 휘발성인가요?? 참 나 

 

'DEV_COURSE' 카테고리의 다른 글

0923 핸들러 리팩토링 http 상태코드  (0) 2025.09.23
0919 POSTMAN  (0) 2025.09.19
0917 URL 객체 심층탐구  (0) 2025.09.17
git ignore  (0) 2025.09.11
0909 학습내용  (0) 2025.09.09