Wecode -Foundation 2 (부트캠프)/회원가입, 로그인 API

Foundation 2 과제 - sns posting 게시물 CRUD [포스팅 생성, 조회, update, 삭제] **

Queen Julia 2023. 9. 10. 14:16

 

 

CRUD, layered pattern 연습 , postman으로 통신 코드 확인

회원가입 유저 생성 = 게시글 생성 (app.post) insert into --> 새로운 row 추가 [INSERT INTO] 로그인 유저 불러오는 거 = 게시글 리스트 읽는 거 read (app.get)--> 데이터 조회 [SELECT FROM} 게시글 update = 유저 정보

pm-developer-justdoit.tistory.com


westagram을 만들 건데 

백엔드는 기능만 만드는 것. 

 

 

[백엔드가 넣을 기능들]

Express를 이용한 API 서버 만들기

- Express초기 환경세팅 (이미 했고)

 

[Westagram Backend Project] 1. Express 초기 환경 설정/ TypeORM 설치 적용 (주황색)

-Westagram Backend Project - 1. Express 초기 환경 설정 Express 설치 / 적용 nodemon 설치 / 적용 cors 설치 / 적용 dotenv 설치 / 환경 변수 적용 morgan 설치 / 적용 https://www.notion.so/wecode/Node-Express-da9ab2a0a3a64f75aedb1723

pm-developer-justdoit.tistory.com

 

[Express 초기 환경세팅] 2. database 연결- dbConnection 설정

-Westagram Backend Project - TypeORM 설치 및 적용 dbConnection 정상 작동 확인 아래 링크에서 진행했던 TypeORM 설치에서 이어져서, [Express 초기 환경세팅/ TypeORM 설치] **(주황색) -Westagram Backend Project - 1. Express

pm-developer-justdoit.tistory.com


- 회원가입/로그인 (이미했고)

회원가입

 

[Westagram Backend Project] 3. mysql Database로 유저 회원가입 하기 (주황색)

-Westagram Backend Project - 여기에서 body가 없는거고, 배열 안에 있는 건 더미 데이터 [Node.js] Express, postman 활용 - 유저 생성, 추가 (회원가입) 이거를 배열로 추가하는게 아니라, Express로 server 연결하는

pm-developer-justdoit.tistory.com

회원가입, 로그인 전체 코드 

 

[Westagram Backend Project] 3. mysql Database로 유저 회원가입 하기 (주황색)

-Westagram Backend Project - 여기에서 body가 없는거고, 배열 안에 있는 건 더미 데이터 [Node.js] Express, postman 활용 - 유저 생성, 추가 (회원가입) 이거를 배열로 추가하는게 아니라, Express로 server 연결하는

pm-developer-justdoit.tistory.com


만약 아래 예시로 코딩 안 되면, 참고 (코딩 실행 된 사례 )

 

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

0. 목차 1. 개요 2. DB 3. 파일 쪼개기 4. CRUD 기능개발 5. 후기 1. 개요 2022.02.11 - [경일/nodejs] - [node.js] express-session, mySQL 로그인 기능 구현 [node.js] express-session, mySQL 로그인 기능 구현 0. 목차 1. 개요 2. m

kong-dev.tistory.com


게시물 Crud 가 회원가입 로그인과 같다

회원가입 유저 생성 = 게시글 생성 (app.post) insert into  --> 새로운 row 추가 [INSERT INTO]

로그인 유저 불러오는 거 = 게시글 리스트 읽는 거 read  (app.get)--> 데이터 조회 [SELECT FROM}

게시글 update =  유저 정보 update ( 명령어는 같고, 데이터베이스 이름과 키 값만 달라짐) [UPDATE SET]

게시글 delete = 유저 삭제와 같다 [DELETE FROM] 

 

 

 

프론트에게 통신, 연결할 때 배우는 거 

1) url

2) body의 req 를 보낼 때

 

rest api의 path, query parameter는 

url로 프론트에게 주려고 할 때 --> product/1 이런 식으로 보내줘야 

 

 

<장바구니>

결제 후 삭제도 해야 하고 

 

<결제>

쿠키개념을 모르기에, 결제 수단을 안 하고,


예시 [1]

app.post( "/createPosting", async (req,res)=>{

try{       

//1. 유저 정보를 프론트에게 받는다 

const newPostData= req.body;

// console.log(newPostData);

const title = newPostData.title;

const content = newPostData.content;

const user_id = newPostData.user_id;

 

//2. 데이터베이스로 정보 저장 

const userData = await myDataSource.query(
`INSERT INTO posts (title, content, user_id)

VALUES ("${title}", "${content}", "${user_id}");`
    );
return res.status(201).json({ message: "postCreated" });
} catch (err) {console.log(err);}
}; 

// 찍어내면, {"title":"'복습 중이다'", "content":"갈길이 머네.", "user_id": 6}

 

[예시2]

const createPost = async (req, res) => {
  try {
    const body = req.body;
    const { user_id, post_image_url } = body;

 

// key 안 줬을때 
    const isInputNotExist = !user_id || !post_image_url;
    throwError(isInputNotExist, 400, "KEY_ERROR");
// 데이터 저장 
    const columnsQueryText = createColumnsQueryText(body);
    const valuesQueryText = createValuesQueryText(body);


    await appDataSource.query(
      `INSERT INTO posts  (${columnsQueryText})
        VALUES ('${valuesQueryText}')`
    );
    return res.status(201).json({ message: "postCreated" });
  } catch (error) {
    console.log(error);
    if (error.errno === 1452) {
      return res.status(400).json({ message: "INVALID_USER_ID" });
    }
    if (error.errno === 1054) {
      return res.status(400).json({ message: "KEY_ERROR" });
    }
    return res.status(error.status).json({ message: error.message });
  }
};


- 게시글을 불러오는거 (전체 게시글 조회) 

혼자 해보기;

 

 

 

 

 


 

예시1.

const showPosts = async (req, res) => {
try {
    const postsData = await myDataSource.query(
    "SELECT posts.user_id, users.profile_image AS userProfileImage, posts.id AS postingId, posts.content AS postingContent FROM posts JOIN users ON posts.user_id = users.id;"
    );
    console.log(postsData);
    return res.status(200).json({ Data: postsData });
} catch (err) {console.log(err);
}
};

 

예시2.

const getPosts = async (req, res) => {
  try {
    const result = await appDataSource.query(
      `SELECT
        posts.user_id AS userId,
        users.profile_image AS userProfileImage,
        posts.id AS postingId,
        posts.post_image_url AS postingImageURL,
        posts.content AS postingContent
        FROM posts
        JOIN users ON posts.user_id = users.id`
    );
    return res.status(200).json({ data: result });
  } catch (error) {console.log(error);
    return res.status(error.status).json({ message: error.message });
  }
};


- 게시글 불러오기 (유저의 게시글 조회)

혼자 해보기;

 


예시1.

const searchPostsByUserId = async (req, res) => {
try {
    const userId = req.params.user_id;
    // console.log("유저아이디가 뭡니까?" + userId);
    const userPosts = await myDataSource.query(
    `SELECT * FROM posts WHERE posts.user_id = ${userId}`
    );
    return res.status(200).json({ Data: { userPosts } });
} catch (err) {
    console.log(err);
}
};

 

예시 2.

const getUserPosts = async (req, res) => {
  try {
    const userId = req.params.user_id;
    throwError(!userId, 400, "KEY_ERROR");

    const user = await appDataSource.query(
      `SELECT
        users.id AS userId,
        users.profile_image AS userProfileImage
        FROM users
        WHERE users.id = ${userId};`
    );
    const result = user[0];
    const userNotFound = !result;
    throwError(userNotFound, 404, "USER_NOT_FOUND");

 

//+ 유저의 post여야 하니까 
    const posts = await appDataSource.query(    
      `SELECT
        posts.id AS postingId,
        posts.post_image_url AS postingImageURL,
        posts.content AS postingContent
        FROM posts
        WHERE posts.user_id = ${userId};`
    );
    result["postings"] = posts;
    return res.status(200).json({ data: result });
  } catch (error) {
    console.log(error);
    return res.status(error.status).json({ message: error.message });
  }
};


- 게시글 수정

혼자 해보기;

// update
app.put("/users/1", async (req, res) => {
try {
const newName = req.body.data.name;
} catch (err) {
console.log(err);
}
});

 

 

 


예시1.

const updatePost = async (req, res) => {
try {
    const postId = req.params.post_id;
    const content_string = req.body.content;
    console.log(postId);
    console.log();
    console.log(content_string);
    const updatePost = await myDataSource.query(
    `UPDATE posts SET content = ${content_string} WHERE posts.id = ${postId}`
    );
    console.log(postId);
    return res.status(200).json({ updatePost });
} catch (err) {
    console.log(err);
}
};

 

예시2.

const updatePost = async (req, res) => {
  try {
    const post_id = req.params.post_id;
    const body = req.body;
    const oldPost = await appDataSource.query(
      `SELECT * 
        FROM posts 
        WHERE posts.id = ${post_id};`
    );

    throwError(oldPost[0].user_id !== body.user_id, 401, "UNAUTHORIZED");

    await appDataSource.query(
      `UPDATE posts
        SET content = '${body.content}',
        post_image_url = '${body.post_image_url}'
        WHERE posts.id = ${post_id};`
    );

 

// 사용자 id, 이름, 포스트 이미지, 내용 select로 가져와서/ 유저의 post에 join / 근데 해당 post를 수정하니-> post.id 조건

const result = await appDataSource.query(
      `SELECT
        users.id AS userId,
        users.name AS userName,
        posts.id AS postingId,
        posts.post_image_url AS postingImageURL,
        posts.content AS postingContent
        FROM users
        JOIN posts ON posts.user_id = users.id
        WHERE posts.id = ${post_id};`
    );

    return res.status(200).json({ data: result });
  } catch (error) {
    console.log(error);
    return res.status(error.status).json({ message: error.message });
  }
};


- 게시글 삭제

혼자 해보기;

app.delete("/users", async (req, res) => {
try {
//query문
} catch (err) {
console.log(err);
}
});

 

원하는 하나의 게시글을 삭제하려면,

- 데이터베이스에 저장된, 해당 게시글을 가져오기 (post_id 일치하는)

 

 


예시1.

const delPosts = async (req, res) => {
try {
    const postId = req.params.post_id;
    const deletePost = await myDataSource.query(
    `DELETE FROM posts WHERE id = ${postId}`
    );
    return res.status(204).json({ message: "postingDeleted" });
} catch (err) {
    console.log(err);
}
};

 

예시2.

const deletePost = async (req, res) => {
  try {
    const postId = req.params.post_id;

    throwError(!postId, 400, "KEY_ERROR");

 

//해당 post의 id인 모든 걸 다 가져와라 
    const existingPost = await appDataSource.query(`
        SELECT * FROM posts WHERE id = ${postId};
      `);
    throwError(existingPost.length === 0, 400, "POST_NOT_FOUND");

 

//좋아요 삭제 
    await appDataSource.query(
      `DELETE FROM likes
        WHERE post_id = ${postId}`
    );

 

// 댓글 삭제
    await appDataSource.query(
      `DELETE FROM comments
        WHERE post_id = ${postId}`
    );

 

이 분은 왜 이렇게 각각 삭제했을까?

// posts 삭제
    await appDataSource.query(
      `DELETE FROM posts
        WHERE posts.id = ${postId};`
    );

    return res.status(200).json({ message: "postingDeleted" });
  } catch (error) {
    console.log(error);
  }
};


- 다른 사람 게시글 좋아요 눌러보기 (좋아요 누르기)

 

혼자 해보기;


예시1.

const likePost = async (req, res) => {
try {
    const userId = req.params.user_id;
    console.log(userId);
    const postId = req.body.postId;
    console.log(postId);
    const likePost = await myDataSource.query(
    `INSERT INTO likes (user_id, post_id) VALUES ("${userId}", "${postId}")`
    );
    return res.status(204).json({ message: "likeCreated" });
} catch (err) {
    console.log(err);
}
};

 

예시 2. 

const createLike = async (req, res) => {
  try {
    const postId = req.body.post_id;
    const userId = req.body.user_id;
    const duplicateLike = await appDataSource.query(
      `SELECT * FROM likes
        WHERE user_id = ${userId} AND post_id = ${postId};`
    );

    throwError(duplicateLike.length > 0, 400, "DUPLICATE_LIKES_REQUESTED");

    await appDataSource.query(
      `INSERT INTO likes
        (user_id, post_id)
        VALUES
        ('${userId}', '${postId}');`
    );

    return res.status(200).json({ message: "likeCreated" });
  } catch (error) {
    console.log(error);
    return res.status(error.status).json({ message: error.message });
  }
};


 

좋아요 삭제 

 

혼자해보기;

 

 


예시2.

const deleteLike = async (req, res) => {
  try {
    const postId = req.body.post_id;
    const userId = req.body.user_id;
    const duplicateLike = await appDataSource.query(
      `SELECT * FROM likes
        WHERE user_id = ${userId} AND post_id = ${postId};`
    );

    throwError(duplicateLike.length === 0, 400, "LIKES_NOT_FOUND");

    await appDataSource.query(
      `DELETE FROM likes
        WHERE likes.id = ${duplicateLike[0].id};`
    );
    return res.status(200).json({ message: "likeDeleted" });
  } catch (error) {
    console.log(error);
    return res.status(error.status).json({ message: error.message });
  }
};


project 통해서 채워나갈 부분. 

 

Project 1 - 월요일 + 추후 시작 전 예습 할 것 + 참고할 거 **

프로젝트 관련 Project 1 - [백엔드] 업무 이해 프로젝트 목표 Threads의 회원가입 기능, 로그인 기능, 게시글 기능을 파악하고 개발합니다. 프론트엔드는 위 기능들을 구현하기 위해, 회원가입 페이

pm-developer-justdoit.tistory.com