Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
cd9caa8
init: react-todo-app setup
HeungJunBag Mar 18, 2026
05fccac
App에서 할일 리스트, 등록 작업
HeungJunBag Mar 18, 2026
9bf4d14
할일 삭제
HeungJunBag Mar 18, 2026
a210075
수정하기 작업을 위한 데이터 구조 변경
HeungJunBag Mar 18, 2026
ddac7f6
고유 ID 추가
HeungJunBag Mar 18, 2026
88d3163
할일 수정하기
HeungJunBag Mar 18, 2026
c0eb0be
할일 체크 기능 추가
HeungJunBag Mar 18, 2026
06bd166
useRef 사용해서 아이디 값 증가
HeungJunBag Mar 18, 2026
d6c7491
등록 폼 컴포넌트 분리 - TodoWriteForm
HeungJunBag Mar 18, 2026
84f1741
목록 컴포넌트 분리 - TodoList
HeungJunBag Mar 18, 2026
a1f8c40
handleOnSubmit addTodo로 분리
HeungJunBag Mar 18, 2026
3712ad3
useTodos custom hooks 추가
HeungJunBag Mar 18, 2026
5dfe4de
TodoItem 컴포넌트 분리
HeungJunBag Mar 18, 2026
0f913b1
context api 적용
HeungJunBag Mar 18, 2026
1eb55d5
localStorage 연동
HeungJunBag Mar 18, 2026
3aa4faa
등록 폼에 placeholder 추가
HeungJunBag Mar 18, 2026
7ee0ea8
할 일 입력값 검증 기능 추가
HeungJunBag Mar 18, 2026
eb817d0
등록 폼 입력 후 초기화 기능 추가
HeungJunBag Mar 18, 2026
3b0a7a6
완료된 할일 항목 취소선 적용
HeungJunBag Mar 18, 2026
0e53639
남은 할 일 개수 표시
HeungJunBag Mar 18, 2026
99da9ee
전체 완료, 해제 기능
HeungJunBag Mar 18, 2026
104501b
할 일 수정 기능 (수정버튼)
HeungJunBag Mar 18, 2026
976d424
Tailwind PostCSS 플러그인 설정 및 스타일 적용
HeungJunBag Mar 18, 2026
fdae8ff
README 작성
HeungJunBag Mar 18, 2026
a0859b6
README 수정
HeungJunBag Mar 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

.env
.vite/
coverage/
7 changes: 7 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"printWidth": 120,
"tabWidth": 4,
"singleQuote": true,
"trailingComma": "all",
"semi": false
}
53 changes: 52 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,52 @@
# 리액트 투두 앱 만들기 미션 레포
# React Todo App

React와 Vite로 만든 할 일 관리 앱입니다.

## 실행 화면

| 기본 화면 | 할 일 추가 | 수정 모드 |
| :------------------------------------: | :------------------------------------: | :------------------------------------: |
| ![기본 화면](docs/screenshot_main.png) | ![할 일 추가](docs/screenshot_add.png) | ![수정 모드](docs/screenshot_edit.png) |

> 주요 기능

- 할 일 추가 / 삭제 / 수정
- 완료 체크 및 취소선 표시
- 전체 완료 / 전체 해제
- 남은 할 일 개수 표시
- LocalStorage를 이용한 데이터 영속성

## 기술 스택

- **React 19** — UI 구성
- **Vite 8** — 빌드 도구
- **Tailwind CSS v4** — 스타일링
- **Context API** — 전역 상태 관리
- **LocalStorage** — 데이터 저장

## 프로젝트 구조

```
src/
├── App.jsx # 루트 컴포넌트
├── main.jsx # 엔트리 포인트
├── index.css # Tailwind CSS 임포트
├── components/
│ ├── TodoWriteForm.jsx # 할 일 입력 폼
│ ├── TodoList.jsx # 할 일 목록
│ └── TodoItem.jsx # 할 일 항목
├── context/
│ └── TodoContext.jsx # 전역 상태 관리
└── utils/
└── storage.js # LocalStorage 유틸
```

## 시작하기

```bash
# 의존성 설치
npm install

# 개발 서버 실행
npm run dev
```
Binary file added docs/screenshot_add.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshot_edit.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshot_main.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
26 changes: 26 additions & 0 deletions eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import prettier from 'eslint-config-prettier'
import { defineConfig, globalIgnores } from 'eslint/config'

export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{js,jsx}'],
extends: [js.configs.recommended, reactHooks.configs.flat.recommended, reactRefresh.configs.vite, prettier],
languageOptions: {
ecmaVersion: 2020,

Choose a reason for hiding this comment

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

medium

parserOptions.ecmaVersion: 'latest'가 이미 설정되어 있으므로, 이 ecmaVersion: 2020 설정은 중복될 수 있습니다. parserOptions 내의 설정이 우선 적용됩니다.

globals: globals.browser,
parserOptions: {
ecmaVersion: 'latest',
ecmaFeatures: { jsx: true },
sourceType: 'module',
},
},
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

varsIgnorePattern: '^[A-Z_]'는 대문자로 시작하거나 밑줄로 시작하는 모든 변수를 무시하므로, 의도치 않게 사용되지 않는 React 컴포넌트나 중요한 변수를 놓칠 수 있습니다. 특정 유형의 변수만 무시하도록 패턴을 더 구체적으로 지정하는 것이 좋습니다.

},
},
])
13 changes: 13 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!doctype html>
<html lang="en">
<head>
<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-mission1</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>
Loading