본문 바로가기
경일/nodejs

[nodejs] 회원만 이용가능 한 게시판 만들기 (feat. mySQL)

by dev_kong 2022. 2. 12.
728x90
728x90

0. 목차

1. 개요

2. DB

3. 파일 쪼개기

4. CRUD 기능개발

5. 후기

1. 개요

728x90

2022.02.11 - [경일/nodejs] - [node.js] express-session, mySQL 로그인 기능 구현

 

[node.js] express-session, mySQL 로그인 기능 구현

0. 목차 1. 개요 2. mySQL 3. 기본셋팅 / 파일 쪼개기 4. 기능개발 5.후기 1. 개요 mySQL 안한지 너무 오래됐다. 까먹을거 로그인기능 mySQL 이용해서 만들거다. 회원가입기능은 다음에.. 2. mySQL 데이터 베

kong-dev.tistory.com

위 포스팅에서 만든거에다가,

회원만 이용가능한 게시판을 만들거다.ㅎ

 

2. DB

 

 

user table

 

board table

이런 식으로 디비를 만들어서 임시데이터를 만들었다.

 

3. 파일쪼개기

 

쪼갬 ^^

4. CRUD 기능개발

4-1. board list

exports.listGetMid = (req, res) => {
  const query = `SELECT board._id, board.subject, user.name AS username 
                    FROM board
                    JOIN user
                    ON board.author = user._id`;
  db.query(query, (error, result) => {
    if (error) return console.log(error);

    if (result) res.render('board/list.html', { boardList: result });
  });
};

쿼리문이 길어져서 선언을 해준뒤에 따로 뺐다.

결과물을 boardList  변수에 담아 html로 전달해주고,

html에선 for문으로 돌려서 db에 있는 내용을 랜더링 해준다

 

 

4-2. board view

exports.viewGetMid = (req, res) => {
  const index = Number(req.query.index);
  const query = `SELECT board.subject, user.name AS username, board.content
                    FROM board
                    JOIN user
                    ON board.author = user._id
                    WHERE board._id = ${index}
                    `;
  db.query(query, (error, result) => {
    if (error) return console.log(error);

    if (result) {
      res.render('board/view.html', { posting: result[0] });
    }
  });
};

음 뭐 딱히 설명할게 없다.

굳이굳이 하나 하자면,

내가 board 스키마를 짤때,

_id 값을 INT 로 해놔서,

req.query.index 는 문자열이라 number 로바꿔 주었다.

 

4-2. board write

exports.writeGetMid = (req, res) => {
  const { name } = req.session.user;
  res.render('board/write.html', { username: name });
};

exports.writePostMid = (req, res) => {
  const { _id } = req.session.user;
  const { subject, content } = req.body;
  if (subject === '' || content === '') {
    res.send(alertMove('/board/write', '공백은 입력이 불가능 합니다'));
  } else {
    const query = `INSERT board (subject, content, author)
                 VALUES ("${subject}","${content}","${_id}")`;
    db.query(query, (error, result) => {
      if (error) return console.log(error);

      if (result) res.redirect(`/board/view?index=${result.insertId}`);
    });
  }
};

get 요청이 왔을때는 로그인된 아이디를 html 로 전송해주었다.

 

이렇게 작성자에 수정할수 없게끔 만들어주고 싶었음 ㅎ

 

 

POST 요청은 우선 제목과 내용에 모두 아무런 내용도 입력되지 않으면, 디비에 등록이 안되게끔 처리했다.

그리고 글쓰기 버튼을 누르면 디비에 내용이 등록되고, 내가쓴 글의 뷰 페이지로 이동을 하게끔 해야했는데,

uri query 에 넣어줄 값을 고민을 했었다.

근데 console.log 로 result 찍어보니까, 

insertId 란 값이있었다.

그게 해당 게시물의 추가된 _id 값이더라 그래서 그걸로 넣어줬다.

 

 

 

4-3. board edit

exports.editGetMid = (req, res) => {
  const { _id } = req.session.user;
  const index = Number(req.query.index);
  const query = `SELECT board._id, board.subject, user.name AS username, board.content
                    FROM board
                    JOIN user
                    ON board.author = user._id
                    WHERE board._id = ${index}
                    `;

  db.query(query, (error, result) => {
    if (error) return console.log(error);

    if (result) {
      if (result[0]._id === _id) {
        res.render('board/edit.html', { posting: result[0] });
      } else {
        res.send(
          alertMove(
            `/board/view?index=${result[0]._id}`,
            '본인이 작성한 글만 수정할 수 있습니다.'
          )
        );
      }
    }
  });
};

exports.editPostMid = (req, res) => {
  let { _id } = req.body;
  _id = Number(_id);
  const { subject, content } = req.body;

  const query = `UPDATE board
                   SET subject="${subject}",
                       content="${content}"
                   WHERE _id=${_id}`;

  db.query(query, (error, result) => {
    if (error) return console.log(error);

    if (result) {
      res.send(alertMove(`/board/view?index=${_id}`, '글이 수정 되었습니다.'));
    }
  });
};

 

post 부분은 딱히 특별한게 없지만

get 부분은 조금 신경을 썼다.

현재 로그인이 되어있는 사용자와,

글을 작성한 사용자가 일치하지않는다면, 글수정 버튼을 눌렀을때,

view 페이지로 돌아가고, 본인이 작성한 글만 수정할 수 있다는 경고를 띄워준다.

 

 

4-4. board delete

  let { index } = req.query;
  index = Number(index);

  const query = `SELECT _id ,author FROM board WHERE _id = ${index}`;

  db.query(query, (error, result) => {
    if (error) return console.log(error);

    if (result) {
      const { _id } = req.session.user;
      if (result[0].author !== _id) {
        res.send(
          alertMove(
            `/board/view?index=${result[0]._id}`,
            '본인이 작성한 글만 삭제할 수 있습니다.'
          )
        );
      } else {
        const query = `DELETE FROM board WHERE _id = ${index}`;
        db.query(query, (error, result) => {
          if (error) return console.log(error);
          res.send(alertMove('/board/list', '글이 삭제 되었습니다.'));
        });
      }
    }
  });​

 

음 뭔가 딜리트가 제일 쉬웠는데,

이번엔 제일 어려운것처럼 느껴졌다.

 

작성된 글의 작성자와, 로그인된 사용자와 일치하는지 확인을 먼저 하고,

일치하면 지우는 건데,

쿼리문을 두번날려야 해서 좀 어렵게 느껴 졌다.

 

4-5. 로그인 게시판 접속 막기.

이걸 먼저 해버리면 기능개발할 때 좀 걸거쳐서

맨마지막에 하게됐다.

 

이렇게 해줌 ㅎ

5. 후기

재밋다.. 진짜로..

로그인이랑 게시판이랑 붙이니까 이게 진짜 재밌음

글을 쓸때 자동으로 로그인된 사용자의 name을 입력되게 한다거나,

직접쓴 글만 수정 삭제 할 수있게 한다거나 하는 부분은 진짜 꿀잼이었다.

코딩할맛 난다..!

728x90
728x90

댓글