Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
11 changes: 11 additions & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"semi": false,
"singleQuote": true,
"trailingComma": "es5",
"bracketSpacing": true,
"arrowParens": "always",
"useTabs": false,
"tabWidth": 2,
"printWidth": 80,
"endOfLine": "lf"
}
Comment on lines +1 to +11
Copy link
Copy Markdown

@a-00-a a-00-a Mar 16, 2026

Choose a reason for hiding this comment

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

Prettier 를 이용해 개발 환경을 관리하셔서 코드가 전체적으로 깔끔하게 느껴졌습니다!
특히 "semi": false 설정 덕분에 JS 코드가 줄 끝이 시각적으로 깔끔하게 정리되어 있어 가독성이 좋았습니다.

개인적으로는 "singleQuote": true 설정 덕분에 HTML에서는 " " 를, JS에서는 ' ' 를 사용하여 파일별로 시각적으로 구분이 되어 코드 읽기가 훨씬 편했습니다!

79 changes: 30 additions & 49 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,60 +1,41 @@
# 1주차 과제: Vanilla Todo
# [CEOS 23rd Week1] - Vanilla Todo

# 서론
캘린더를 기준으로 날짜별 할 일을 관리하고, 오늘과 이번 달 진행 상황을 함께 확인할 수 있는 [Vanilla Todo](https://vanilla-todo-23rd.vercel.app/) 프로젝트입니다.

안녕하세요 🙌🏻 23기 프론트엔드 운영진 **원채영**입니다.
HTML, CSS, JavaScript만으로 캘린더 UI와 Todo 상태 관리를 직접 구현했습니다.

이번 미션은 개발 환경 구축과 스터디 진행 방식에 익숙해지실 수 있도록 간단한 **to-do list** 만들기를 진행합니다. 무작정 첫 스터디부터 React를 다루는 것보다는 왜 React가 필요한지, React가 없으면 무엇이 불편한지 느껴 보고 본격적인 스터디에 들어가는 것이 React를 이해하는 데 더 많은 도움이 될 것이라 생각합니다.
## 주요 기능

비교적 가벼운 미션인 만큼 코드를 짜는 데 있어 여러분의 ”**창의성**”을 충분히 발휘해 보시기 바랍니다. 작동하기만 하면 되는 것보다 같은 코드를 짜는 여러가지 방식과 패턴에 대해 고민해 보시고, 본인이 생각한 가장 창의적인 방법으로 코드를 작성해 주세요. 여러분이 미션을 수행하는 과정에서 겪는 고민과 생각의 깊이만큼 스터디에서 더 많은 것을 얻어가실 수 있을 것입니다.
- 날짜 선택 기반 Todo 추가, 완료, 삭제
- 월간 캘린더에서 날짜 이동 및 선택
- 오늘/월별 Todo 통계 제공
- `localStorage` 기반 데이터 저장
- 모바일과 데스크톱에 대응하는 반응형 UI

막히는 부분이 있더라도 우선은 스스로 공부하고 찾아보는 방법을 권고드리지만, 운영진의 도움이 필요하시다면 얼마든지 프론트엔드 카톡방에 편하게 질문을 남겨 주세요!
## 폴더 구조

# 과제
```text
vanilla-todo-23rd/
├─ index.html # 앱의 마크업 구조
├─ script.js # 캘린더, Todo, 통계 로직
└─ style.css # 전체 UI 스타일 및 반응형 스타일
```

## 목표
## 기술 스택

- VSCode, Prettier를 이용하여 개발 환경을 관리합니다.
- HTML/CSS의 기초를 이해합니다.
- JavaScript를 이용한 DOM 조작을 이해합니다.
- Vanilla Js를 이용한 어플리케이션 상태 관리 방법을 이해합니다.
| 구분 | 기술 | 사용 이유 |
| ---------- | -------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| Markup | <img src="https://img.shields.io/badge/html5-E34F26.svg?style=for-the-badge&logo=html5&logoColor=white" /> | 시맨틱한 구조로 캘린더, 통계, Todo 입력/목록 UI를 구성하기 위해 사용 |
| Styling | <img src="https://img.shields.io/badge/css3-663399.svg?style=for-the-badge&logo=css&logoColor=white" /> | 레이아웃, 상태별 스타일, 반응형 UI를 직접 제어하기 위해 사용 |
| Language | <img src="https://img.shields.io/badge/javascript-F7DF1E.svg?style=for-the-badge&logo=javascript&logoColor=black" /> | 캘린더 렌더링, Todo CRUD, 통계 계산 등 동적인 동작을 구현하기 위해 사용 |
| Formatting | <img src="https://img.shields.io/badge/prettier-1A2B34.svg?style=for-the-badge&logo=prettier&logoColor=F7B93E" /> | 코드 포맷을 일관되게 유지해 가독성과 유지보수성을 높이기 위해 사용 |
| Deploy | <img src="https://img.shields.io/badge/vercel-000000.svg?style=for-the-badge&logo=vercel&logoColor=white" /> | 정적 웹 앱을 배포하고 실제 동작을 빠르게 확인하기 위해 사용 |

## 기한
## 실행 방법

- 2026년 3월 14일 토요일 23:59까지
```bash
git clone -b waldls https://github.com/waldls/vanilla-todo-23rd.git
cd vanilla-todo-23rd
```

## Review Questions

- DOM은 무엇인가요?
- 이벤트 흐름 제어(버블링 & 캡처링)이 무엇인가요?
- 클로저와 스코프가 무엇인가요?

## 필수 요건

- [결과 화면](https://vanilla-todo-21th-jet.vercel.app/)의 기능을 구현합니다. (날짜, 요일별 todo 개수)
- 결과 링크의 화면 디자인 그대로 구현해도 좋고, 자신만의 디자인을 적용해도 좋습니다.
- CSS의 Flexbox를 이용하여 레이아웃을 구성합니다.
- JQuery, React, Bootstrap 등 외부 라이브러리를 사용하지 않습니다.
- 함수와 변수의 이름은 lowerCamelCase로 짓습니다.
- 코딩의 단위를 기능별로 나누어 Commit 메세지를 작성합니다.
- Semantic tag를 활용하여 HTML 구조를 완성합니다.

## 선택 요건

- 외부 폰트 Pretendard를 적용합니다.
- 브라우저의 `localStorage` 혹은 `sessionStorage`를 이용하여 다음 번 접속 시에 기존의 투두 데이터를 불러옵니다.
- 미디어쿼리를 이용해서 반응형을 적용합니다.
- 이 외에도 추가하고 싶은 기능이 있다면 마음껏 추가하셔도 됩니다.

# 링크 및 참고자료

- [HTML/CSS 기초](https://heropy.blog/2019/04/24/html-css-starter/)
- [HTML 태그](https://heropy.blog/2019/05/26/html-elements/)
- [FlexBox 가이드](https://heropy.blog/2018/11/24/css-flexible-box/)
- [JS를 통한 DOM 조작](https://velog.io/@bining/javascript-DOM-%EC%A1%B0%EC%9E%91%ED%95%98%EA%B8%B0#append)
- [localStorage, sessionStorage](https://www.daleseo.com/js-web-storage/)
- [git 사용법](https://wayhome25.github.io/git/2017/07/08/git-first-pull-request-story/)
- [좋은 코드리뷰 방법](https://tech.kakao.com/2022/03/17/2022-newkrew-onboarding-codereview/)
- [MDN 공식문서-createElement()](https://developer.mozilla.org/en-US/docs/Web/API/Document/createElement)
- [MDN 공식문서-appendChild()](https://developer.mozilla.org/ko/docs/Web/API/Node/appendChild)
- [DOM 개념,HTML 요소 조작](https://poiemaweb.com/js-dom#3-dom-query--traversing-%EC%9A%94%EC%86%8C%EC%97%90%EC%9D%98-%EC%A0%91%EA%B7%BC)
이후 `index.html`을 브라우저에서 열면 별도의 빌드 과정 없이 바로 실행할 수 있습니다.
86 changes: 86 additions & 0 deletions index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
<!doctype html>
<html lang="ko">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vanilla Todo</title>
<link rel="stylesheet" href="style.css" />
</head>
<body>
<div id="app">
<header id="appHeader">
<h1>Vanilla Todo</h1>
</header>
<main id="appMain">
<section id="calendarSection">
<div id="calendar" role="region" aria-labelledby="calendarTitle">
<div id="calendarHeader">
<button id="prevMonthBtn" aria-label="이전 달">&#9664;</button>
<span id="calendarTitle"></span>
<button id="nextMonthBtn" aria-label="다음 달">&#9654;</button>
</div>
<div id="calendarWeekdays" role="row">
<span>일</span>
<span>월</span>
<span>화</span>
<span>수</span>
<span>목</span>
<span>금</span>
<span>토</span>
</div>
<div id="calendarDays" role="grid"></div>
</div>
<aside id="todayStats" role="region" aria-label="오늘 통계">
<div id="todayStatsHeader">
<p id="todayStatsText" aria-live="polite"></p>
<span id="todayStatsPercent" aria-live="polite"></span>
</div>
<div
id="todayProgressBarTrack"
role="progressbar"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="0"
aria-label="오늘 완료율"
>
<div id="todayProgressBarFill"></div>
</div>
</aside>
<aside id="monthStats" role="region" aria-label="이번 달 통계">
<div id="statsHeader">
<p id="statsText" aria-live="polite"></p>
<span id="statsPercent" aria-live="polite"></span>
</div>
<div
id="progressBarTrack"
role="progressbar"
aria-valuemin="0"
aria-valuemax="100"
aria-valuenow="0"
aria-label="이번 달 완료율"
>
<div id="progressBarFill"></div>
</div>
</aside>
</section>
<section id="todoSection" aria-label="할 일 목록">
<h2 id="selectedDateTitle"></h2>
<div id="todoListWrapper">
<ul id="todoList" aria-live="polite" aria-label="할 일 목록"></ul>
</div>
<div id="todoInputArea">
<input
type="text"
id="todoInput"
placeholder="할 일을 입력하세요"
autocomplete="off"
aria-label="할 일 입력"
/>
<button id="todoAddBtn">추가</button>
</div>
</section>
</main>
</div>
<script src="script.js"></script>
</body>
</html>
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

시맨틱 태그를 꼼꼼하게 달아주셔서 코드를 읽는 것만으로도 발표 때 보여주셨던 그림이 상상됩니다!

Loading