์ฃผ์š” ์ž‘์—…

  • api ๊ฐœ๋ฐœ(์ง„ํ–‰์ค‘)
    • get ์นด๋“œ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ(์™„๋ฃŒ)
    • post ์นด๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ(์™„๋ฃŒ)
    • get ํžˆ์Šคํ† ๋ฆฌ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ(์™„๋ฃŒ)
    • delete ์นด๋“œ ํžˆ์Šคํ† ๋ฆฌ ์ „์ฒด ์‚ญ์ œ(๋ฆฌ๋ Œ๋”๋ง ๋กœ์ง ์ง„ํ–‰์ค‘)
  • MVC ํŒจํ„ด ํ”„๋กœ์ ํŠธ ์ ์šฉ โœ… 2024-08-29

ํ•™์Šต ํ‚ค์›Œ๋“œ

  • sql(ํ•™์Šต ์ง„ํ–‰์ค‘) โœ… 2024-08-29
  • reverse engineering โœ… 2024-08-29
  • ํŠธ๋žœ์žญ์…˜ โœ… 2024-08-29
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง โœ… 2024-08-29

๊ณ ๋ฏผ ๋ฐ ํ•ด๊ฒฐ๊ณผ์ •

CardListModel โ†’ columnListModel์—์„œ์˜ column ์ถ”์ถœ

function CardListModel(cardsList) {
  this.cards = modelProcessing(cardsList);
  function modelProcessing(cardsList) {
    cardsList.map((card) => new CardModel(card));
  }
}
 
function CardModel(card) {
  this.id = card.card_id;
  this.author = card.author;
  this.title = card.title;
  this.detail = card.detail;
  this.timestamp = card.timestamp.toDateString();
  this.col_name = card.col_name;
}
 
export default CardListModel;
 

sql ์ฟผ๋ฆฌ๋ฌธ์„ ํ†ตํ•ด ๊ฐ€์ ธ์˜จ ๊ฐ๊ฐ์˜ ์นด๋“œ๋“ค์—๋Š” ์นผ๋Ÿผ์˜ ์ด๋ฆ„์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋‹ค. ๋ฌธ์ œ๋Š” ์นด๋“œ ๋ชจ๋ธ โ†’ ์นด๋“œ ๋ฆฌ์ŠคํŠธ ๋ชจ๋ธ โ†’ ์„น์…˜ ๋ชจ๋ธ โ†’ ์„น์…˜ ๋ฆฌ์ŠคํŠธ ๋ชจ๋ธ ์ˆœ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ƒ๊ฐํ–ˆ์—ˆ๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ ์นด๋“œ์— ์žˆ๋Š” col_name ๊ฐ’์„ ์–ด๋–ป๊ฒŒ ์ถ”์ถœํ•˜์—ฌ ์นด๋“œ ๋ฆฌ์ŠคํŠธ์— ๋„ฃ์–ด์ค˜์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์žˆ์—ˆ๋‹ค.

๊ฐ๊ฐ์˜ ์š”์†Œ์— ๋Œ€ํ•ด์„œ ์—ฌ๋Ÿฌ๋ฒˆ for๋ฌธ์„ ๋Œ๋ฉด ํ•ด๊ฒฐ๋  ์ˆ˜๋„ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๊ธด ํ•˜์ง€๋งŒ ์ด๋Š” ํ•œ๋ฒˆ ๋Œ์•˜๋˜ ์š”์†Œ๋“ค์— ๋Œ€ํ•ด์„œ ๋‹ค์‹œ๊ธˆ ๋ฐ˜๋ณต๋ฌธ์„ ๋„๋Š” ๊ฒƒ์ด ๊ณผ์—ฐ ์ข‹์€ ๋ฐฉ๋ฒ•์ผ๊นŒ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. ๋ฌผ๋ก  task card์˜ ํŠน์ˆ˜์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ, ๋Œ€๋ถ€๋ถ„ 100๊ฐœ๋ฅผ ๋„˜๋Š” ์ผ์ด ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ง€๋„ ์•Š์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ณ , ์ด์ •๋„์˜ ์ˆ˜๋ฅผ ๋„๋Š” ๊ฒƒ์€ ํ‹ฐ๋„ ๋‚˜์ง€ ์•Š๋Š” ์†๋„์ด์ง€๋งŒ์„œ๋„ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ์นผ๋Ÿผ์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ๋ฌด์—‡์ด ์žˆ์„๊นŒ ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค.

  1. forEach๋ฌธ์„ ํ†ตํ•ด columnlist, card ๋ฐฐ์—ด์„ ๋”ฐ๋กœ ๋‘๊ณ  ๊ฐ๊ฐ push
  2. col_list์— ๋Œ€ํ•ด์„œ ์ฟผ๋ฆฌ๋ฌธ์„ ํ†ตํ•ด ์ปฌ๋Ÿผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ

ํ˜„์žฌ๋Š” 1๋ฒˆ์„ ์ด์šฉํ•œ ๋ฐฉ์‹์œผ๋กœ ๋กœ์ง์„ ์ž‘์„ฑํ–ˆ๋Š”๋ฐ, ํ›„์— ์ด๋Ÿฌํ•œ ๋‘ ๋ฐฉ์‹ ์ค‘์— ์–ด๋–ค ๋ฐฉ์‹์ด ๋‚˜์„์ง€์— ๋Œ€ํ•ด์„œ ๊ณ„์†ํ•ด์„œ ๊ณ ๋ฏผํ•ด๋ด์•ผํ•  ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™๋‹ค.

๋น„๋™๊ธฐ ๋ฆฌ๋ Œ๋”๋ง ๊ด€๋ จ๋œ ๋ฌธ์ œ

import { onColumnDataChanged } from "../../../feature/mainsection/rendering.js";
import apicall from "../../../shared/utils/apicall.js";
 
export function submitNewCard(targetForm) {
  try {
    const title =
      targetForm.getElementsByClassName("form__input--title")[0].value;
    const detail = targetForm.getElementsByClassName(
      "form__textarea--cardDetail"
    )[0].value;
    const section = targetForm.id;
    apicall.post("/api/todo/new", {
      title: title,
      detail: detail,
      section: section,
    });
    onColumnDataChanged();
  } catch (error) {
    console.error(`error while data fetching : ${error}`);
  }
}
 

์ƒˆ๋กœ์šด task๋ฅผ ์ถ”๊ฐ€ํ–ˆ์„ ๊ฒฝ์šฐ์— post ๋ฉ”์„œ๋“œ์˜ api๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๊ณ , ์ดํ›„์—๋Š” ๋‹ค์‹œ๊ธˆ ๋ฆฌ๋ Œ๋”๋ง์„ ์ด‰๋ฐœ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ๋ Œ๋”๋ง์„ ์œ„ํ•œ ํŒŒ์ผ์„ feature์— ๋†“๊ณ  ๋๋‚˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์„ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์„ค๊ณ„ํ•˜์˜€๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์— ์ œ๋Œ€๋กœ ๋œ ์ •๋ณด์˜ ๊ฐฑ์‹ ์ด ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ์˜ค๋Š” ์˜ค๋ฅ˜๊ฐ€ ์žˆ์—ˆ๋‹ค.

ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์ž์„ธํžˆ ๋ณธ ๊ฒฐ๊ณผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์ฝ”๋“œ์—์„œ post๊ฐ€ ์ด๋ฃจ์–ด์ง„ ํ›„์— get์š”์ฒญ์ด ์ด๋ฃจ์–ด์ ธ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋ถ€๋ถ„์„ ๊ฐ„๊ณผํ•˜๊ณ  async/await์„ ํ™œ์šฉํ•˜์ง€ ์•Š์•„ ๋น„๋™๊ธฐ์ ์œผ๋กœ post์™€ get ์š”์ฒญ์ด ์ด์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ฐฑ์‹ ๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๋ฅผ fetchํ•ด์˜ค๊ณ  ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

router.post("/new", async (req, res) => {
  const { title, detail, section } = req.body;
  await transaction(todoRepository.addCard, [title, detail, section]);
  res.type("Content-Type", "application/json");
  res.status(201).json({ message: "Card created successfully" });
});

ํ•˜์ง€๋งŒ async/await์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ์Œ์—๋„ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , api๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ ์•ˆ์—์„œ post ์ดํ›„์˜ ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ฌธ์ œ๋Š” post ์š”์ฒญ์„ ๋ฐ›์•˜์„ ๋•Œ ๋”ฐ๋กœ ๋ณด๋‚ด์ค„ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์‘๋‹ต์„ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.