react & node.js 개발 - mysql에 배열 데이터 저장하기

여러가지 방법이 있는 것 같은데 성능적으로는 배열 자료형을 문자열로 바꿔서 문자열로 저장하는 방법이 좋은 것 같다

 

배열이나 객체를 문자열로 바꾸는 방법은 JSON.stringify()

 

그리고 이렇게 바뀐 문자열을 다시 배열이나 객체로 바꿀려면 JSON.parse()하면 된다

 

다음과 같이 객체 optionData를 JSON.stringify()로 문자열로 바꿔서 서버에 보내준다

 

var optionData = {
  title: title,
  description: description,
  data: data.map(x => {
    return {
      optionTitle: x.optionTitle,
      targetUploadType: x.targetUploadType,
      uploadTargetPath:
        x.targetUploadType !== 'image'
          ? x.uploadTarget
          : x.uploadTarget.path,
    };
  }),
  isMultipleChoice,
  category,
  isPowerVoteChoice,
  thumbnailImage: thumbnailImageData.file.path,
  end_dt: endDt,
  user_id: user_id
};

formData.append('optionData', JSON.stringify(optionData));

 

객체처럼 보이지만 console.log(typeof req.body.optionData)로 찍어보면 string으로 나온다

 

제목 없음.jpg

 

물론 clinet에서 optionData는 object로 찍힌다.

 

제목 없음.jpg

 

아무튼 이렇게 string으로 받은 객체를 object로 활용할려면 JSON.parse()로 다시 object로 바꾼다음에 사용한다

 

이제 object로 바꾸고

 

{"title":"윤아","description":"윤아에요","data":[{"optionTitle":"윤아","targetUploadType":"image","uploadTargetPath":"300400.jpg"},{"optionTitle":"윤아임","targetUploadType":"image","uploadTargetPath":"spring.jpg"}],"isMultipleChoice":false,"category":4,"isPowerVoteChoice":false,"thumbnailImage":"spring.jpg","end_dt":0,"user_id":"1"}

 

를 DB에 저장할려고 한다.

 

각각 속성을 뽑아서 DB에 저장하면 되겠지만..

 

"data":[{"optionTitle":"윤아","targetUploadType":"image","uploadTargetPath":"300400.jpg"},{"optionTitle":"윤아임","targetUploadType":"image","uploadTargetPath":"spring.jpg"}]

 

이 부분이 배열로 되어 있는데 이걸 MySQL에 저장하고 싶다

 

그러면 역시 JSON.stringify()로 바꿔서 DB에 저장하면 되겠다.

 

const upload_vote = multer({storage:storage}).array('files'); //single: to use single file upload, array: to use multiple file upload

app.post('/api/vote', upload_vote, (req,res) => {


    const req_data = JSON.parse(req.body.optionData)

    Vote.create({
        title: req_data.title,
        description: req_data.description,
        options: JSON.stringify(req_data.data),
        isMultipleChoice: req_data.isMultipleChoice,
        category: req_data.category,
        thumbnailImageUrl: `http://localhost:${PORT}/images/${req.files[0].filename}`,
        end_date: req_data.end_dt,
        user_id: Number(req_data.user_id)
    })
    .then(result => {
        res.send({
            message:"success"
        })
    })
    .catch(e => {
        console.log(e)
        throw e;
    })
})

 

물론 DB에서 빼서 활용할려면?

 

JSON.parse()로 배열로 바꿔서 활용하면 되겠다

 

[MYSQL] 📚 RDB에 배열을 저장하는 방법 (tistory.com)

 

[MYSQL] 📚 RDB에 배열을 저장하는 방법

MySQL에 배열 데이터를 저장 게시판을 제작하는데 있어, 게시글의 내용을 서버에 다음과 같이 보낸다고 가정해보자. 게시글 제목(title)과 게시글 제목(description) 그리고 게시글에 사용된 이미지(thu

inpa.tistory.com

 

728x90