React 에서 MySQL 데이터 편집하기

일전에는 React 에서 내 로컬 MySQL 로 데이터를 전송하는 동작까지 구현을 했습니다.

아래 버튼을 통해 데이터 전송 동작까지 구현된 포스팅을 확인 가능합니다.

이번에는 데이터를 조회하고, 해당 데이터를 편집하는 방법을 구현하겠습니다. 

프론트엔드

우선 프론트엔드 코드를 생성합시다. 

저는 EditTest.js 라는 이름으로 새롭게 코드를 생성했습니다.

이전 포스팅에서 제작했던 SendTest.js 코드를 최대한 이용하는 방식으로 아래와 같이 전체 코드를 구성했습니다. 

				
					import React, { useState } from "react";
import { json } from "react-router-dom";

const EditTest = () => {
  const [data, setData] = useState({
    id: "",
    password: "",
    code: "",
    email: "",
  });

  const { id, password, code, email } = data;

  const onChange = (e) => {
    const nextData = {
      ...data,
      [e.target.name]: e.target.value,
    };
    setData(nextData);
  };

  const onSearch = async () => {
    try {
      const response = await fetch("http://localhost:5000/search", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        // 서버에 id를 객체 형태로 전송
        body: JSON.stringify({ id: id }),
      });

      if (response.ok) {
        const result = await response.json(); // 응답을 JSON 형식으로 파싱
        alert("데이터 조회에 성공했습니다.");
        setData(result); // 조회한 데이터로 state 업데이트
      } else {
        alert("해당하는 id의 데이터가 존재하지 않습니다.");
      }
    } catch (error) {
      alert("라우터 접근에 문제가 있습니다: " + error.message);
    }
  };

  const onEdit = async () => {
    try {
      const response = await fetch("http://localhost:5000/edit", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
        },
        body: JSON.stringify(data),
      });

      if (response.ok) {
        alert("데이터가 성공적으로 전송되었습니다.");
        // 성공적으로 데이터를 보냈다면, 필요한 후속 조치를 여기에 추가할 수 있습니다.
        setData({
          id: "",
          password: "",
          code: "",
          email: "",
        });
      } else {
        alert("데이터 전송에 실패했습니다.");
      }
    } catch (error) {
      alert("라우터 접근에 문제가 있습니다.");
    }
  };

  return (
    <>
      <h1> 데이터 편집하기 </h1>
      <label> ID 입력 :</label> <br />
      <input type="text" name="id" onChange={onChange} value={id} />
      <button onClick={onSearch}>조회하기</button>
      <br />
      <br />
      <label> password 입력 :</label>
      <br />
      <input
        type="password"
        name="password"
        onChange={onChange}
        value={password}
      />
      <br />
      <br />
      <label> code 입력 :</label>
      <br />
      <input type="text" name="code" onChange={onChange} value={code} />
      <br />
      <br />
      <label> email 입력 :</label>
      <br />
      <input type="email" name="email" onChange={onChange} value={email} />
      <br />
      <br />
      <br />
      <button onClick={onEdit}> 편집하기 </button>
    </>
  );
};

export default EditTest;

				
			

주요점은 onEdit 과 onSearch 가 될 것 같습니다.

id 를 입력후 조회하기 버튼을 눌러 데이터를 불러오고,

불러온 데이터를 수정하여 편집하기 버튼을 눌러 데이터를 편집 가능하게 할 계획입니다. 

이제 onEdit 과 onSearch 가 사용할 백엔드 라우터를 제작합시다. 

백엔드

먼저 onEdit 과 관련된 라우터 입니다. 

onEdit 라우터는 id, password, code, email 을 인자로 받아서 테이블에서 Key 값에 해당하는 id 를 통해 값을 업데이트 가능케 해주는 기능을 담당할 겁니다.

코드는 다음과 같습니다. 

				
					// '/edit' 경로에 대한 POST 요청 처리
app.post("/edit", (req, res) => {
  const { id, password, code, email } = req.body;
  const query = `
      INSERT INTO user_info (id, password, code, email)
      VALUES (?, ?, ?, ?)
      ON DUPLICATE KEY UPDATE
      password = VALUES(password),
      code = VALUES(code),
      email = VALUES(email);
    `;

  // 데이터베이스에 데이터를 삽입하거나, 중복된 id가 있을 경우 업데이트
  connection.execute(
    query,
    [id, password, code, email],
    (error, results, fields) => {
      if (error) {
        console.error("데이터 삽입 또는 업데이트 실패:", error);
        res.status(500).send("데이터 작업에 실패했습니다.");
      } else {
        if (results.affectedRows === 0) {
          console.log("변경된 데이터가 없습니다.");
          res.status(200).send("변경된 데이터가 없습니다.");
        } else {
          if (results.insertId === 0) {
            console.log("데이터가 업데이트되었습니다:", results);
            res.status(200).send("데이터가 업데이트되었습니다.");
          } else {
            console.log("데이터가 삽입되었습니다:", results);
            res.status(200).send("데이터가 삽입되었습니다.");
          }
        }
      }
    }
  );
});
				
			

다음은 조회하기 버튼을 누르면 작동한 라우터입니다.

이 라우터는 id 를 인자로 받아서, 해당 id를 통해 내 DB에서 검색 후 결과를 프론트엔드로 전달합니다. 

				
					// '/search' 경로에 대한 POST 요청 처리
app.post("/search", (req, res) => {
  const { id } = req.body;
  const query = "SELECT * FROM user_info WHERE id = ?";

  // 데이터베이스에서 해당 id의 데이터를 검색
  connection.query(query, [id], (error, results, fields) => {
    if (error) {
      console.error("데이터 검색 실패:", error);
      res.status(500).send("데이터 검색에 실패했습니다.");
      return;
    }
    if (results.length > 0) {
      console.log("데이터를 찾았습니다:", results);
      res.status(200).json(results[0]);
    } else {
      console.log("해당하는 데이터가 없습니다.");
      res.status(404).send("해당하는 데이터가 없습니다.");
    }
  });
});
				
			

테스트

자 이제 과연 잘 작동이 되는지 테스트를 해볼 시간입니다.

우선 현재 저의 user_info 테이블의 데이터입니다.

test 라는 id 를 Key 값으로 하여 다음과 같이 데이터 한 줄이 삽입이 되어 있는 상태이죠.

이 데이터를 조회하기 위해서는 프론트엔드에서 id 에 test 를 입력하고 조회하기 버튼을 누르면 될 겁니다.

바로 시행을 해보면…

데이터 조회에 성공했다는 메시지가 발생합니다.

이 메시지의 확인을 눌러주면…

id 가 test 에 해당했던 다른 Column 들의 값이 주르륵 나타나게 됩니다.

이제 적절하게 데이터를 수정해볼까요?

저는 password 에 0000 , code 에 0000, email 도 앞을 0000 으로 죄다 변경을 해보려 합니다. 

위처럼 내가 원하는대로 적절하게 id가 test에 해당하는 다른 값들을 변경했다면

이제 편집하기 버튼을 눌러 기존값을 수정해봅시다.

전송이 선공했다는 메시지가 발생할 것이고, 정말 잘 전송이 됐는지 확인하기 위해서 실제 DB로 이동을 해봅시다.

깔끔하게 변경한 내용대로 수정이 됐습니다. 

이걸로 내 DB 에 데이터를 전송하는 로직과, 불러오는 로직, 수정하는 로직을 작동 가능하게 됐습니다. 

마치며...

이제 로컬에서 MySQL 을 통한 DB에 접근하는 라우터를 구축하고 테스트하는 것이 보다 용이할 것 같습니다.