Skip to content

[2주차] 박유민 과제 제출합니다.#6

Open
waldls wants to merge 24 commits intoCEOS-Developers:masterfrom
waldls:waldls
Open

[2주차] 박유민 과제 제출합니다.#6
waldls wants to merge 24 commits intoCEOS-Developers:masterfrom
waldls:waldls

Conversation

@waldls
Copy link
Copy Markdown

@waldls waldls commented Mar 20, 2026

배포 링크

🔗React Todo


느낀 점 및 배운 점

HTML, CSS, JS로 구성된 기존 화면을 React로 다시 구현하는 경험은 거의 처음이라 초반에는 생각보다 어렵게 느껴졌습니다. 단순히 결과 화면만 비슷하게 만드는 것이 아니라, 기존 구조를 먼저 이해한 뒤 이를 React 방식에 맞게 다시 구성해야 했기 때문에 고민할 부분이 많았습니다. 그래도 지난 과제에서 작성했던 index.html 구조를 미리 정리해둔 덕분에 전체 흐름을 파악하기 훨씬 수월했고, 어떤 기준으로 컴포넌트를 분리하면 좋을지도 전보다 자연스럽게 판단할 수 있었습니다. 이번 과제를 통해 본격적으로 구현에 들어가기 전에 구조를 먼저 정리해보는 과정이 얼마나 중요한지 다시 한 번 체감했습니다.

대부분 React로 프로젝트를 진행해오긴 했지만, 이번 과제에서는 기능만 구현하고 끝난 것이 아니라 구현 방식 자체를 계속 돌아보게 되었습니다. 특히 컴포넌트를 어떤 기준으로 나누는 게 좋은지, 하나의 컴포넌트가 너무 많은 역할을 맡고 있는 것은 아닌지, 지금 구조가 나중에도 유지보수하기 괜찮을지, 역할을 더 나눌 수 있는 부분은 없는지 등을 계속 고민하게 되었습니다. 또 memo가 실제로 성능 최적화에 도움이 되는지, 아니면 비교 비용 때문에 오히려 비효율적일 수도 있는지를 이전보다 더 현실적으로 생각해보게 되었습니다. 이번 과제는 단순히 동작하게 만드는 데서 끝나는 것이 아니라, 왜 이런 구조와 방식을 선택했는지까지 고민해볼 수 있었다는 점에서 더 의미 있게 느껴졌습니다.

추가로 학습을 이어가면서 지연 초기화나 부수 효과처럼 이전에는 개념만 어렴풋하게 알고 있던 내용들도 이번 기회를 통해 조금 더 분명하게 이해할 수 있었습니다. 예전에는 용어만 알고 지나갔던 개념들이 실제로 코드를 작성하는 과정 속에서 어떤 상황에 필요한지 연결되어 보이기 시작한 것 같습니다. 덕분에 단순히 문법이나 사용법을 외우는 데 그치지 않고, React가 왜 이런 방식으로 동작하는지 조금 더 잘 이해하게 된 것 같습니다!

또 지난주 리뷰에서 남겨주신 내용도 반영하여 uuid를 직접 적용해보았습니다. 리뷰를 반영하는 과정에서 코드의 안정성뿐 아니라 전체 구조까지 함께 돌아볼 수 있었던 점도 의미 있었습니다. ㅎㅎ 이번 주도 편하게 리뷰 부탁드립니다!

++) 아래는 제가 추가로 공부하며 참고한 자료들입니다.


Review Questions

1. Virtual-DOM은 무엇이고, 이를 사용함으로서 얻는 이점은 무엇인가요?

image
  • Virtual-DOM(가상 돔)

    • 실제 DOM을 직접 조작하지 않고, 이를 가벼운 JavaScript 객체 형태로 메모리에 표현한 가상의 DOM
    • 상태가 변경되면 이전 Virtual DOM과 새로운 Virtual DOM을 비교해, 변경된 부분만 실제 DOM에 반영함
    • 즉, 화면 전체를 다시 바꾸는 것이 아니라 필요한 부분만 효율적으로 업데이트하기 위한 방식임
  • 이점

    • 불필요한 DOM 조작 감소 : 바뀐 부분만 업데이트해서 효율적
    • 렌더링 성능 개선 : 실제 DOM 접근을 최소화해 UI 업데이트 부담을 줄일 수 있음
    • 개발 편의성 향상 : 화면 갱신 로직을 직접 다루기보다 상태 변화에 집중할 수 있음
    • 유지보수에 유리 : UI를 상태 중심으로 관리할 수 있어 코드 흐름을 이해하고 수정하기 쉬움

2. React.memo(), useMemo(), useCallback() 함수로 진행할 수 있는 리액트 렌더링 최적화에 대해 설명해주세요. 다른 방식이 있다면 이에 대한 소개도 좋습니다.

  • React.memo()

    • 부모 컴포넌트가 다시 렌더링되더라도, 전달받은 props가 변경되지 않았다면 자식 컴포넌트의 렌더링을 건너뛰도록 도와주는 함수
    • 즉, 동일한 props로 불필요하게 다시 렌더링되는 컴포넌트를 줄이는 데 유용함
    • 다만 props 비교 비용이 크거나 props가 자주 바뀌는 경우에는 큰 효과가 없을 수도 있음
  • useMemo()

    • 계산 결과를 메모이제이션하여, 의존성 값이 변경되지 않으면 이전 값을 재사용하는 훅
    • 복잡한 연산 결과나, 렌더링마다 새로 만들 필요가 없는 값을 재사용할 때 활용할 수 있음
    • 이를 통해 불필요한 연산을 줄여 렌더링 비용을 낮출 수 있음
  • useCallback()

    • 함수를 메모이제이션하여, 의존성 값이 변경되지 않으면 동일한 함수 참조를 유지하는 훅
    • 함수를 props로 전달할 때 매 렌더링마다 새로운 함수가 생성되는 것을 방지할 수 있음
    • 특히 React.memo()와 함께 사용할 경우 자식 컴포넌트의 불필요한 재렌더링을 줄이는 데 도움이 됨

memo, useMemo, useCallback은 항상 사용하는 것이 아니라, 실제로 불필요한 렌더링이 발생하는 경우에 선택적으로 적용하는 것이 중요!

  • 그 외 렌더링 최적화 방법

    • 컴포넌트 분리 : 상태가 자주 바뀌는 부분만 분리해 필요한 영역만 렌더링되도록 구성할 수 있음
    • 상태 최소화 : 불필요하게 상위 컴포넌트에 state를 두지 않고, 필요한 범위에서만 관리하면 재렌더링 범위를 줄일 수 있음
    • 리스트 렌더링 최적화 : 안정적인 key를 사용하면 React가 변경 사항을 더 효율적으로 추적할 수 있음
    • 조건부 렌더링 활용 : 화면에 필요하지 않은 컴포넌트는 렌더링하지 않아 불필요한 비용을 줄일 수 있음

3. React 컴포넌트 생명주기에 대해서 설명해주세요.

React 컴포넌트의 생명주기는 컴포넌트가 생성되고, 업데이트되고, 제거되는 전체 과정을 의미
image

  • 마운트(Mount)

    • 컴포넌트가 처음 화면에 렌더링되는 단계
    • 이 시점에 데이터 요청, 초기 설정 등의 작업을 수행할 수 있음
  • 업데이트(Update)

    • props나 state가 변경되어 컴포넌트가 다시 렌더링되는 단계
    • 변경된 값에 따라 UI를 다시 계산하고 반영함
  • 언마운트(Unmount)

    • 컴포넌트가 화면에서 제거되는 단계
    • 이때 타이머 정리, 이벤트 리스너 제거 등 정리 작업을 수행해야 함
  • 함수형 컴포넌트에서의 생명주기

    • React는 클래스형 컴포넌트와 함수형 컴포넌트 방식 모두 지원하지만, 최근에는 함수형 컴포넌트와 Hooks를 사용하는 방식이 주로 사용됨
    • 함수형 컴포넌트에서는 클래스형 컴포넌트처럼 생명주기 메서드를 직접 사용하지 않고, 주로 useEffect()를 통해 관련 로직을 처리함
    • ex) 마운트 시 실행, 특정 값 변경 시 실행, 언마운트 시 정리 작업 등을 useEffect()로 구현할 수 있음

Copy link
Copy Markdown

@Wannys26 Wannys26 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

유민님 너무 완벽하게 잘 해주셔서 많이 배울 수 있는 코드였습니다!

렌더링 최적화도 너무 잘해주셨고..
반응형, 컴포넌트 분할, 버튼 공통 컴포넌트 구현 전부 너무 잘해주셨어요!!!
커밋 히스토리에도 많은 점을 고민하시고 개선하신게 보입니다ㅎㅎ
너무 잘해주셔서 딱히 남길 말이 없을 정도네요 하핳...ㅠ

유민님 정말 고생많으셨고 다음 과제도 어떻게 해주실 지 너무 기대되네요!! 😊😊

<section
className="w-105 shrink-0 flex flex-col gap-5 border-r-1.5 border-line p-7 bg-surface-alt overflow-y-auto max-cal:w-full max-cal:border-r-0 max-cal:border-b-1.5 max-cal:p-4 max-cal:grid max-cal:grid-cols-2 max-cal:gap-3"
role="region"
aria-labelledby="calendarTitle"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1주차 과제

1주차 과제때는 캘린더 헤더 영역에 aria-labelledby="calendarTitle"대응되는 id="calendarTitle"를 부여해주셨는데,
이번에는 누락된거 같습니다!

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://tailwindcss.com/blog/automatic-class-sorting-with-prettier
유민님 tailwind 클래스 자동정렬 플러그인 써보셔도 좋을거 같습니다!

@GirimNam
Copy link
Copy Markdown

GirimNam commented Mar 23, 2026

이번주에도 함께 코드리뷰를 하게 되어서 너무 좋습니다.. 이번주차 과제도 정말 수고 많으셨고 항상 좋은 리뷰들 남겨주셔서 감사합니다!! 선택이었던 ts 적용도 해주셔서 코드가 더 풍부해진거 같아요..! 코드 너무 완벽합니다..


export const useTodoStore = () => {
// lazy initializer로 최초 1회만 로컬 스토리지에서 불러옴
const [store, setStore] = useState<TodoStore>(loadStore);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

초기 상태를 lazy initializer로 설정해서 불필요한 localstorage 접근을 줄이신 점이 좋은 거 같아요!


// 특정 날짜에 새 할 일 추가
const addTodo = useCallback((date: Date, text: string) => {
const key = dateToKey(date);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

날짜를 key로 분리한 구조여서 데이터 접근과 확장이 용이해 보입니다! 근데 호출이 여러번 반복되는거 같아서 공통으로 빼시면 가독성이 아주 조금이지만 좋아질거 같아용..

size?: Size;
}

const variantClass: Record<Variant, string> = {
Copy link
Copy Markdown

@GirimNam GirimNam Mar 23, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

variant 타입을 제한하고 Record로 매핑해서 색깔별로 스타일을 지정해줘서 유지보수하기 더 좋아진거 같아요!

);
};

export default TodoSection;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

todo 섹션도 세부적으로 나눠서 유지보수와 가독성 측면에서 너무 좋은것 같아요!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants