Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
f1bccdc
1주차 미션 완료
2yunkind Mar 22, 2026
4a53337
chore: week1로 폴더 구조 변경
2yunkind Mar 26, 2026
4b49579
chore: 리액트 프로젝트 세팅
2yunkind Mar 26, 2026
4cda6f4
feat:mission1 진행
2yunkind Mar 26, 2026
664ef82
fix: package 오류 수정
2yunkind Mar 26, 2026
5c8248a
feat :미션 2 중간 저장
2yunkind Mar 29, 2026
4b95ae9
refactor: 미션 1 파일 분리
2yunkind Mar 29, 2026
70af5bb
refactor: 미션 2 파일 분리
2yunkind Mar 29, 2026
f279e50
Merge pull request #5 from SWU-UMC/week1/yunsl-m1
yewon20804 Mar 29, 2026
234b4d0
Merge branch 'yunsl' into week2/yunsl-m1
2yunkind Mar 29, 2026
998ddbc
Merge pull request #18 from SWU-UMC/week2/yunsl-m1
yewon20804 Apr 2, 2026
37a7c9d
feat: 3주차 미션 1 진행 완료
2yunkind Apr 2, 2026
0c047e6
feat: 3주차 미션 2 완료
2yunkind Apr 2, 2026
83d4e97
3주차 미션 최종
2yunkind Apr 2, 2026
fee4fc2
React Router를 사용하지 않고, Single Page Application 만들어보기 완료
2yunkind Apr 3, 2026
f7d7956
4주차 미션 1, 2 완료
2yunkind Apr 9, 2026
23bb567
미션3 env 보안
2yunkind Apr 9, 2026
330c9cf
4주차 env보안
2yunkind Apr 11, 2026
a3bef0b
미션3 완료
2yunkind Apr 12, 2026
40dfc0a
저장
2yunkind Apr 12, 2026
c51db0b
저장
2yunkind Apr 12, 2026
6b8460b
저장
2yunkind Apr 12, 2026
1e519f6
Merge pull request #30 from SWU-UMC/week3/yunsl-m2
yewon20804 Apr 30, 2026
ef7e1cd
Merge branch 'yunsl' into wee3/yunsl-test
2yunkind Apr 30, 2026
c11eaac
Merge pull request #32 from SWU-UMC/wee3/yunsl-test
yewon20804 Apr 30, 2026
bad97c1
chore: node_module 삭제
2yunkind Apr 30, 2026
3de8d30
chore: mission3 node_module 삭제
2yunkind Apr 30, 2026
c496f56
Merge branch 'yunsl' into wee4/yunsl-m2
2yunkind Apr 30, 2026
f6f6895
Merge pull request #38 from SWU-UMC/wee4/yunsl-m2
yewon20804 Apr 30, 2026
3011eae
Merge branch 'yunsl' into week4/yunsl-m3
2yunkind Apr 30, 2026
8ad3fd8
Merge pull request #39 from SWU-UMC/week4/yunsl-m3
yewon20804 Apr 30, 2026
f68a0be
7주차 미션 1,2 완료
2yunkind May 18, 2026
e3a2c7a
7주차 미션 1,2 완료-2
2yunkind May 19, 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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
1 change: 0 additions & 1 deletion README.md

This file was deleted.

17 changes: 17 additions & 0 deletions test/test.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<html lang="ko">
<head>
<meta charset="UTF-8" />
<title>test</title>
</head>
<body>
<nav>
<a href="/" data-link>홈</a>
<a href="/about" data-link>소개</a>
<a href="/contact" data-link>문의</a>
</nav>

<div id="app"></div>

<script src="test.js"></script>
</body>
</html>
26 changes: 26 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
const app = document.getElementById("app");

// 라우트별 화면 정의
const routes = {
"/": () => "<h1>홈</h1><p>여기는 홈입니다.</p>",
"/about": () => "<h1>소개</h1><p>소개 페이지입니다.</p>",
"/contact": () => "<h1>문의</h1><p>문의 페이지입니다.</p>",
};

// 렌더링 함수
function render(path) {
const view = routes[path] || (() => "<h1>404 Not Found</h1>"); // A||B =>A가 있으면 A를 쓰고 없으면 B를 쓰라는 의미
app.innerHTML = view();
}

// 링크 클릭 처리 (페이지 새로고침 방지)
document.addEventListener("click", (e) => {
if (e.target.matches("[data-link]")) {
e.preventDefault();
const path = e.target.getAttribute("href"); //클릭한 경로 가져오기

history.pushState(null, null, path);
render(path); //렌더 실행
}
});

87 changes: 87 additions & 0 deletions week1/project1.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>UMC Todo</title>
<style>

li{
list-style-type: none;
display: flex;
justify-content: space-between; /* 텍스트 왼쪽, 버튼 오른쪽 */
margin-bottom: 10px;

}

body {
background: #dfe6e9;
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}

#container {
background: white;
padding: 20px;
border-radius: 10px;
width: 350px;
text-align: center;
}



input {
flex: 1;
padding: 5px;
}

button {
background: green;
color: white;
border: none;
padding: 5px 10px;
border-radius: 5px;
cursor: pointer;
}
section{
width: 80%;
padding: 0;
margin-left: 50px;
justify-content: space-between;
display: flex;
}






</style>

</head>
<body>

<div id="container">
<h1>YONG TODO</h1>
<input type="text" id="box" placeholder="">
<button id="add-btn">할 일 추가</button>
<section>
<div>
<h2>할 일</h2>
<ul id="todo-list1"></ul>
</div>


<div>
<h2>완료</h2>
<ul id="todo-list2"></ul>
</div>

</section>
</div>
<script src="script.js"></script>
</body>
</html>
55 changes: 55 additions & 0 deletions week1/script.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
var input = document.getElementById("box");
var list1 = document.getElementById("todo-list1");
var list2 = document.getElementById("todo-list2");
var addBtn = document.getElementById("add-btn");
// 상태
var todos = [];
var doneTasks = [];
// 화면 그리기
var renderTask = function () {
list1.innerHTML = "";
list2.innerHTML = "";
// 🔹 할 일 리스트
todos.forEach(function (todo) {
var li = document.createElement("li");
li.textContent = todo.text;
var btn = document.createElement("button");
btn.textContent = "완료";
btn.onclick = function () {
todos = todos.filter(function (t) { return t.id !== todo.id; });
doneTasks.push(todo);
renderTask();
};
list1.appendChild(li);
li.appendChild(btn);
});
// 🔹 완료 리스트
doneTasks.forEach(function (todo) {
var li = document.createElement("li");
li.textContent = todo.text;
var btn2 = document.createElement("button");
btn2.textContent = "삭제";
btn2.style.backgroundColor = "red";
btn2.onclick = function () {
doneTasks = doneTasks.filter(function (t) { return t.id !== todo.id; });
renderTask();
};
list2.appendChild(li);
li.appendChild(btn2);
});
};
// 할 일 추가
var addTodo = function () {
var text = input.value.trim();
if (text === "")
return;
todos.push({
id: Date.now(),
text: text,
});
input.value = "";
renderTask();
};
// 버튼 클릭
addBtn.onclick = addTodo;
renderTask();
77 changes: 77 additions & 0 deletions week1/script.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
const input = document.getElementById("box") as HTMLInputElement;
const list1 = document.getElementById("todo-list1") as HTMLUListElement;
const list2 = document.getElementById("todo-list2") as HTMLUListElement;
const addBtn = document.getElementById("add-btn") as HTMLButtonElement;

// 타입
type Todo = {
id: number;
text: string;
};

// 상태
let todos: Todo[] = [];
let doneTasks: Todo[] = [];

// 화면 그리기
const renderTask = (): void => {
list1.innerHTML = "";
list2.innerHTML = "";

// 🔹 할 일 리스트
todos.forEach((todo) => {
const li = document.createElement("li");

li.textContent = todo.text;

const btn = document.createElement("button");
btn.textContent = "완료";

btn.onclick = () => {
todos = todos.filter((t) => t.id !== todo.id);
doneTasks.push(todo);
renderTask();
};
list1.appendChild(li);
li.appendChild(btn);


});

// 🔹 완료 리스트
doneTasks.forEach((todo) => {
const li = document.createElement("li");
li.textContent = todo.text;

const btn2 = document.createElement("button");
btn2.textContent = "삭제";
btn2.style.backgroundColor = "red";

btn2.onclick = () => {
doneTasks = doneTasks.filter((t) => t.id !== todo.id);
renderTask();
};
list2.appendChild(li);
li.appendChild(btn2);


});
};

// 할 일 추가
const addTodo = (): void => {
const text = input.value.trim();
if (text === "") return;

todos.push({
id: Date.now(),
text,
});

input.value = "";
renderTask();
};

// 버튼 클릭
addBtn.onclick = addTodo;
renderTask();
24 changes: 24 additions & 0 deletions week2/project01/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# 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?
73 changes: 73 additions & 0 deletions week2/project01/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# React + TypeScript + Vite

This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.

Currently, two official plugins are available:

- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Oxc](https://oxc.rs)
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/)

## React Compiler

The React Compiler is not enabled on this template because of its impact on dev & build performances. To add it, see [this documentation](https://react.dev/learn/react-compiler/installation).

## Expanding the ESLint configuration

If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:

```js
export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
// Other configs...

// Remove tseslint.configs.recommended and replace with this
tseslint.configs.recommendedTypeChecked,
// Alternatively, use this for stricter rules
tseslint.configs.strictTypeChecked,
// Optionally, add this for stylistic rules
tseslint.configs.stylisticTypeChecked,

// Other configs...
],
languageOptions: {
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
// other options...
},
},
])
```

You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:

```js
// eslint.config.js
import reactX from 'eslint-plugin-react-x'
import reactDom from 'eslint-plugin-react-dom'

export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
// Other configs...
// Enable lint rules for React
reactX.configs['recommended-typescript'],
// Enable lint rules for React DOM
reactDom.configs.recommended,
],
languageOptions: {
parserOptions: {
project: ['./tsconfig.node.json', './tsconfig.app.json'],
tsconfigRootDir: import.meta.dirname,
},
// other options...
},
},
])
```
23 changes: 23 additions & 0 deletions week2/project01/eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import js from '@eslint/js'
import globals from 'globals'
import reactHooks from 'eslint-plugin-react-hooks'
import reactRefresh from 'eslint-plugin-react-refresh'
import tseslint from 'typescript-eslint'
import { defineConfig, globalIgnores } from 'eslint/config'

export default defineConfig([
globalIgnores(['dist']),
{
files: ['**/*.{ts,tsx}'],
extends: [
js.configs.recommended,
tseslint.configs.recommended,
reactHooks.configs.flat.recommended,
reactRefresh.configs.vite,
],
languageOptions: {
ecmaVersion: 2020,
globals: globals.browser,
},
},
])
Loading