๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ“š ์‹œ๋ฆฌ์ฆˆ/- Jenkins์™€ Webhook์„ ์ด์šฉํ•œ CICD

[Webhook์„ ์ด์šฉํ•˜์—ฌ CI CD ๊ตฌ์„ฑํ•˜๊ธฐ] - ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœํ•˜๊ธฐ

by Wonit 2021. 8. 30.

ํ•ด๋‹น ๊ธ€์€ Jenkins์™€ Github Webhook์„ ์ด์šฉํ•œ CICD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑํ•˜๊ธฐ ์‹œ๋ฆฌ์ฆˆ ์ž…๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์•„๋ž˜ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ•ด์ฃผ์„ธ์š”!

 

๋งŒ์•ฝ ํ•ด๋‹น ์‹ค์Šต ๋‚ด์šฉ์˜ ์ฝ”๋“œ๊ฐ€ ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ํ”„๋กœ์ ํŠธ ๊นƒํ—ˆ๋ธŒ ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

์ˆœ์„œ

  • UI ๋งŒ๋“ค๊ธฐ
  • ํ†ต์‹  ๋กœ์ง ๊ตฌํ˜„ํ•˜๊ธฐ

 

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœํ•˜๊ธฐ

 

์ด๋ฒˆ ํŽธ์—์„œ๋Š” CICD ํŒŒ์ดํ”„๋ผ์ธ์„ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•ด๋ณด๋ ค ํ•œ๋‹ค.

 

์šฐ์„  ์‚ฌ์ „์— ์‹œ๋ฆฌ์ฆˆ๋ฅผ ์‹œ์ž‘ํ•˜๋ฉฐ์—์„œ ์ด์•ผ๊ธฐ ํ–ˆ๋“ฏ, ํ”„๋ก ํŠธ์—”๋“œ๋Š” ๋ฆฌ์•กํŠธ๋ฅผ ์ด์šฉํ•˜๋ ค ๊ตฌ์„ฑํ•  ์˜ˆ์ •์ด๋‹ค.

 

๋งŒ์•ฝ ๋ณธ์ธ์ด ๋ฆฌ์•กํŠธ์— ๋Œ€ํ•ด์„œ ์•Œ์ง€ ๋ชปํ•œ๋‹ค๋ฉด todo-with-cicd github ์—์„œ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•ฉ๋‹ˆ๋‹ค.

 

์ปจ์…‰์€ TodoList์ด๋‹ค.

 

์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค UI๋ฅผ ํ™•์ธํ•ด๋ณด์ž

 

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ์ด ๋  ๊ฒƒ์ด๋ฉฐ, Todo List ์˜ Item ๋“ค์€ ๋ฐฑ์—”๋“œ๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜ค๊ณ  ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ์˜ˆ์ •์ด๋‹ค.

 

UI ๋งŒ๋“ค๊ธฐ

 

์œ„์˜ UI ์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ถ„๋ฆฌ์‹œํ‚ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

 

 

์ด 5๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ๊ณ , ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

 

  • TodoPresenter.js : Container-Presenter Pattern ์˜ Presenter ์ปดํฌ๋„ŒํŠธ
  • TodoInput.js : ์ƒˆ๋กœ์šด Todo ๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” input ์ปดํฌ๋„ŒํŠธ
  • TodoList.js : Todo Item ๋“ค์ด ๋ชจ์—ฌ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ
  • TodoItem.js : Todo ์ด๋ฆ„๊ณผ ์‚ญ์ œ ๋ฒ„ํŠผ์ด ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ
  • App.js : : TodoPresenter์˜ Container ์ปดํฌ๋„ŒํŠธ

 

์ด์ œ ํ•˜๋‚˜ ํ•˜๋‚˜ UI๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด๋„๋ก ํ•˜์ž.

 

1. ํ”„๋กœ์ ํŠธ ์„ธํŒ…

 

๋ฆฌ์•กํŠธ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ๋Š” facebook ์ด ๋งŒ๋“  boiler plate project ์ธ create-react-app ์„ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“  ๋’ค, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ปค๋งจ๋“œ๋ฅผ ์ž…๋ ฅํ•˜์ž.

 

์ฐธ๊ณ ๋กœ ํ•ด๋‹น ์ปค๋งจ๋“œ๋Š” node ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•˜๊ณ  npm ์„ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋กœ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

// brew
$ brew install node

$ npx create-react-app frontend

// ํ˜น์€ create-react-app ์ด global ํ•˜๊ฒŒ ์„ค์น˜๋˜์–ด์žˆ๋‹ค๋ฉด

$ create-react-app frontend

 

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  npm ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•  ๊ฒƒ์ธ๋ฐ, /frontend ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜๋กœ ๊ฐ€์„œ, ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์ž.

 

UI๋Š” styled-components ๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๊ณ  ํ†ต์‹  ๋ชจ๋“ˆ๋กœ๋Š” axios ๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๋‹ค.

 

npm install ์€ package.json ์ด ์œ„์น˜ํ•œ ๊ฒฝ๋กœ์—์„œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค

 

$ npm install -y styled-components // ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ๋ง
$ npm install -y axios // js ํ†ต์‹  ๋ชจ๋“ˆ

 

๊ทธ๋Ÿผ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ์— /frontend ์•„๋ž˜์— public, src ์™€ ๊ฐ™์€ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ๊ธด๋‹ค.

 

/src ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ ˆ์— ์žˆ๋Š” js ํŒŒ์ผ ์ค‘์—์„œ index.js ์™€ App.js ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€๋ฅผ ์ง€์šฐ๊ณ  index.js, App.js ์—์„œ ์‚ญ์ œ๋œ ํŒŒ์ผ๋“ค์˜ ์˜์กด์„ฑ์„ ๋ชจ๋‘ ์—†์• ์ค€๋‹ค.

 

2. ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ๋ฐ ํŒŒ์ผ ๊ตฌ์กฐ

 

/src ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ž˜์—์„œ /components ๋ผ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ์ผ๋“ค์„ ๋งŒ๋“ค์ž

 

  • Presenter ์ปดํฌ๋„ŒํŠธ
    • /components/TodoInput.js
    • /components/TodoItem.js
    • /components/TodoList.js
    • /components/TodoPresenter.js
  • Container ์ปดํฌ๋„ŒํŠธ
    • /App.js
  • React Dom Render ํŒŒ์ผ
    • /index.js
  • ํ†ต์‹  ๋ชจ๋“ˆ๊ณผ ๊ด€๋ จ๋œ ํŒŒ์ผ
    • /util/SERVER.js
    • /util/service.js

 

๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

 

โ”œโ”€โ”€ package-lock.json
โ”œโ”€โ”€ package.json
โ”œโ”€โ”€ public
โ”œโ”€โ”€ src
โ”‚   โ”œโ”€โ”€ App.js
โ”‚   โ”œโ”€โ”€ components
โ”‚   โ”‚   โ”œโ”€โ”€ TodoInput.js
โ”‚   โ”‚   โ”œโ”€โ”€ TodoItem.js
โ”‚   โ”‚   โ”œโ”€โ”€ TodoList.js
โ”‚   โ”‚   โ””โ”€โ”€ TodoPresenter.js
โ”‚   โ”œโ”€โ”€ index.js
โ”‚   โ””โ”€โ”€ util
โ”‚       โ”œโ”€โ”€ SERVER.js
โ”‚       โ””โ”€โ”€ service.js
โ””โ”€โ”€ yarn.lock

 

์ด์ œ ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ์™€ UI ๊ทธ๋ฆฌ๊ณ  ํ†ต์‹  ๋ชจ๋“ˆ์„ ๊ฐœ๋ฐœํ•ด๋ณด์ž.

 

3. TodoInput.js ๊ฐœ๋ฐœํ•˜๊ธฐ

 

TodoInput ์€ ํ•ด์•ผํ•  ์ผ์„ ์ž…๋ ฅํ•˜๊ณ  ํ•ด๋‹น text๋ฅผ ์„œ๋ฒ„๋กœ ์ €์žฅ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

 

 

์šฐ๋ฆฌ๊ฐ€ ์•ž์„œ ๋งŒ๋“  TodoInput.js ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ์–ด๋ณด์ž

 

import React, { useState } from "react";
import styled from "styled-components";

const Input = styled.input`
  padding: 12px;
  border-radius: 4px;
  border: 1px solid #dee2e6;
  width: 100%;
  outline: none;
  font-size: 14px;
  box-sizing: border-box;
`;

const InputWrapper = styled.div`
  display: flex;
  justify-content: center;
  align-items: center;
`;

const Button = styled.button`
  padding: 12px;
  margin: 25px;
  border-radius: 4px;
  border: 1px solid #dee2e6;
  outline: none;
  font-size: 14px;
  box-sizing: border-box;
  cursor: pointer;

  transition: 0.5s ease;

  :hover {
    background-color: #fff;
    border-color: #59b1eb;
    color: #59b1eb;
  }
`;

const TodoInput = ({ addAndSetTodos }) => {
  const [text, setText] = useState("");

  const handleChangeTextBox = (e) => {
    const { value } = e.target;

    setText(value);
  };

  const handleOnKeyPress = (e) => {
    if (e.key === "Enter") {
      handleOnClickAddButton();
    }
  };

  const handleOnClickAddButton = () => {
    if (text === "") {
      alert("๊ฐ’์„ ์ž…๋ ฅํ•˜์„ธ์š”");
    } else {
      addAndSetTodos(text);
      setText("");
    }
  };

  return (
    <>
      <InputWrapper>
        <Input
          placeholder="์ƒˆ๋กœ์šด Todo ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”"
          value={text}
          onChange={handleChangeTextBox}
          onKeyPress={handleOnKeyPress}
        />
        <Button onClick={handleOnClickAddButton}>์ถ”๊ฐ€ ํ•˜๊ธฐ</Button>
      </InputWrapper>
    </>
  );
};

export default TodoInput;

 

์—ฌ๊ธฐ์— ๋ณด์ด๋Š” addAndSetTodos ํ•จ์ˆ˜๋Š” ์ถ”ํ›„ TodoPresenter ์˜ Container ์ธ App.js ์—์„œ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ๋‚ด๋ ค์ค„ ํ•จ์ˆ˜์ธ๋ฐ, ๋จผ์ € ๋ฒ„ํŠผ์˜ onClick์— ๋ฐ”์ธ๋”ฉ ์‹œ์ผœ์ฃผ๋„๋ก ํ•˜์ž

 

4. TodoItem.js ๊ฐœ๋ฐœํ•˜๊ธฐ

 

TodoItem ์€ App.js ์—์„œ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด ๋ฐ›์•„์˜จ Todo ๊ฐ์ฒด๋ฅผ ๋ฐ›์•„ ํ•˜๋‚˜์˜ Todo Item ์œผ๋กœ ๋ณด์—ฌ์ง€๊ฒŒ ํ•  ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

 

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

 

import React from "react";
import styled from "styled-components";

const Container = styled.div`
  width: 100%;

  display: flex;
  justify-content: space-between;
  align-items: center;
  margin: 14px;
`;

const List = styled.li`
  list-style: none;
  margin: 0 15px;
`;

const Button = styled.button`
  margin: 0 15px;
  cursor: pointer;
  border-radius: 4px;
  border: 1px solid #dee2e6;
  outline: none;
  font-size: 12px;
  box-sizing: border-box;

  transition: 0.5s ease;

  :hover {
    background-color: #fff;
    border-color: #59b1eb;
    color: #59b1eb;
  }
`;

const TodoItem = ({ todo, deleteAndSetTodos }) => {
  const { id, content } = todo;

  console.log(id);

  return (
    <Container>
      <List>[ {content} ]</List>
      <Button onClick={() => deleteAndSetTodos(id)}>์‚ญ์ œ</Button>
    </Container>
  );
};

export default TodoItem;

 

deleteAndSetTodos๋Š” ์„œ๋ฒ„์—๊ฒŒ ํ•ด๋‹น TodoItem ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” id๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŠน์ • todo๋ฅผ ์‚ญ์ œํ•ด๋‹ฌ๋ผ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ App.js ์—์„œ ๋งŒ๋“ค์–ด์„œ props ๋กœ ๋‚ด๋ ค์ค„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋‹จ์€ ๋„ฃ์–ด์ฃผ์ž

 

5. TodoList.js

 

App.js ์—์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— mount ๋  ๋•Œ ์„œ๋ฒ„๋กœ ์ €์žฅ๋œ todo ๋“ค์„ ๋ชจ๋‘ ์กฐํšŒํ•˜๋Š” ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

 

๊ทธ๋Ÿฌ๋ฉด ์„œ๋ฒ„๋Š” Todo์˜ ๊ฐ์ฒด ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

 

ํ•ด๋‹น ๋ฐฐ์—ด์„ TodoList ์—๊ฒŒ ์ „๋‹ฌํ•ด์ฃผ๊ฒŒ ๋˜๊ณ  TodoList๋Š” ๋ฐฐ์—ด์„ map ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ๊ฐ์˜ ๋ฐฐ์—ด ์›์†Œ๋“ค์„ TodoItem.js ์˜ Props ๋กœ ๋‚ด๋ ค์ฃผ๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

 

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ์„ ํ•ด๋ณด์ž.

 

import React from "react";
import TodoItem from "./TodoItem";

const TodoList = ({ todos, deleteAndSetTodos }) => {
  return (
    <>
      {todos.map((todo, index) => (
        <TodoItem
          key={index}
          todo={todo}
          deleteAndSetTodos={deleteAndSetTodos}
        />
      ))}
    </>
  );
};

export default TodoList;

 

TodoItem ์—์„œ ์‚ฌ์šฉํ•  deleteAndSetTodo ํ•จ์ˆ˜๋„ ์—ญ์‹œ ๋ฐ›์•„์„œ TodoItem ์œผ๋กœ ๋‚ด๋ ค์ค˜์•ผ ํ•œ๋‹ค.

 

6. TodoPresenter.js ๊ฐœ๋ฐœํ•˜๊ธฐ

 

์ด์ œ ๋ชจ๋“  UI ์ปดํฌ๋„ŒํŠธ๋Š” ๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ๊ณ , UI๋“ค์„ ํ•˜๋‚˜๋กœ ๋ชจ์•„์ค„ Presenter ๋ฅผ ๊ตฌ์„ฑํ•ด๋ณด๋„๋ก ํ•˜์ž.

 

import React from "react";
import styled from "styled-components";

import TodoInput from "./TodoInput";
import TodoList from "./TodoList";

export const Background = styled.div`
  height: 100vh;
  width: 100vw;

  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;

  background: #e9ecef;
`;

export const Container = styled.div`
  width: 512px;
  height: 768px;

  background: white;
  border-radius: 16px;
  box-shadow: 0 0 8px 0 rgba(0, 0, 0, 0.04);

  margin: 0 auto;

  margin-top: 96px;
  margin-bottom: 32px;
  display: flex;
  flex-direction: column;

  align-items: center;
`;

export const Title = styled.h1`
  font-size: 2rem;
  color: #343a40;
`;

const Subtitle = styled.h2`
  font-size: 1rem;
  color: gray;
  padding-bottom: 30px;
  width: 100%;
  text-align: center;
  border-bottom: 1px solid;
`;

const TodoPresenter = ({ todos, addAndSetTodos, deleteAndSetTodos }) => {
  return (
    <Background>
      <Container>
        <Title>ํ‰๋ฒ”ํ•œ Todo List</Title>
        <Subtitle>๊ทผ๋ฐ ์ด์ œ, cicd pipeline ์„ ๊ณ๋“ค์ธ</Subtitle>
        <TodoInput addAndSetTodos={addAndSetTodos} />
        <TodoList todos={todos} deleteAndSetTodos={deleteAndSetTodos} />
      </Container>
    </Background>
  );
};

export default TodoPresenter;

 

๋งŒ์•ฝ ๋ฆฌ์•กํŠธ์— ์ž์‹ ์ด ์—†๊ฑฐ๋‚˜ ์ž˜ ๋ชจ๋ฅธ๋‹ค๋ฉด ๊ทธ๋ƒฅ ๋ณต์‚ฌ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ํ•ด๋„ ์ถฉ๋ถ„ํ•˜๋‹ค!

 

7. App.js ๊ฐœ๋ฐœํ•˜๊ธฐ

 

App.js ์—์„œ๋Š” TodoPresenter ์—์„œ ์‚ฌ์šฉํ•  ๋ชจ๋“  ํ•จ์ˆ˜์™€ state ๋“ค ๊ทธ๋ฆฌ๊ณ  props ๋“ค์„ ๊ด€๋ฆฌํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

์ฆ‰, ์ƒํƒœ์— ๊ด€ํ•œ ๋กœ์ง์ด ๋“ค์–ด๊ฐ€๋Š” ๋ถ€๋ถ„์ด๋‹ค.

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ•ด๋ณด์ž!

 

import React, { useEffect, useState } from "react";

import TodoPresenter from "./components/TodoPresenter";

import { fetchTodos, addTodo, deleteTodo } from "./util/service";

const App = () => {
  const [todos, setTodos] = useState([]);

  const fetchAndSetTodos = async () => {
    const data = await fetchTodos();
    setTodos(data);
  };

  const addAndSetTodos = async (todo) => {
    const data = await addTodo(todo);
    setTodos(todos.concat(data));
  };

  const deleteAndSetTodos = async (id) => {
    const { data: removedTodo } = await deleteTodo(id);
    setTodos(todos.filter((todo) => todo.id !== removedTodo));
  };

  useEffect(() => {
    fetchAndSetTodos();
  }, []);

  return (
    <TodoPresenter
      todos={todos}
      addAndSetTodos={addAndSetTodos}
      deleteAndSetTodos={deleteAndSetTodos}
    />
  );
};

export default App;

 

์ด์ œ UI ๊ฐœ๋ฐœ์€ ์™„๋ฃŒ๋˜์—ˆ๋‹ค!

 

 

์ด์ œ ํ†ต์‹  ๋กœ์ง์„ ๊ฐœ๋ฐœํ•ด๋ณด์ž

 

8. ํ†ต์‹  ๋ชจ๋“ˆ ๊ฐœ๋ฐœํ•˜๊ธฐ

 

์•ž์„œ ์šฐ๋ฆฌ๋Š” util ๋””๋ ‰ํ† ๋ฆฌ ์•„๋ฆฌ์— ๋‹ค์Œ 2๊ฐœ์˜ ํŒŒ์ผ์„ ๋งŒ๋“ค์—ˆ๋‹ค.

 

  1. SERVER.js
  2. service.js

 

SERVER.js ์—์„œ๋Š” ์„œ๋ฒ„์˜ url ๊ณผ ํ†ต์‹ ์— ํ•„์š”ํ•œ header ๋ฅผ ์„ธํŒ…ํ•ด์ค„ ๊ฒƒ์ด๊ณ , service.js ์—์„œ ์‹ค์ œ ํ†ต์‹  ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑํ•˜์ž

 

// SERVER.js
import axios from "axios";

export const SERVER = axios.create({
  baseURL: "http://127.0.0.1:8080",
  headers: {
    "Content-Type": "application/json",
  },
});

// service.js
import { SERVER } from "./SERVER";

export const fetchTodos = async () => {
  const { data } = await SERVER.get("/api/todos");

  return data;
};

export const addTodo = async (todo) => {
  const { data } = await SERVER.post("/api/todos", JSON.stringify(todo));

  return data;
};

export const deleteTodo = async (id) => {
  const data = await SERVER.delete("/api/todos/" + id);

  return data;
};

 

์ด๋ ‡๊ฒŒ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ด ๋๋‚ฌ๋‹ค.

 

๊ณ„์†ํ•ด์„œ ๊ฐ•์กฐํ•˜์ง€๋งŒ ์ด ์‹œ๋ฆฌ์ฆˆ๋Š” ํ”„๋ก ํŠธ๋‚˜ ๋ฐฑ์˜ ๊ฐœ๋ฐœ ๊ณผ์ •์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ Jenkins๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ๋ณต๋ถ™ํ•ด๋„ ์•„๋ฌด๋Ÿฐ ์ง€์žฅ์ด ์—†๋‹ค

 

๋งŒ์•ฝ ์ฝ”๋“œ๊ฐ€ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด github ์— ๋ฐฉ๋ฌธํ•ด์„œ ํ™•์ธํ•  ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์ž. github ์ฃผ์†Œ๋Š” ์ƒ๋‹จ์— ์žˆ๋‹ค

 

๋Œ“๊ธ€