Skip to content

[AIBE6/1팀/신재희] TODO APP 만들기 완료#48

Open
SHINJAEHEE-DEV wants to merge 16 commits intosik2:mainfrom
SHINJAEHEE-DEV:main
Open

[AIBE6/1팀/신재희] TODO APP 만들기 완료#48
SHINJAEHEE-DEV wants to merge 16 commits intosik2:mainfrom
SHINJAEHEE-DEV:main

Conversation

@SHINJAEHEE-DEV
Copy link

@SHINJAEHEE-DEV SHINJAEHEE-DEV commented Mar 18, 2026

📝 React Todo App

할 일 목록을 간단하고 직관적으로 관리할 수 있는 Todo 애플리케이션입니다.
React + Context API + Tailwind CSS v4를 기반으로 구성되었으며,
localStorage를 통한 데이터 영속성, 커스텀 포인트 컬러 및 다크 모드 지원,
모듈화된 컴포넌트 설계가 특징입니다.

✨ 주요 기능

  • 할 일 추가, 수정, 삭제
  • 🗂️ 할 일 완료 여부 체크
  • 🔄 새로고침에도 유지되는 localStorage 기반 데이터 저장
  • 전역 상태 관리를 위한 Context API 활용
  • 🌙 라이트/다크 모드 부드러운 전환 및 커스텀 컬러 피커 적용
  • 🎨 Tailwind CSS v4를 통한 깔끔하고 반응형인 UI 지원

📸 페이지 미리보기

🖼️ 앱 데모 동작 화면
App Demo

⚙️ 기술 스택

기술 설명
React UI 라이브러리
Context API React 내장 전역 상태 관리 로직
Tailwind CSS v4 유틸리티 기반 CSS 프레임워크
localStorage 브라우저 전역 저장소 (데이터 영속성 확보)
Vite 빠른 개발 서버 및 번들러 (프론트엔드 환경)

📁 프로젝트 구조

src/
├── components/         # 재사용 가능한 UI 컴포넌트
│   ├── Header.jsx
│   └── TodoItem.jsx
├── context/            # Context API 전역 상태 관리
│   └── TodoContext.jsx
├── index.css           # Tailwind 뼈대 및 글로벌 설정 파일
├── App.jsx             # 메인 최상단 컴포넌트
└── main.jsx            # 애플리케이션 엔트리포인트

🚀 실행 방법

# 패키지 설치
npm install

# 개발 서버 로컬 실행
npm run dev

🙋‍♀️ 리뷰 부탁드립니다!

@gemini-code-assist
Copy link

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 React 기반의 Todo 애플리케이션 개발을 완료합니다. Vite, React, Tailwind CSS, ESLint를 포함하는 현대적인 개발 환경을 구축했으며, 할 일 추가, 삭제, 수정, 완료 상태 토글 등 핵심 Todo 기능을 제공합니다. 또한, 다크 모드와 기본 색상 커스터마이징 기능을 통해 사용자 편의성을 높였고, 모든 상태는 React Context API를 통해 관리되며 로컬 스토리지에 저장되어 지속성을 보장합니다.

Highlights

  • 프로젝트 초기 설정: Vite를 사용하여 React 프로젝트를 초기화하고, Tailwind CSS를 통한 스타일링, ESLint를 통한 코드 품질 관리를 위한 개발 환경을 구축했습니다.
  • Todo 앱 핵심 기능 구현: 할 일 추가, 삭제, 수정, 완료 상태 토글 등 Todo 앱의 기본적인 CRUD 기능을 구현했습니다.
  • 상태 관리: React Context API를 활용하여 Todo 항목들의 상태를 효율적으로 관리하며, 로컬 스토리지를 통해 데이터를 영구적으로 저장하도록 구현했습니다.
  • 테마 및 색상 커스터마이징: 다크 모드 토글 기능과 기본 색상 변경 기능을 추가하여 사용자 경험을 향상시켰으며, 이 설정들은 로컬 스토리지에 저장됩니다.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

안녕하세요! TODO 앱 만들기 PR에 대한 피드백입니다. 전반적으로 React, Tailwind CSS, ESLint, Prettier 등 최신 프론트엔드 기술 스택을 잘 활용하여 TODO 앱의 기본 기능을 구현하고 개발 환경을 설정하신 점이 인상 깊습니다. 특히 다크 모드와 테마 색상 변경 기능은 사용자 경험을 고려한 좋은 추가 기능입니다. 몇 가지 개선할 점과 React 모범 사례에 대한 피드백을 드립니다.

onClick={() => {
if(isEditMode){
editTodo(todo.id, document.getElementById(`edit-${todo.id}`).value)
setIsEditMode(false);

Choose a reason for hiding this comment

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

high

React 컴포넌트 내에서 document.getElementById를 사용하여 DOM을 직접 조작하는 것은 권장되지 않습니다. React는 가상 DOM을 통해 DOM을 관리하므로, 이러한 직접적인 접근은 예상치 못한 동작이나 성능 문제를 일으킬 수 있습니다. 대신 useState 훅을 사용하여 입력 필드의 값을 관리하는 controlled component 패턴을 사용하는 것이 좋습니다. editedContent와 같은 상태를 도입하여 입력 필드의 값을 추적하고, editTodo 함수 호출 시 이 상태 값을 사용하도록 변경하는 것을 고려해 보세요.

const storedTodos = localStorage.getItem('todos');
return storedTodos ? JSON.parse(storedTodos) : [];
});
const lastId = useRef(0);

Choose a reason for hiding this comment

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

high

lastIduseRef로 관리되어 페이지가 새로고침되면 0으로 초기화됩니다. todoslocalStorage에 저장되어 유지되지만, lastId가 유지되지 않으면 페이지 새로고침 후 새로운 할 일을 추가할 때 기존 할 일과 ID가 중복될 수 있습니다. lastIdlocalStorage에 저장하여 지속성을 확보하거나, todos 배열에서 가장 큰 ID를 찾아 lastId를 초기화하는 로직을 추가하는 것이 좋습니다.

"singleQuote": true,
"trailingComma": "all",
"semi": false
} No newline at end of file

Choose a reason for hiding this comment

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

medium

파일의 마지막에 새 줄(newline)이 없습니다. 모든 텍스트 파일은 마지막에 새 줄을 포함하는 것이 좋은 관례입니다.

{
    "printWidth": 120,
    "tabWidth": 4,
    "singleQuote": true,
    "trailingComma": "all",
    "semi": false
}

},
},
rules: {
'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }],

Choose a reason for hiding this comment

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

medium

no-unused-vars 규칙에서 varsIgnorePattern: '^[A-Z_]' 패턴은 일반적으로 상수를 무시하는 데 사용되지만, 의도치 않게 다른 대문자 변수도 무시할 수 있습니다. 사용되지 않는 변수를 명시적으로 무시해야 하는 경우, 해당 라인에 // eslint-disable-next-line no-unused-vars 주석을 사용하는 것이 더 명확하고 안전합니다.

<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>react-todo-mession1</title>

Choose a reason for hiding this comment

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

medium

<title> 태그에 오타가 있습니다. mession 대신 mission으로 수정하는 것이 좋습니다.

Suggested change
<title>react-todo-mession1</title>
<title>react-todo-mission1</title>

@@ -0,0 +1,31 @@
{
"name": "react-todo-mession1",

Choose a reason for hiding this comment

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

medium

name 필드에 오타가 있습니다. mession 대신 mission으로 수정하는 것이 좋습니다. index.html<title> 태그와 일관성을 유지하는 것이 좋습니다.

Suggested change
"name": "react-todo-mession1",
"name": "react-todo-mission1",

Comment on lines +29 to +31
}, [])


Choose a reason for hiding this comment

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

medium

storedColor가 없을 때 setPrimaryColor를 호출하지 않고 CSS 변수만 설정하고 있습니다. 일관성을 위해 setPrimaryColor도 기본값으로 설정하는 것이 좋습니다. 이렇게 하면 primaryColor 상태가 실제 적용된 색상과 항상 동기화됩니다.

    } else {
      setPrimaryColor('#4F46E5');
      document.documentElement.style.setProperty('--color-primary', '#4F46E5');
    }

>Todo List _ JaeHee-Dev</h1>
<div className="flex items-center space-x-3">
<input
className="w-12 h-12 cursor-pointer border-0 p-0 rounded-ful"

Choose a reason for hiding this comment

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

medium

rounded-ful 클래스 이름에 오타가 있는 것 같습니다. rounded-full이 올바른 Tailwind CSS 클래스일 가능성이 높습니다.

            className="w-12 h-12 cursor-pointer border-0 p-0 rounded-full"

e.target.content.value = ""
}else{
alert("할 일을 입력해주세요.")
}

Choose a reason for hiding this comment

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

medium

사용자에게 피드백을 제공하기 위해 alert()를 사용하는 것은 사용자 경험 측면에서 좋지 않습니다. alert()는 브라우저의 동작을 멈추게 하므로, 대신 비차단 UI 요소(예: 토스트 알림, 인라인 메시지)를 사용하여 사용자에게 정보를 전달하는 것을 고려해 보세요.

text-[17px] text-app-text dark:text-app-dark-text
border-none rounded-2xl
p-4 w-70
focus:ring-primary

Choose a reason for hiding this comment

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

medium

w-70 클래스는 표준 Tailwind CSS 유틸리티 클래스가 아닙니다. 이 클래스가 tailwind.config.js에 사용자 정의 너비로 정의되어 있지 않다면, 스타일이 적용되지 않을 수 있습니다. 의도한 너비가 있다면 tailwind.config.jstheme.extend.width에 추가하거나, 표준 Tailwind 클래스 중 적절한 것을 사용하는 것을 고려해 보세요. max-w-70에도 동일하게 적용됩니다.

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.

1 participant