Conversation
minseo0614
left a comment
There was a problem hiding this comment.
2주차 과제 고생 많으셨습니다!
코드를 전체적으로 깔끔하게 작성해주셔서 보기 편했고 저도 많이 배울 수 있었습니다.
| const dateKey = formatDateKey(currentDate); | ||
| const currentTodos = todosByDate[dateKey] || []; |
There was a problem hiding this comment.
dateKey를 기준으로 현재 날짜의 todo만 꺼내 쓰는 흐름이 직관적이라 전체 로직을 이해하기 쉬웠습니다. 날짜별 상태 구조를 깔끔하게 잡으신 것 같아요!
| return ( | ||
| <div className="w-full rounded-2xl bg-blue-50 px-4 py-3 text-sm font-medium text-blue-700"> | ||
| 남은 할 일 {remainingCount}개 | ||
| </div> | ||
| ); | ||
| } |
There was a problem hiding this comment.
남은 할 일 수를 바로 보여주는 점이 좋았습니다! 여기에 완료된 개수까지 같이 보여주면 사용자가 현재 상태를 더 직관적으로 파악할 수 있을 것 같아요 :)
| setInputValue(""); | ||
| } | ||
|
|
||
| function handleKeyDown(event) { |
There was a problem hiding this comment.
isComposing까지 체크해주신 점이 좋았습니다! 한글 입력 환경까지 꼼꼼하게 고려하신 것 같아요.
Tutankhannun
left a comment
There was a problem hiding this comment.
이번 주차 과제도 수고하셨습니다~ 컴포넌트 단위도 적당하고 리액트와 tailwind의 장점을 잘 활용하신 것 같습니다. 리액트 프로젝트 환경 셋팅에 더 익숙해지면 좋아지실 것 같아요. 다음 과제에서는 파비콘과 prettier 설정도 충분히 해보실 수 있을 것 같습니다!! 앞으로도 이렇게 성실한 과제로 잘부탁드립니다~
| @@ -0,0 +1,13 @@ | |||
| <!doctype html> | |||
| <html lang="en"> | |||
| @@ -0,0 +1,184 @@ | |||
| .counter { | |||
There was a problem hiding this comment.
사용하지 않는 레거시 CSS들은 정리해주시는 것이 좋습니다. 이후의 유지보수 비용이나 혼란을 늘릴 수 있습니다.
| <div className="flex items-center gap-3"> | ||
| <input | ||
| type="checkbox" | ||
| checked={todo.completed} | ||
| onChange={() => onToggleTodo(todo.id)} | ||
| className="h-5 w-5 accent-blue-500" | ||
| /> | ||
| <span | ||
| className={`text-base ${ | ||
| todo.completed ? "text-slate-400 line-through" : "text-slate-700" | ||
| }`} | ||
| > | ||
| {todo.text} | ||
| </span> | ||
| </div> |
| <span | ||
| className={`text-base ${ | ||
| todo.completed ? "text-slate-400 line-through" : "text-slate-700" | ||
| }`} | ||
| > | ||
| {todo.text} | ||
| </span> |




느낌점: 저번주 과제와는 다르게 React와 Tailwind CSS는 처음 다뤄보기 때문에 시작부터 어려웠습니다. HTML / CSS / JS는 각각 파일을 구성하고 시작하는 것에 비해 React는 CLI를 통해 Vite와 결합된 파일을 만들어야 했습니다. 그리고 내부의 파일 구성 또한, 이전과는 다른 형태인 점에서도 난관을 겪었습니다. 일주일이 생각보다 짧아 React와 Tailwind CSS를 공부하기에 시간이 부족하여 다크 모드 등 일부 기능들을 이전 과제와 100% 동일하게 구현하지 못한 점이 아쉬웠습니다.
이전 과제 기능 중 input를 한국어로 받을 때 중복으로 입력되었던 부분은
isComposing을 이용하여 입력 중 일 때는 입력을 받지 않고, 입력이 끝났을 때 등록되도록 리팩토링 했으며, 날짜 변경에서 일부 코드가 동일한 부분은 인자를 받도록 수정하였습니다.또한, 지난 과제에서 Vercel를 통한 배포가 되지 않아 Github에서 배포를 진행하였습니다. 그러나 Github를 통해서 이후 대규모 과제에서 배포가 어려울 것이라는 조언을 통해 Vercel를 통해 배포를 진행하려고 했습니다. 배포 처음에는 Branch가 master로 설정되어 변경해도 이동하지 않아 여러 방법을 시도했습니다. 실제 파일 변경이 없더라도 새로운 커밋을 강제로 생성하여 연결된 Vercel 프로젝트의 자동배포 트리거로 사용하기 위해 새로운 커밋을 집어넣은 것이 효과가 있었으며, 정상적으로 배포를 마무리하였습니다.
초기 구성:
배포링크
Review Questions
1) Virtual-DOM은 무엇이고, 이를 사용함으로서 얻는 이점은 무엇인가요?
Virtual DOM : UI 효율성을 극대화하기 위해 DOM의 가벼운 복사본을 메모리 상에서 유지 관리하는 기술
작동 방식 :
2) React.memo(), useMemo(), useCallback() 함수로 진행할 수 있는 리액트 렌더링 최적화에 대해 설명해주세요. 다른 방식이 있다면 이에 대한 소개도 좋습니다.
React.memo()
React.memo()로 래핑 될 때, React는 컴포넌트를 렌더링하고 결과를 Memoizing함. 그 다음 렌더링이 일어날 때 props가 같다면 Memoizing된 내용을 재사용함.React.memo()는 함수형 컴퍼넌트에 적용되어 같은 props에 같은 렌더링 결과를 제공함. 따라서 같은 props로 자주 렌더링 될 때 해당 함수로 래핑하는 것이 좋음.useMemo()
useCallback()
3) React 컴포넌트 생명주기에 대해서 설명해주세요.
생명주기 : 컴포넌트가 생성되고 사용되고 소멸될 때까지 일련의 과정
라이프 사이클 이벤트 : 생명주기 안에서 특정 시점에 자동으로 호출되는 메서드
라이프 사이클 이벤트 분류