Skip to content

leehwarang/javascript-web-todo

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

58 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

React based To-Do application

๐Ÿ“๋ฆฌ์•กํŠธ๋กœ ๊ตฌํ˜„ํ•œ ํ•  ์ผ ๊ด€๋ฆฌ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

Overview

  • ๋ฐ๋ชจ ๋งํฌ

  • ์‚ฌ์šฉ๋œ ์–ธ์–ด ๋ฐ ํ”„๋ ˆ์ž„ ์›Œํฌ: react, css/Scss, node.js, express

  • ์„œ๋ฒ„ ๋ฐฐํฌ: heroku

  • ๊ธฐํƒ€(ํŠธ๋žœ์Šค ํŒŒ์ผ๋ง, ๋ฒˆ๋“ค๋ง) : webpack, babel


1. ๊ธฐ๋Šฅ

ํ•  ์ผ ๊ด€๋ฆฌ ์•ฑ

  • ํ•  ์ผ ์ถ”๊ฐ€
    • ์ถ”๊ฐ€๋œ ํ•  ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ Doing
  • All, Doing, Completed ๊ตฌ๋ถ„ํ•ด์„œ ๋ณด์—ฌ์ง€๋Š” ํ•  ์ผ ๋ฆฌ์ŠคํŠธ
    • react-router๋ฅผ ์ด์šฉํ•œ ๋ผ์šฐํŒ…๊ณผ fallback ์ฒ˜๋ฆฌ
  • ํ•  ์ผ ๋ฆฌ์ŠคํŠธ์˜ ์ƒํƒœ ๋ณ€๊ฒฝ ์‹œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜
  • ์ƒํƒœ ์ „ํ™˜
    • Fold ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•  ์ผ ๋ฆฌ์ŠคํŠธ ๋ณด์ด๊ธฐ <-> ์ˆจ๊ธฐ๊ธฐ ์ „ํ™˜
    • ์ฒดํฌ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ Doing <-> Completed ์ „ํ™˜
  • ํœด์ง€ํ†ต ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ํ•  ์ผ ์‚ญ์ œ

2. Webpack ์„ค์ •

2-1. package.json์„ ํ™œ์šฉํ•˜์—ฌ build ์„ค์ •

  • dev์™€ production ๋ถ„๋ฆฌ

    • ๊ฐœ๋ฐœ์šฉ url ๊ณผ ๋ฐฐํฌ์šฉ url์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด definePlugin ์‚ฌ์šฉ
    • build ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์‹œ NODE_ENV ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์ „๋‹ฌ
// package.json์˜ scripts ์ฝ”๋“œ

 "scripts": {
    "start": "node app.js",
    "dev-server": "webpack-dev-server --open --config webpack.config.dev.js",
    "build": "webpack --config webpack.config.js",
    "dev-build": "NODE_ENV=dev webpack --config webpack.config.js"
  },
// webpack.config.js์˜ plugins ์ฝ”๋“œ
const url =
  process.env.NODE_ENV === "dev"
    ? `http://localhost:3000/todos`
    : "https://michelle-todo.herokuapp.com/todos";


  plugins: [
    new CleanWebpackPlugin(),
    new HtmlWebpackPlugin({template: `./public/index.html`}),
    new webpack.DefinePlugin({URL: JSON.stringify(url)})
  ]

2-2. CRA ์—†์ด webpack, babel ์„ค์ •


3. ๋ฆฌ์•กํŠธ Hooks

3-1. ๋ชฉ์ ์— ๋งž๋Š” ๋ฆฌ์•กํŠธ Hooks ์‚ฌ์šฉ

  • useState: ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์€ ์ƒํƒœ๊ฐ€ ์žˆ์„ ๋•Œ

    • AddTodo์—์„œ input์ฐฝ์— ์ž…๋ ฅ์ด ๋ฐœ์ƒํ•  ๋•Œ ๋งˆ๋‹ค ๋ณ€ํ•˜๋Š” ๊ฐ’์„ ๊ด€๋ฆฌ
    • Navigation์—์„œ Fold ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ ๋งˆ๋‹ค ๋ณ€ํ•˜๋Š” ๊ฐ’์„ ๊ด€๋ฆฌ
const AddTodo = () => {
  const [inputValue, setInputValue] = useState("");
}
const Navigation = () => {
  const [toggle, setToggle] = useState(true);
}
  • useEffect: ์ฒซ ๋ Œ๋”๋ง ์‹œ์—๋งŒ / ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚  ๋•Œ ๋งˆ๋‹ค / ์–ด๋–ค ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งŒ ์‹คํ–‰ ์‹œํ‚ค๊ณ  ์‹ถ์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์„ ๋•Œ

    • useFetch(custom hook)์—์„œ ์ฒซ ๋ Œ๋”๋ง ์‹œ์—๋งŒ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ์š”์ฒญํ•˜๋Š” ํ•จ์ˆ˜ ์‹คํ–‰
const useFetch = (cbFunc, url, errorHandler) => {

  const fetchInitialData = async (cbFunc, url, errorHandler) => {
    try {
      // ๋ฐ์ดํ„ฐ ์š”์ฒญ
    } catch (errorMsg) {
      // ์—๋Ÿฌ ์ฒ˜๋ฆฌ
    }
  };

  useEffect(() => {
    fetchInitialData(cbFunc, url, errorHandler);
  }, []);

  return loading;
};
  • createContext: ๊ณ„์ธต์ด ๋ณต์žกํ•˜๊ฑฐ๋‚˜ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•ด์ฃผ๊ณ  ์‹ถ์„ ๋•Œ

    • TodoStore์ด ๊ด€๋ฆฌํ•˜๋Š” value๋“ค์„ children ์ปดํฌ๋„ŒํŠธ๋“ค์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •

export const TodoContext = React.createContext({});

export const ToDoStore = ({ children }) => {
  const [datas, dispatch] = useReducer(TodoReducer, []);

  const [error, setError] = useState(false);
  const loading = useFetch(setInitTodoData, URL, errorHandler);

  const { todoCnt, doneCnt } = filterdData(datas);

  return (
    <>
      <TodoContext.Provider
        value={{ datas, error, loading, dispatch, todoCnt, doneCnt }}
      >
        {children}
      </TodoContext.Provider>
    </>
  );
};
  • useReducer: ์ปดํฌ๋„ŒํŠธ์˜ ๋‚ด๋ถ€ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์‹ถ์„ ๋•Œ

    • ToDoStore์—์„œ ๊ด€๋ฆฌํ•˜๋Š” datas(ํ•  ์ผ ๋ชฉ๋ก)์„ ์ˆ˜์ •, ์ถ”๊ฐ€, ์‚ญ์ œ ํ•˜๋Š” ๋กœ์ง์„ TodoReducer๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌ
const TodoReducer = (todoData, { type, payload }) => {
  switch (type) {
    case "INIT_TODO": {}
    case "ADD_TODO": {}
    case "CHANGE_TODO": {}
    case "DELETE_TODO": {}
  }
};

About

๐Ÿ“๋ฆฌ์•กํŠธ๋กœ ๊ตฌํ˜„ํ•œ ํ•  ์ผ ๊ด€๋ฆฌ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • JavaScript 84.5%
  • CSS 13.9%
  • HTML 1.6%