개발일지

개발일지 33일차

index.ys 2023. 4. 18. 03:09

Node.js 개인과제 에러 핸들링 및 배포

에러 핸들링

- 개인과제 마지막 부분인 각 항목별 에러 핸들링 코드를 작성하였다. api명세는 총 9개의 기능에 8개의 에러 핸들링 코드 작성했지만 거의 똑같은 코드여서 에러 처리할 부분이 제일 많은 delete메서드를 중점적으로 에러처리를 고민했다.

에러 처리는 try catch 문을 사용하여 처리 하였으며 아직 try catch에 대해 간단한 동작 방식만 이해하고 다른 어떤방식으로 에러를 처리하는지 구체적인 부분은 이해하지 못해서 조건문으로 작성하였다.

  //에러처리
    try {
        let post = await Posts.findOne({ _id: _postId })
        //# 400 body 또는 params를 입력받지 못한 경우
        if (!password || null) {
            res.status(400).json({ message: '데이터 형식이 올바르지 않습니다.' })
        }
        //# 400 비밀번호가 일치하지 않는 경우
        else if (Number(password) !== post.password) {
            res.status(400).json({ message: '비밀 번호가 일치하지 않습니다.' })
        }
        else if (Number(password) === post.password) {
            await Posts.deleteOne({ _id: _postId })
            res.status(200).json({ "message": "게시글을 삭제하였습니다." })
        }
    } catch (err) {
        // # 404 _postId에 해당하는 게시글이 존재하지 않을 경우
        if (_postId.length) {
            res.status(404).json({ message: '게시글 조회에 실패하였습니다.' })
        }
    }

첫번째 조건문

- 첫번째 조건문에서는 password의 값이 없거나 사용자가 아무것도 입력하지 않았을때 false반환하여 400에러를 출력하는 조건문을 작성하였다. not연산잔의 사용법을 어떻게 하는지 조금 긴가민가 했었는데 이번에 어떤상황일때 사용해야 하는지 조금 알게된 것 같다.

  if (!password || null) {
            res.status(400).json({ message: '데이터 형식이 올바르지 않습니다.' })
        }

두번째 조건문

- 두번째 조건문에서는 입력된 비밀번호의 값이 db에 저장된 값과 일치하지 않을때 400에러를 반환하는 조건문을 사용하였다 이때 입력된 password 값은 string타입으로 입력된다고 가정했고, 스키마의 설정에서 password 속성에 number 타입을 부여 했기때문에 타입까지 일치하는것을 비교하기 위해 입력된 password를 Number변환한뒤 값을 비교했다.

        //# 400 비밀번호가 일치하지 않는 경우
        else if (Number(password) !== post.password) {
            res.status(400).json({ message: '비밀 번호가 일치하지 않습니다.' })
        }

세번째 조건문

- 세번째 조건문에서는 입력된 password값과 db에 저장된 password 값이 일치할때 db에서 값을 삭제하는 코드를 작성하였다. 값이 삭제 됐을때는 status200을 반환하고 조건문을 종료한다

  else if (Number(password) === post.password) {
            await Posts.deleteOne({ _id: _postId })
            res.status(200).json({ "message": "게시글을 삭제하였습니다." })
        }

catch

- catch절 에서는 파라미터로 입력된 _postId 값이 존재하지 않을떄 404에러를 반환하는 식을 작성하였다.

catch (err) {
        // # 404 _postId에 해당하는 게시글이 존재하지 않을 경우
        if (_postId.length) {
            res.status(404).json({ message: '게시글 조회에 실패하였습니다.' })
        }
    }

조건문 흐름정리

데이터가 입력됐는지 확인 -> 데이터가 입력됐을때 db에 저장된 값과 입력값은지 확인 -> db에 저장된 값이 같을때 -> db에있는 데이터 삭제

에러처리 -> 입력된 parameter가 일치하는 값이 없을때 404에러반환

API명세 정리

- 아직 api 명세가 한눈에 들어오지 않아 나만의 방법으로 노트에 정리하고 코드작성 순서를 최대한 간결하고 순차적이게 만들기 위해 노트에 정리를 하였다. 시작이 조금 느렸고, 노트에 정리하는 방법이 좋은 방법인지는 모르겠으나, 원초적인 방법은 항상 맞다고 할 수는 없지만 틀린 경우는 거의 없다고 생각한다. 그래서 앞으로도 코드를 작성하기전에 노트에 먼저 정리하고 작성하는 방식을 쓰게 될 것 같다.

기타 오류

- post나 put요청시 요청이 반환되지 않고 무한로딩이 된다면 url 요청경로를 다시 한번확인해보기 404에러일 확률이 높다

느낀점

- 개인과제를 허겁지겁 마무리하고 aws ec2로 배포까지 완료했다. 조금 더 빨리 끝낼 수 있었을 거 같은데 조가 편성된 후에 과제를 제출해서 조금 아쉬웠다. 배포가 조금 늦어진 이유는 배포할때 내 로컬에 저장된 db의 값과 aws에 저장된 db의값이 다르다는걸 알았다. 처음에 배포하고 ip주소를 들어갔을때 데이터가 입력되어 있지 않아서 내가 코드를 잘못 작성한 줄 알았지만 그게아니라 aws db에 저장된 값이 없어서 데이터를 불러오질 않았던 것이다 그래서 thunder client로 내가 배포한 ip주소에 데이터를 입력하고 get요청을 데이터를 조회해보니 데이터가 입력 잘 됐다. 로컬db과 원격db개념을 조금더 확실하기 짚고 가야겠다는 생각이들었다.이번 개인과제를 진행하면서 node.js에 대해 전체적으로 조금이나마 이해가 된것 같아서 다행이라는 생각이 들었다. 하지만 그만큼 좀 더 공부해야 겠다는 생각도 동시에 들었다. 구조분해할당이나 try catch같은 에러처리도 어떻게 해야할지 조금더 고민하고, 들어온 데이터의 값인지 객체인지 배열인지 판별하고 어떤 메서드나 함수로 조작하여 클라이언트에 전송할지도 많이 고민해보고 많이 작성해봐야겠다는 생각이들었다.