Code Monkey home page Code Monkey logo

issuetracker-20's People

Stargazers

 avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

issuetracker-20's Issues

์Šคํ† ๋ฆฌ: GitHub oAuth ๋กœ๊ทธ์ธ

์ด๋ฆ„

GitHub oAuth ๋กœ๊ทธ์ธ

์š”์•ฝ ์„ค๋ช…

  • WHO: ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๊ฐ€
  • WHY: ์ž์‹ ์˜ GitHub ์•„์ด๋””๋กœ ๊ฐ„ํŽธํ•˜๊ฒŒ ๋กœ๊ทธ์ธํ•˜๊ธฐ ์œ„ํ•ด
  • WHAT: GitHub oAuth ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ ์š”๊ตฌ์‚ฌํ•ญ

๊ธฐ๋Šฅ์„ฑ

  • ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๋Š” ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋œ๋‹ค.
  • GitHub ์ธ์ฆ์ด ์™„๋ฃŒ๋œ ํ›„, ์‚ฌ์šฉ์ž๋Š” ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋˜์•ผ ํ•œ๋‹ค.
  • ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž๋Š” ์ด ๊ณผ์ •์„ ์ƒ๋žตํ•˜๊ณ  ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋˜์•ผ ํ•œ๋‹ค.

์‹ ๋ขฐ์„ฑ

์˜ˆ) ์ž…๋ ฅ๋œ ์ด๋ฉ”์ผ์€ ์ด๋ฉ”์ผ ํ˜•์‹์— ์ค€์ˆ˜๋ผ์•ผ ํ•œ๋‹ค.

์‚ฌ์šฉ์„ฑ

  • ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ GitHub oAuth ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์ด ํ•œ ๋ˆˆ์— ๋ณด์ธ๋‹ค.
  • GitHub oAuth ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์€ ํ‚ค๋ณด๋“œ, ๋งˆ์šฐ์Šค๋กœ ์•ก์„ธ์Šค ๊ฐ€๋Šฅํ•ด์•ผ ํ•œ๋‹ค.

ํšจ์œจ์„ฑ

์˜ˆ) ๋กœ๊ทธ์ธ ํ™”๋ฉด ๋กœ๋”ฉ ์‹œ๊ฐ„์€ 1๋ถ„ ์ด๋‚ด์—ฌ์•ผ ํ•œ๋‹ค.

์‚ฌ์šฉ์ž ๊ทธ๋ฃน

์‚ฌ์šฉ์ž

๋งˆ์ผ์Šคํ†ค ๋ชฉ๋ก ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„

์˜ˆ์ƒํ™”๋ฉด

๋งˆ์ผ์Šคํ†ค ๋ชฉ๋ก ์ปดํฌ๋„ŒํŠธ

image

Labels, Milestones ์„ ํƒ ์ปดํฌ๋„ŒํŠธ

image

New Milestone ์„ ํƒ ์ปดํฌ๋„ŒํŠธ

image

Open, Closed ํ‘œ์‹œ ์ปดํฌ๋„ŒํŠธ

image

๋ชฉํ‘œ

๋งˆ์ผ์Šคํ†ค ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค€๋‹ค.
Labels, Milestones ์„ ํƒ ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„
New Milestone ๋ฒ„ํŠผ ๊ตฌํ˜„
Open, Closed ํ‘œ์‹œ ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„

ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ

๋งˆ์ผ์Šคํ†ค ์ปดํฌ๋„ŒํŠธ

Lucas ์š”๊ตฌ์‚ฌํ•ญ

ํ˜„์žฌ ํ™”๋ฉด์ด ๋งˆ์ผ์Šคํ†ค ๋ชฉ๋ก ํ™”๋ฉด์ด๋ผ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ‘œ์‹œํ•œ๋‹ค. ๋ ˆ์ด๋ธ” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ ˆ์ด๋ธ” ๋ชฉ๋ก ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

์ „์ฒด ๋งˆ์ผ์Šคํ†ค ๋ชฉ๋ก์ด ํ‘œ์‹œ๋œ๋‹ค.

  • ๋งˆ์ผ์Šคํ†ค ์ด๋ฆ„๊ณผ ์™„๋ฃŒ์ผ์ด ํ‘œ์‹œ๋œ๋‹ค. ์™„๋ฃŒ์ผ์ด ์—†๋‹ค๋ฉด โ€œNo due dateโ€์™€ ๊ฐ™์ด ํ‘œ์‹œํ•œ๋‹ค.
  • ๋งˆ์ผ์Šคํ†ค์— ๋Œ€ํ•œ ์„ค๋ช…์ด ํ•œ ์ค„๋กœ ํ‘œ์‹œ๋œ๋‹ค. ์„ค๋ช…์ด ์—†๋‹ค๋ฉด ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋งˆ์ผ์Šคํ†ค ๋ชฉ๋ก ์šฐ์ธก์— ์ง„ํ–‰๋ฅ ๊ณผ ํ•ด๋‹น ๋งˆ์ผ์Šคํ†ค๊ณผ ๊ด€๋ จ๋œ ์˜คํ”ˆ/ํด๋กœ์ฆˆ ์ด์Šˆ์˜ ๊ฐœ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

๋งˆ์ผ์Šคํ†ค ์ง„ํ–‰๋ฅ  ์•„๋ž˜์— Edit, Close, Delete ๋ฒ„ํŠผ์ด ์œ„์น˜ํ•œ๋‹ค. [Edit] ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋งˆ์ผ์Šคํ†ค ํŽธ์ง‘ ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

๋งˆ์ผ์Šคํ†ค ๋ชฉ๋ก ํ™”๋ฉด ์ƒ๋‹จ ์šฐ์ธก์— [New milestone] ๋ฒ„ํŠผ์ด ์œ„์น˜ํ•œ๋‹ค. ํ•ด๋‹น ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ƒˆ๋กœ์šด ๋งˆ์ผ์Šคํ†ค์„ ์ƒ์„ฑํ•˜๋Š” ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

oAuth์ธ์ฆ JWT๋ฅผ cookie ์ด์™ธ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ๋„˜๊ธฐ๊ธฐ

template render๊ฐ™์€ ์—”์ง„์„ ์ถ”๊ฐ€๋กœ ์ด์šฉํ•ด์„œ

server์—์„œ renderํ•œ ํŽ˜์ด์ง€์—์„œ token์„ localStorage์— ์ €์žฅ -> ํ”„๋ก ํŠธํŽ˜์ด์ง€์— ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ ์‹œํ‚ค๋ฉด

localStorage์— ๋‹ด๋Š” ํ˜•ํƒœ๋กœ ๊ฐ€๋Šฅํ•˜์ง€์•Š์„๊นŒ? ์‹ถ์Šต๋‹ˆ๋‹ค ~~~

React prop-types ์‚ฌ์šฉ์—ฌ๋ถ€ ๊ฒฐ์ •

image

eslint-plugin-react์—์„œ prop-types๋ฅผ ์ด์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Œ.

prop-types

React component์˜ ์ƒํƒœ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” prop์— type์„ ์ง€์ •ํ•ด, prop์— ์ž˜๋ชป๋œ type์ด ๋“ค์–ด์˜ค๋ฉด error๊ฐ€ ๋‚˜์˜ค๋„๋ก ์„ค์ •ํ•˜๋Š” ๊ฒƒ.
TS์ฒ˜๋Ÿผ type checking์ด ๊ฐ€๋Šฅํ•ด์ ธ ๋””๋ฒ„๊น…์ด ํŽธํ•ด์ง„๋‹ค.
TS์™€ ๋‹ค๋ฅธ ์ ์€, build๊ฐ€ ์•„๋‹Œ runtime์— type checking์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

์‚ฌ์šฉํ•  ๊ฒฝ์šฐ

ํŒจํ‚ค์ง€ ์„ค์น˜

npm i prop-types

๊ฐ React component์—

import PropTypes from 'prop-types';

class Greeting extends React.Component {
  render() {
    return (
      <h1>Hello, {this.props.name}</h1>
    );
  }
}

Greeting.propTypes = {
  name: PropTypes.string
};

์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ

frontend์˜ .eslintrc.json์— ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

{
  "rules": {
    "react/prop-types": "off"
  }
}

๋กœ๊ทธ์ธ ์ƒํƒœ๋กœ /login ์ ‘๊ทผ ์‹œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ์ ‘๊ทผ๋จ

#63 ํ•ด๊ฒฐ ์‹œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ /login ๊ฒฝ๋กœ์— ์ ‘๊ทผํ•  ๊ฒฝ์šฐ ๊ณง๋ฐ”๋กœ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋กœ ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋Š”๋ฐ์š”.
๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์—์„œ ์„ธ์…˜์„ ์ ๊ฒ€ํ•˜์ง€ ์•Š์•„์„œ ๊ทธ๋Ÿฐ์ง€, ์ •ํ™•ํ•œ ์›์ธ์€ ํŒŒ์•…ํ•˜์ง€ ์•Š์•˜์ง€๋งŒ ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™๋˜์ง€ ์•Š๊ณ  ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ๋จธ๋ฌผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋ฒ„๊ทธ๋ผ๊ณ  ์ƒ๊ฐ๋˜๋„ค์š”.

util/date.js calculateTimediff ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„

์‚ฌ์šฉํ•˜๋Š” ๊ณณ

์ด์Šˆ ์ปดํฌ๋„ŒํŠธ

์„ค๋ช…

ํ˜„์žฌ ์‹œ๊ฐ„๊ณผ ์ด์Šˆ ์ƒ์„ฑ์‹œ๊ฐ„ ์ฐจ๋ฅผ
image
image

์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด yesterday, 9 hours left์™€ ๊ฐ™์€ ์ ์ ˆํ•œ string ์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•จ

Styled-component ๊ธ€๋กœ๋ฒŒ ์„ธํŒ…

์˜ˆ์ƒํ™”๋ฉด

Setting์ด๋ผ ์ด์Šˆ์—†์Šต๋‹ˆ๋‹ค.
ใ…‡

๋ชฉํ‘œ

๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” css๊ฐ’๋“ค(Main Color, padding)๊ฐ’์„ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

Lucas ์š”๊ตฌ์‚ฌํ•ญ

css-in-js์˜ styledcomponent๊ด€๋ จ.

[Mark up] ๋ ˆ์ด๋ธ” ์ƒ์„ฑ ์ปดํฌ๋„ŒํŠธ

์˜ˆ์ƒํ™”๋ฉด

image

๋ชฉํ‘œ

[New label] ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์ด ๋‚˜ํƒ€๋‚œ๋‹ค. ํ•œ ๋ฒˆ ๋” ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ์˜์—ญ์ด ๋‹ค์‹œ ์‚ฌ๋ผ์ง„๋‹ค.

Lucas ์š”๊ตฌ์‚ฌํ•ญ

  • ๋ ˆ์ด๋ธ” ์ด๋ฆ„๊ณผ ์ƒ‰๊น” ์ž…๋ ฅ ์‹œ ๋ฐ”๋กœ ์ด๊ณณ์— ๋ฐ˜์˜๋˜์–ด, ๋งŒ๋“ค์–ด์งˆ ๋ ˆ์ด๋ธ”์˜ ๋ชจ์–‘์„ ๋ฏธ๋ฆฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ ˆ์ด๋ธ” ์ด๋ฆ„์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋ฉด โžŠ๋ฒˆ์˜ ํ…์ŠคํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • ๋ ˆ์ด๋ธ” ์„ค๋ช…์„ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ ˆ์ด๋ธ” ์„ค๋ช…์€ ์˜ต์…˜๊ฐ’์ด๋‹ค. ๋ฐ˜๋“œ์‹œ ์ž…๋ ฅํ•˜์ง€ ์•Š์•„๋„ ๋ ˆ์ด๋ธ”์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ƒ‰์ƒ ์ฝ”๋“œ๋Š” ์ดˆ๊ธฐ๊ฐ’์ด ์ž…๋ ฅ๋˜์–ด ์žˆ๊ณ , ํ•ด๋‹น ์ƒ‰๊น”์ด ์ƒ‰์ƒ ์ฝ”๋“œ ์™ผ์ชฝ ๋ฆฌํ”„๋ ˆ์‹œ ๋ฒ„ํŠผ์— ํ‘œํ˜„๋œ๋‹ค.
    • ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์ƒ‰์ƒ ์ฝ”๋“œ๋ฅผ ์ž…๋ ฅํ•ด์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๋ฆฌํ”„๋ ˆ์‹œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋žœ๋คํ•˜๊ฒŒ ์ƒ‰์ƒ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์„œ ๋ณ€๊ฒฝํ•ด์ค€๋‹ค.
    • ์ƒ‰์ƒ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌํ”„๋ ˆ์‹œ ๋ฒ„ํŠผ ๋ฐฐ๊ฒฝ์ƒ‰๊ณผ ํ•จ๊ป˜ โžŠ๋ฒˆ์˜ ์ƒ‰๊น”๋„ ๊ฐ™์ด ๋ณ€๊ฒฝ๋œ๋‹ค.
  • Cancel ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์•„๋ฌด๋Ÿฐ ๋ฐ˜์˜ ์—†์ด ์ƒˆ๋กœ์šด ๋ ˆ์ด๋ธ” ์ถ”๊ฐ€ ์˜์—ญ์ด ์‚ฌ๋ผ์ง€๊ณ  ์ด์ „ ์Šฌ๋ผ์ด๋“œ์™€ ๊ฐ™์ด ๋ ˆ์ด๋ธ” ๋ชฉ๋ก๋งŒ ๋ณด์—ฌ์ง„๋‹ค.
  • ๋ ˆ์ด๋ธ” ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋ฉด Create label ๋ฒ„ํŠผ์ด ํ™œ์„ฑํ™”๋œ๋‹ค.
  • Create label ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ž…๋ ฅํ•œ ๋‚ด์šฉ๋Œ€๋กœ ์ƒˆ๋กœ์šด ๋ ˆ์ด๋ธ”์ด ์ถ”๊ฐ€๋˜๊ณ , ๋ ˆ์ด๋ธ” ์ถ”๊ฐ€ ์˜์—ญ์ด ์‚ฌ๋ผ์ง„๋‹ค.

Labels, Milestones๋ฅผ ์œ„ํ•œ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ

์˜ˆ์ƒํ™”๋ฉด

image

๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ

  • ์•„์ด์ฝ˜, ๋ฒ„ํŠผ ์ด๋ฆ„, ํ•ด๋‹น ์š”์†Œ ๊ฐœ์ˆ˜, ๋ฒ„ํŠผ ํด๋ฆญ์‹œ ์ด๋™ํ•  ๋งํฌ๋ฅผ ์ƒํƒœ๋กœ ๊ฐ€์ง€๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
  • ์†์„ฑ๋งŒ ๋ฐ”๊ฟ” ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ ํ›„ Labels, Milestones ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

Lucas ์š”๊ตฌ์‚ฌํ•ญ

Labels ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋ ˆ์ด๋ธ” ๋ชฉ๋ก ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

  • Labels ๋ฒ„ํŠผ ์˜†์— ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ์ด๋ธ” ๊ฐœ์ˆ˜๋ฅผ ๊ฐ™์ด ํ‘œ์‹œํ•ด์ค€๋‹ค.

Milestones ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋งˆ์ผ์Šคํ†ค ๋ชฉ๋ก ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

  • Milestones ๋ฒ„ํŠผ ์˜†์— ํ˜„์žฌ ์ง„ํ–‰ ์ค‘์ธ(์˜คํ”ˆ ์ƒํƒœ์ธ) ๋งˆ์ผ์Šคํ†ค ๊ฐœ์ˆ˜๋ฅผ ๊ฐ™์ด ํ‘œ์‹œํ•ด์ค€๋‹ค.

์ด์Šˆ ๋ชฉ๋ก ํ™”๋ฉด ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„

์˜ˆ์ƒํ™”๋ฉด

image

๋ชฉํ‘œ

์ด์Šˆ ๋ชฉ๋ก ํ™”๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.
ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  New issue ๋ฒ„ํŠผ์„ ๊ตฌํ˜„ํ•œ๋‹ค.

ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ

  • ํ•„ํ„ฐ
  • Labels
  • Milestones
  • ์ด์Šˆ ๋ชฉ๋ก

Lucas ์š”๊ตฌ์‚ฌํ•ญ

New issue ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ƒˆ๋กœ์šด ์ด์Šˆ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ™”๋ฉด์œผ๋กœ ์ด๋™ํ•œ๋‹ค.

[Markup] ๋ ˆ์ด๋ธ” ๋ชฉ๋ก ์ปดํฌ๋„ŒํŠธ

์˜ˆ์ƒํ™”๋ฉด

image

๋ชฉํ‘œ

๋ ˆ์ด๋ธ” ๋ชฉ๋ก ๋งˆํฌ์—… ๊ตฌํ˜„ํ•˜๊ธฐ

Lucas ์š”๊ตฌ์‚ฌํ•ญ

์ „์ฒด ๋ ˆ์ด๋ธ” ๋ชฉ๋ก์ด ํ‘œ์‹œ๋œ๋‹ค.

  • ๋ ˆ์ด๋ธ” ๋ชฉ๋ก ์ƒ๋‹จ์— ์ „์ฒด ๋ ˆ์ด๋ธ” ๊ฐœ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.
  • ๋ ˆ์ด๋ธ” ์ด๋ฆ„๊ณผ ๋ฐฐ๊ฒฝ์ƒ‰์ด ํ‘œ์‹œ๋œ๋‹ค.
  • ๋ ˆ์ด๋ธ” ์„ค๋ช…์ด ํ•œ ์ค„๋กœ ํ‘œ์‹œ๋œ๋‹ค.
  • ๋ชจ๋“  ๋ ˆ์ด๋ธ” ๋ชฉ๋ก์€ ์šฐ์ธก์— Edit๊ณผ Delete ๋ฒ„ํŠผ์„ ํ•จ๊ป˜ ๊ฐ€์ง„๋‹ค.
  • ๋ ˆ์ด๋ธ” ๋ชฉ๋ก ํ™”๋ฉด ์ƒ๋‹จ ์šฐ์ธก์— [New label] ๋ฒ„ํŠผ์ด ์œ„์น˜ํ•œ๋‹ค.

front์—์„œ async, await์‚ฌ์šฉ์‹œ ReferenceError

๋ฌธ์ œ

image
async await ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์—๋Ÿฌ๋‚จ.
์ด์œ ๋Š” babel ๋ฌธ์ œ...........

์ด๊ฑฐ๋•Œ๋ฌธ์— promise๋กœ ๋ฐ”๊พผ ํ•จ์ˆ˜๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ ๊ฒฐ๊ตญ ์—๋Ÿฌ ํ•ด๊ฒฐ ใ… ใ… 

bable ๋ฌธ์ œ๋กœ polyfil ์„ค์น˜ํ•ด์„œ webpack, babel ์„ค์ •ํŒŒ์ผ ์ˆ˜์ •

Labels ๋ชฉ๋ก GET API ๊ตฌํ˜„

์ ์šฉ๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ™”๋ฉด

image
image

๋ชฉํ‘œ

DB์— ์žˆ๋Š” Labels ์ •๋ณด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

๊ธฐ๋Šฅ

Label์˜ name, description, color๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

Lucas ์š”๊ตฌ์‚ฌํ•ญ

์ „์ฒด ๋ ˆ์ด๋ธ” ๋ชฉ๋ก์ด ํ‘œ์‹œ๋œ๋‹ค.

  • ๋ ˆ์ด๋ธ” ๋ชฉ๋ก ์ƒ๋‹จ์— ์ „์ฒด ๋ ˆ์ด๋ธ” ๊ฐœ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.
  • ๋ ˆ์ด๋ธ” ์ด๋ฆ„๊ณผ ๋ฐฐ๊ฒฝ์ƒ‰์ด ํ‘œ์‹œ๋œ๋‹ค.
  • ๋ ˆ์ด๋ธ” ์„ค๋ช…์ด ํ•œ ์ค„๋กœ ํ‘œ์‹œ๋œ๋‹ค.

์ด์Šˆ ๋ชฉ๋ก GET API ๊ตฌํ˜„

์ ์šฉ๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ™”๋ฉด

image

๋ชฉํ‘œ

FE ์ด์Šˆ ๋ชฉ๋ก๋ณด๊ธฐ์—์„œ DB์— ์žˆ๋Š” ์ด์Šˆ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ์ด์Šˆ ๋ชฉ๋ก์„ ๋ฆฌํ„ดํ•˜๋Š” API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

๊ธฐ๋Šฅ

titie, content, isOpened, author, milestone, createDate, assignee ์ •๋ณด๊ฐ€ ์žˆ๋Š” ์ด์Šˆ ๋ชฉ๋ก ๋ฐ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

Lucas ์š”๊ตฌ์‚ฌํ•ญ

์ด์Šˆ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค€๋‹ค.

  • ์ œ๋ชฉ, ๋งˆ์ผ์Šคํ†ค, ๋ ˆ์ด๋ธ”, ์ด์Šˆ ๋ฒˆํ˜ธ, ์ด์Šˆ ์ž‘์„ฑ ์‹œ๊ฐ„, ์ž‘์„ฑ์ž, ๋‹ด๋‹น์ž๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.

GitHub์œผ๋กœ ๋กœ๊ทธ์ธ API ๊ตฌํ˜„

image

๊ธฐ๋Šฅ

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ Sign in with GitHub์„ ํด๋ฆญ์‹œ ์‚ฌ์šฉ์ž ์ธ์ฆ ํ›„ ๋กœ๊ทธ์ธ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

Lucas ์š”๊ตฌ์‚ฌํ•ญ

๋กœ๊ทธ์ธ์€ GitHub OAuth๋ฅผ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค. (ํ•„์ˆ˜)

  • ์ธ์ฆ๋˜๊ณ  ๋‚˜๋ฉด ์ด์Šˆ ๋ชฉ๋ก ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
  • ์•ฑ์ด ์‹œ์ž‘ํ•  ๋•Œ ์ด๋ฏธ ๋ฐœํ–‰ํ•œ OAuth ํ† ํฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ํ™”๋ฉด์€ ์ƒ๋žตํ•˜๊ณ  ๋ฐ”๋กœ ์ด์Šˆ ๋ชฉ๋ก ํ™”๋ฉด์„ ํ‘œ์‹œํ•œ๋‹ค.

Milestones ๋ชฉ๋ก API ๊ตฌํ˜„

์ ์šฉ๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ™”๋ฉด

image

image

๋ชฉํ‘œ

DB์— ์žˆ๋Š” Milestones ์ •๋ณด๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” API๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

๊ธฐ๋Šฅ

GET
PATCH

Lucas ์š”๊ตฌ์‚ฌํ•ญ

์ „์ฒด ๋งˆ์ผ์Šคํ†ค ๋ชฉ๋ก์ด ํ‘œ์‹œ๋œ๋‹ค.

  • ๋งˆ์ผ์Šคํ†ค ์ด๋ฆ„๊ณผ ์™„๋ฃŒ์ผ์ด ํ‘œ์‹œ๋œ๋‹ค. ์™„๋ฃŒ์ผ์ด ์—†๋‹ค๋ฉด โ€œNo due dateโ€์™€ ๊ฐ™์ด ํ‘œ์‹œํ•œ๋‹ค.
  • ๋งˆ์ผ์Šคํ†ค์— ๋Œ€ํ•œ ์„ค๋ช…์ด ํ•œ ์ค„๋กœ ํ‘œ์‹œ๋œ๋‹ค. ์„ค๋ช…์ด ์—†๋‹ค๋ฉด ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.

Imgur API ์Šคํ„ฐ๋””

๋ชฉํ‘œ

Issue, comment ๊ธฐ๋Šฅ์—์„œ ์ด๋ฏธ์ง€ ์ถ”๊ฐ€๋ฅผ ํ•ด์•ผํ•œ๋‹ค.
์ด๋•Œ Imgur API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด API๋ฅผ ํ•™์Šตํ•˜๊ณ  ํŒ€์›๋“ค๊ณผ ๊ณต์œ ํ•œ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ

https://apidocs.imgur.com/

ํ”„๋ก ํŠธ์—”๋“œ ๋กœ๊ทธ์ธ ์ธ์ฆ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

๋ชฉํ‘œ

utils/auth์˜ isAuthenticated๋ฅผ ๊ตฌํ˜„

  • ๋กœ๊ทธ์ธ ์ธ์ฆ์ด ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋Š” AccessToken์„ ์„œ๋ฒ„์— ๋ณด๋‚ธ๋‹ค.
  • 403์—๋Ÿฌ์ผ ๊ฒฝ์šฐ isAuthenticate์˜ return ์„ false๋กœ ํ•ด์„œ ๋กœ๊ทธ์ธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ด๋™
  • ์ธ์ฆ ์„ฑ๊ณตํ•˜๋ฉด isAuthenticate์˜ return์„ true๋กœ ํ•ด์„œ ์ธ์ฆ

bug~ time ํƒ€์ž…์ด ์•ˆ๋งž๋Š” ์—๋Ÿฌ

DB์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” createDate๊ฐ’์ด date๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ string๊ฐ์ฒด๋กœ ์ธ์‹๋˜์„œ time.getTime๋ฉ”์„œ๋“œ๊ฐ€ ์ž‘๋™์„ ์•ˆํ•จ.
๊ทธ ๋ถ€๋ถ„ ํ•ด๊ฒฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Issue ์ƒ์„ฑ, ์ˆ˜์ • API

์ ์šฉ๋˜๋Š” ํ”„๋ก ํŠธ์—”๋“œ ํ™”๋ฉด

๋ชฉํ‘œ

  1. ์ด์Šˆ ์ƒ์„ฑ api๊ฐ€ ๋™์ž‘ํ•˜๋„๋ก ํ•œ๋‹ค.
  2. ์ด์Šˆ ์ˆ˜์ • api๊ฐ€ ๋™์ž‘ํ•˜๋„๋ก ํ•œ๋‹ค.
  3. ์ด์Šˆ open/close api๊ฐ€ ๋™์ž‘ํ•˜๋„๋ก ํ•œ๋‹ค.

๊ธฐ๋Šฅ

Lucas ์š”๊ตฌ์‚ฌํ•ญ

Sort ๋“œ๋กญ๋‹ค์šด ๋ฐ•์Šค ๊ตฌํ˜„

์˜ˆ์ƒํ™”๋ฉด

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2020-11-05 แ„‹แ…ฉแ„’แ…ฎ 4 12 58

๋ชฉํ‘œ

  • ์™ธ๋ถ€ ํด๋ฆญ์‹œ ๋ ˆ์ด์–ด ์‚ฌ๋ผ์ง€๋Š” ๊ธฐ๋Šฅ
  • X ๋˜๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญ์‹œ ๋ ˆ์ด์–ด ์‚ฌ๋ผ์ง€๋Š” ๊ธฐ๋Šฅ

Lucas ์š”๊ตฌ์‚ฌํ•ญ

Jest ์„ค์น˜

์–ธ์  ๊ฐ€ ์“ธ์ง€๋„ ๋ชจ๋ฅด๋Š” ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ Jest๋ฅผ ํ”„๋กœ์ ํŠธ์— ํฌํ•จ

Filter ๊ฒ€์ƒ‰ ์ฐฝ state๋กœ ๊ด€๋ฆฌํ•˜๊ธฐ

Filter ๊ฒ€์ƒ‰ ์ฐฝ์— IssuePage์˜ filter State ๊ฐ’์ด ๋“ค์–ด๊ฐ€๊ฒŒ ํ•ด์„œ
์—ฌ๋Ÿฌ Filter(Author, Label๋“ฑ ๋ชจ๋‹ฌ์ฐฝ์—์„œ ํด๋ฆญ๋˜์—ˆ์„ ๋•Œ ์ ์šฉ๋จ)๊ฐ€ ํด๋ฆญ๋˜๊ฑฐ๋‚˜ ์ง์ ‘ ์ž…๋ ฅ๋˜์—ˆ์„ ๋•Œ ๊ฒ€์ƒ‰์ฐฝ์— ์ ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ

LabelInModal onClick method ์ž‘์„ฑ

์‚ฌ์šฉํ•˜๋Š” ๊ณณ

  • ์ด์Šˆ๋ชฉ๋ก์˜ ํ•„ํ„ฐ๋ฅผ ์œ„ํ•œ ๋ผ๋ฒจ์„ ํƒ ์œ„ํ•ด์„œ
  • ์ด์Šˆ ์ž‘์„ฑ ์—์„œ ๋ผ๋ฒจ ๋“ฑ๋ก์„ ์œ„ํ•œ ๊ณณ์—์„œ

์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ setState๋ฅผ ๋ฐ›์•„ ๊ทธ ๊ณณ์— title๋“ฑ ์ •๋ณด๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹?

๋ ˆ์ด๋ธ” ์ˆ˜์ • ๊ธฐ๋Šฅ

์˜ˆ์ƒํ™”๋ฉด

image

๋ชฉํ‘œ

๋ ˆ์ด๋ธ” ์ถ”๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‘์šฉํ•ด์„œ ์ˆ˜์ • ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ

Lucas ์š”๊ตฌ์‚ฌํ•ญ

  • ๋ ˆ์ด๋ธ” ๋ชฉ๋ก์—์„œ [Edit] ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•ด๋‹น ๋ ˆ์ด๋ธ” ๋ชฉ๋ก ๋ฐ”๋กœ ์•„๋ž˜์— ๋ ˆ์ด๋ธ”์„ ํŽธ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์ด ๋‚˜ํƒ€๋‚œ๋‹ค.
  • ๋ ˆ์ด๋ธ” ์ด๋ฆ„๊ณผ ์ƒ‰๊น” ๋ณ€๊ฒฝ ์‹œ ๋ฐ”๋กœ ์ด๊ณณ์— ๋ฐ˜์˜๋˜์–ด, ๋งŒ๋“ค์–ด์งˆ ๋ ˆ์ด๋ธ”์˜ ๋ชจ์–‘์„ ๋ฏธ๋ฆฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ ˆ์ด๋ธ” ์ด๋ฆ„์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๋ฉด โžŠ๋ฒˆ์˜ ํ…์ŠคํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • ๋ ˆ์ด๋ธ” ์„ค๋ช…์„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ ˆ์ด๋ธ” ์„ค๋ช…์€ ์˜ต์…˜๊ฐ’์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋นˆ์นธ์œผ๋กœ๋„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ ˆ์ด๋ธ” ์ถ”๊ฐ€ ์˜์—ญ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. ์ƒ‰์ƒ ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ๋ฆฌํ”„๋ ˆ์‹œ ๋ฒ„ํŠผ ๋ฐฐ๊ฒฝ์ƒ‰๊ณผ ํ•จ๊ป˜ โžŠ๋ฒˆ์˜ ์ƒ‰๊น”๋„ ๊ฐ™์ด ๋ณ€๊ฒฝ๋œ๋‹ค.
  • Cancel ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์•„๋ฌด๋Ÿฐ ๋ฐ˜์˜ ์—†์ด ๋ ˆ์ด๋ธ” ํŽธ์ง‘ ์˜์—ญ์ด ์‚ฌ๋ผ์ง€๊ณ  ์ด์ „ ์Šฌ๋ผ์ด๋“œ์™€ ๊ฐ™์ด ๋ ˆ์ด๋ธ” ๋ชฉ๋ก๋งŒ ๋ณด์—ฌ์ง„๋‹ค.
  • Save changes ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์ž…๋ ฅํ•œ ๋‚ด์šฉ๋Œ€๋กœ ๋ ˆ์ด๋ธ”์ด ์ˆ˜์ •๋˜๊ณ , ๋ ˆ์ด๋ธ” ํŽธ์ง‘ ์˜์—ญ์ด ์‚ฌ๋ผ์ง„๋‹ค.

fallback ์‹œ '/'์œผ๋กœ redirect๋จ

expected:
redirect ์—†์ด frontend html file์„ serveํ•ด์•ผํ•จ.

actual:
'/'์œผ๋กœ redirect๋˜๋ฏ€๋กœ ์ƒˆ๋กœ๊ณ ์นจ ๋“ฑ์˜ ์ƒํ™ฉ์—์„œ ๋ฐ˜๋“œ์‹œ main page๊ฐ€ render๋˜๋ฒ„๋ฆผ.

Refactory ! ๋ฉ”๋‰ด์—์„œ ์ด์Šˆ ๋ˆŒ๋ €์„๋•Œ ์ด๋™๊ด€๋ จ

๋ชฉํ‘œ

๊นƒํ—ˆ๋ธŒ๋Š” ์ œ๋ชฉ์„ ๋ˆŒ๋ €์„๋•Œ๋งŒ ์ด๋™์ด ๋˜๋Š”๋ฐ,
์ง€๊ธˆ์€ ์ด์Šˆ ์ปดํฌ๋„ŒํŠธ ์ „์ฒด์— ๋งํฌ๋ฅผ ๊ฑธ์–ด๋†”์„œ ๋ ˆ์ด๋ธ”์„ ํด๋ฆญํ–ˆ์„๋•Œ์˜ ์ด๋ฒคํŠธ ๋“ฑ์„ ๋“ฑ๋กํ•  ์ˆ˜ ์—†๋‹ค.
์ถ”ํ›„ ์ œ๋ชฉ์œผ๋กœ ๋งํฌ๊ธฐ๋Šฅ์„ ์ด๋™์‹œํ‚จ๋‹ค.

์ด์Šˆ ๋ชฉ๋ก ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„

์˜ˆ์ƒํ™”๋ฉด

image

๊ตฌํ˜„ํ•  ๊ธฐ๋Šฅ

  • ํ•„ํ„ฐ์— ํ•ด๋‹นํ•˜๋Š”(default : Opened) ์ด์Šˆ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค€๋‹ค.

ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ

  • ์ด์Šˆ

Lucas ์š”๊ตฌ์‚ฌํ•ญ

์ด์Šˆ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค€๋‹ค.

  • ์˜คํ”ˆ ์ƒํƒœ์˜ ์ด์Šˆ๋งŒ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒŒ ๊ธฐ๋ณธ ์ƒํƒœ์ด๋‹ค.
  • ์ œ๋ชฉ, ๋งˆ์ผ์Šคํ†ค, ๋ ˆ์ด๋ธ”, ์ด์Šˆ ๋ฒˆํ˜ธ, ์ด์Šˆ ์ž‘์„ฑ ์‹œ๊ฐ„, ์ž‘์„ฑ์ž, ๋‹ด๋‹น์ž๋ฅผ ํ‘œ์‹œํ•œ๋‹ค. ํ•ด๋‹น ๊ฐ’์ด ์—†์œผ๋ฉด ๋ณด์—ฌ์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ์ด์Šˆ ์ œ๋ชฉ์„ ์„ ํƒํ•˜๋ฉด ์„ ํƒํ•œ ์ด์Šˆ์— ๋Œ€ํ•œ ์ƒ์„ธ ํ™”๋ฉด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค.

๋กœ๊ทธ์ธ ํ”„๋ก ํŠธ ์ปดํฌ๋„ŒํŠธ

image

์ด์Šˆ ํŠธ๋ž˜์ปค ์ฒซ ํ™”๋ฉด์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์•„์ด๋””๋Š” ์ตœ์†Œ 6์ž๋ฆฌ์—์„œ 16์ž๋ฆฌ๊นŒ์ง€ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์ตœ์†Œ 6์ž๋ฆฌ์—์„œ 12์ž๋ฆฌ๊นŒ์ง€ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.
  3. ๋กœ๊ทธ์ธ์€ GitHub OAuth๋ฅผ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค. (ํ•„์ˆ˜)
  • ์ธ์ฆ๋˜๊ณ  ๋‚˜๋ฉด ์ด์Šˆ ๋ชฉ๋ก ํ™”๋ฉด์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค.
  • ์•ฑ์ด ์‹œ์ž‘ํ•  ๋•Œ ์ด๋ฏธ ๋ฐœํ–‰ํ•œ OAuth ํ† ํฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์ด ํ™”๋ฉด์€ ์ƒ๋žตํ•˜๊ณ  ๋ฐ”๋กœ ์ด์Šˆ ๋ชฉ๋ก ํ™”๋ฉด์„ ํ‘œ์‹œํ•œ๋‹ค.
  1. ๋กœ๊ทธ์ธ๊ณผ ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ์€ ์„ ํƒ ์‚ฌํ•ญ์ด๋‹ค. 3์˜ GitHub OAuth ๋ฐฉ์‹์„ ์šฐ์„  ๊ตฌํ˜„ํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ค์ •

repo ์ดˆ๊ธฐํ™”

npm init -y

webpack, babel ์„ค์น˜

npm i -D @babel/core @babel/preset-env @babel/register core-js@3 
npm i -D webpack webpack-cli babel-loader webpack-node-externals clean-webpack-plugin

backend express ์„ค์น˜

npm i express

frontend react ์„ค์น˜

npm i react react-dom
npm i -D @babel/preset-react html-webpack-plugin

eslint ์ ์šฉ

npx install-peerdeps --dev eslint-config-airbnb-base
npm i -D eslint-plugin-react

backend ์„ค์ • .eslintrc.json

{
  "env": {
    "node": true
  },
  "extends": "airbnb-base"
}

frontend react ์„ค์ •: .eslintrc.json

https://github.com/yannickcr/eslint-plugin-react

Modal Layer z-index ๋ฌธ์ œ

๋ฒ„๊ทธํ™”๋ฉด

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2020-11-05 แ„‹แ…ฉแ„’แ…ฎ 4 25 32

๋ชฉํ‘œ

  • ํ”„๋กœํ•„ ์‚ฌ์ง„์ด ๋ ˆ์ด์–ด ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ€์„œ, ๋ณด์ด์ง€ ์•Š๋„๋ก ์ˆ˜์ •

์ด์Šˆ ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„

์˜ˆ์ƒํ™”๋ฉด

image

๋ชฉํ‘œ

์ด์Šˆ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

๊ธฐ๋Šฅ

  1. titie, content, isOpened, author, milestone, createDate, assignee ์ •๋ณด๋ฅผ ์˜ˆ์ƒํ™”๋ฉด๊ณผ ๊ฐ™์ด ํ‘œ์‹œํ•œ๋‹ค.
  2. title์„ ํด๋ฆญ ์‹œ ์ด์Šˆ์— ๋Œ€ํ•œ ์ƒ์„ธํ™”๋ฉด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค.

Lucas ์š”๊ตฌ์‚ฌํ•ญ

์ด์Šˆ ๋ชฉ๋ก์„ ๋ณด์—ฌ์ค€๋‹ค.

  • ์ œ๋ชฉ, ๋งˆ์ผ์Šคํ†ค, ๋ ˆ์ด๋ธ”, ์ด์Šˆ ๋ฒˆํ˜ธ, ์ด์Šˆ ์ž‘์„ฑ ์‹œ๊ฐ„, ์ž‘์„ฑ์ž, ๋‹ด๋‹น์ž๋ฅผ ํ‘œ์‹œํ•œ๋‹ค. ํ•ด๋‹น ๊ฐ’์ด ์—†์œผ๋ฉด ๋ณด์—ฌ์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.
  • ์ด์Šˆ ์ œ๋ชฉ์„ ์„ ํƒํ•˜๋ฉด ์„ ํƒํ•œ ์ด์Šˆ์— ๋Œ€ํ•œ ์ƒ์„ธ ํ™”๋ฉด ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค.

๋งˆ์ผ์Šคํ†ค ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„

์˜ˆ์ƒํ™”๋ฉด

image

๋ชฉํ‘œ

๋งˆ์ผ์Šคํ†ค ๊ด€๋ จ ์ •๋ณด๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.

Lucas ์š”๊ตฌ์‚ฌํ•ญ

  • ๋งˆ์ผ์Šคํ†ค ์ด๋ฆ„๊ณผ ์™„๋ฃŒ์ผ์ด ํ‘œ์‹œ๋œ๋‹ค. ์™„๋ฃŒ์ผ์ด ์—†๋‹ค๋ฉด โ€œNo due dateโ€์™€ ๊ฐ™์ด ํ‘œ์‹œํ•œ๋‹ค.
  • ๋งˆ์ผ์Šคํ†ค์— ๋Œ€ํ•œ ์„ค๋ช…์ด ํ•œ ์ค„๋กœ ํ‘œ์‹œ๋œ๋‹ค. ์„ค๋ช…์ด ์—†๋‹ค๋ฉด ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.