TIL 30일차 - node 숙련주차 개인 프로젝트(2)

박찬웅·2023년 3월 7일
0

항해99

목록 보기
35/105

23년 3월 7일

배운 것

어제에 이어서 숙련 주차 프로젝트를 계속해서 진행하였다. 주로 게시글과 댓글 관련 API를 작성하였다.

시도 한 것

어제까지 회원가입, 로그인 API를 구현 하였고, 추가적으로 게시글 조회, 생성 API까지 만들었다. 이제 게시글 상세 조회, 수정, 삭제 API를 구현 하려고 한다.

여기서 1,2번까지는 어제 구현했던 것이라 오늘부터 3번부터 구현하면 되었다.

사진에는 없었지만 API는 게시글 상세 조회가 있어서 이거 먼저 구현하기 시작하였다. 게시글 상세 조회 API는 입문주차때 엄청 고생했던 파트였다. 하지만 그때는 findOne 개념을 몰라서 쓰지 않고 find문을 써서 복잡하게 구현을 하였다. 이제는 findOne 사용하는 방법을 알았으니 간단하게 findOne문을 사용하면 기존 게시글 전체 조회랑 구현하는데에는 큰 차이는 없었다.

다음은 게시글 수정 API인데 사실 여기서 고생을 좀 했던 곳이였다. 기본적인 구현 자체는 어렵진 않았지만 API 조건에서 나온 에러 조건 처리들이 많아서 그걸 모두 다 구현하는 것이 어려웠다. 이것은 곧 나올 게시글 삭제 API에서도 마찬가지였다. 가장 어려웠던 부분은 로그인 한 닉네임과 그 게시글을 작성한 닉네임이 동일해야만 수정 해야 하는 것에서 상당히 애를 먹었었다. 이걸 에러처리 하지 않으면 남의 게시판도 마음대로 수정이 가능하니 아주 큰일날 상태가 되기 때문이다. 결국 이것저것 시도하면서 답은 얻게 되었다.

		const { postId } = req.params;
        const { title, content } = req.body;
        const user = res.locals.user; // 토큰을 검사하여, 유효한 토큰일 경우에만 게시글 작성 가능
        // console.log(user);        
        const updateData = await Posts.findOne({ _id : postId });

// 로그인한 회원의 닉네임과 해당 게시글 작성한 닉네임이 다른 경우
        if (updateData.nickname !== user.nickname)  {
            res.status(403).json({
                errorMessage: "게시글 수정의 권한이 존재하지 않습니다."
            });
            return;
        }

다음과 같이 정의를 하면 구현을 할 수 있었다. 이 구문은 뒤에 나올 게시글 삭제, 댓글 수정, 댓글 삭제도 저런 방식으로 사용하면 구현 할 수 있다.
가장 핵심은 updateDate에서 postId값 하나를 찾고 그런 다음 현재 로그인한 user의 닉네임을 비교해서 같지 않으면 수정 되지 못하게 구현을 할 수 있다. 이부분에서 오전시간의 대부분을 지나보냈다. chatgpt도 살짝 도움이 되긴 했지만 그래도 스스로 해결 했다는 것에 의의를 두었다.
수정은 다음과 같이 제목, 내용, 수정날짜를 바꿀 수 있게 다음과 같이 구현하였다.

// 수정할 게시글의 제목, 내용, 업데이트 날짜 수정
        await Posts.updateOne(
            {_id: postId},
            {$set: {title: title, content: content, updatedAt: new Date()}}
        )

점심을 먹은 후 게시글 삭제 API도 게시글 수정에서 했던 것처럼 구현 하면 되었다. 삭제는 deleteOne문을 쓰면 되었기에 이전에 적었던 코드랑 비슷하게 적었다. 게시글 수정 API랑 동일하게 해당 회원이 본인 댓글만 삭제 할 수 있게 구현을 해야 했고, 아까 적었던 코드에서 비슷하게 적으면 되었다. 그렇게 어렵지 않게 구현을 마무리 하였다. 딱히 어려웠던 부분은 없었다.

여기까지가 routes 폴더의 posts 파일을 정리하였다. 이제부터는 댓글 API를 구현하기 시작하였다.
먼저 댓글 작성이랑 조회 API 부터 구현하기 시작하였다. 사실 게시글 API만 구현 전부 되었다면 댓글 API 구현은 정말로 쉽다. 게시글 API에서 적었던 코드들을 복붙한 다음에 일부 변수 선언이랑 값만 수정하면 되었기 때문이다. 그래도 가끔씩 오류가 나서 고치는데 시간이 좀 걸리긴 하였다. 그런식으로 1시간만에 댓글 작성, 조회 API는 구현 완료 되었다.

하지만 댓글 수정, 댓글 삭제 API는 상당히 고생을 하였다. 이게 게시글 수정, 삭제 API랑 다르게 2개의 params를 받아야 해서 약간 접근 방식을 다르게 해야 했다. 저번주 입문주차랑은 그냥 1개만 params를 다 받으면 해결 되었던 것에 비하면 다르다. 그리고 오류메시지 나타내는 조건도 상당히 많아서 햇갈렸었다. 수정까지는 그럭저럭 어떻게 에러 메시지 다 표현 되었는데, 댓글 삭제 API에서 예상치 못했던 곳에서 많이 막혔었다. 댓글 삭제 되는것 까지는 문제는 없는데, 삭제된 이후 또 삭제 버튼을 누르면 404 '댓글이 존재하지 않습니다'가 뜨지 않고 예외에서 처리되지 못한 catch 문으로 자꾸 빠지는 것이였다. 이걸 계속 코드를 자꾸 바꿔도 안되서 구글링도 해도 이해가 안되다가 나중에 chatgpt로 물어 보니까 원인은 다음과 같았다.

// 삭제할 게시글 조회
        await Comments.deleteOne(
            {_id: commentId},
        )
        
// 댓글이 존재하지 않는 경우
        if (!deleteData) {
            res.status(404).json({
                errorMessage: "댓글이 존재하지 않습니다."
            });
            return;
        }

if문 작성 위치가 바로 위에 코드가 실행되서 저렇게 삭제 되고 난 후에 저 if문을 써버리면 저 if문은 실행되지 않고 넘어갔었다. 그래서 해결 되지 않은 상태로 catch문으로 빠졌던 것이였다. 해결은 저 둘의 코드를 뒤바뀌면 해결 되었다.

// 댓글이 존재하지 않는 경우
        if (!deleteData) {
            res.status(404).json({
                errorMessage: "댓글이 존재하지 않습니다."
            });
            return;
        }
// 삭제할 게시글 조회
        await Comments.deleteOne(
            {_id: commentId},
        )

다음과 같이 순서를 바꾸면 해결이 되었다. if문 작성할때 위치가 중요하다는 것을 알게 해 줬다.
이거를 초저녁에 해결을 하였고, 마침내 lv2의 개인과제를 2일만에 마무리 할 수 있었다. 그리고 마지막으로 git에다 올려서 커밋 및 푸시를 마무리 하였다.

이 후로 원래 계획에 없던 spring 기술매니저님이 RDBMS 세션 강의를 진행하였다. 원래는 spring 강의 세션이였는데 갑자기 node분들 잠깐 오라고 하길래 들었었다. 어쩌피 node도 배우는 과정이였기에 한번 들어서 토요일에 강의 들었던 RDBMS 개념을 조금 이해하였다. 그 뒤로는 실력이 좋은 수강생들이랑 코드 공유도 하면서 리뷰를 하였다. 확실히 코드 비교를 해보니까 정말로 다 다르게 구현하는구나 라는 느낌도 받았었다. 이렇게 밤이 지나고 TIL를 작성하였다.

해결

숙련주차에 들어오면서 오늘 포함해서 2일만에 항해에서 반드시 구현해야 했던 LV2 과제를 성공적으로 마무리 하였다. 완성한 코드는 내 깃허브에 링크를 올렸으니 보면 된다.
(신)게시글 프로젝트

알게 된 점

입문주차때랑은 다르게 팀원들에게 요청 빈도가 줄었고 스스로 생각해보고 해결 한 부분이 많았었다. 물론 구글링도 중요하겠지만 요즘 뜨고 있는 chatGPT로 도움을 많이 받았고 거기서 해결 한 부분도 많았었다. 앞으로 모르는것 있을 때 chatGPT로 질문해서 구현을 많이 할 것 같다. 그리고 다른사람의 코드 리뷰를 봤는데 확실히 같은 조건으로 구현하는건데 상당히 많은 차이가 났었다.
그리고 세션 강의나 그외 개발 경험이 있던 수강생들의 내용도 들어봤었는데 아직까지 이해 안된 것들이 많이 있어서 일단은 이런것이 있구나 정도만 이해하고 우선 넘어갔다. 그래도 오늘 가장 큰 의의는 LV2 과제를 마무리 했다는 것에 놀라웠고, 이제 API 구현하는데에는 좀 더 적응이 된 것 같았다.

앞으로 할 일

반드시 해야 했던 lv2 과제는 마무리 되었고, 그래도 여전히 숙련주차가 이틀이 남았기 때문에 조금 고민을 해야 하는데 그동안 했던 개념들을 다시 쭉 정리할 지 아니면 mysql와 sequelize 이용해서 구현하는 챌린지 과제인 lv3 과제를 할지는 아직 고민중이긴 하다. 내일 상황 보고 정할 것 같다.

profile
향해 13기 node.js 백앤드

0개의 댓글