node.js에 대해서 배운 것을 기반으로
블로그 글 작성, 게시글에 대한 댓글 작성 api를 만드는 과제를 했다.
과제 중에 정말 좌충우돌 여기저기서 오류가 터졌는데 너무 어이없는 실수도 존재했고
예외처리를 해주는 부분이 너무 난해했다.
작업 개요는 다음과 같다.
post(게시글) 부분과 comment(댓글) 부분을 나누었고
각 스키마에 들어갈 구조를 정리했다.
여기서 comments의 postId는 posts의 postId값을
그대로 받아오며
각 comment들이 어느 게시글에 속했는지 판단하는 지표이다.
해당 내용을 바탕으로 schemas를 작성하고 router를 작성했다.
작업 중에 일어났던 오류 몇 가지만 적어보자면 이러하다.
(재발 방지, 나중엔 미리 확인하자.)
Thunder Client로 api테스트를 해본 결과 자꾸 password부분에서 오류가 발생했다.
처음에는 혹시 password라는 단어 자체가 사용이 불가능 한건지, 해당 네임을 pswd 등으로 바꾸어보니 작동이 되어서 의아했었는데
결과만 말하면 스키마에 passward라고 오타가 나있었다...
지금까지 한 파일 내에서만 작업을 해왔고 모듈을 사용한 게 처음이라(한 파일내에서 다른 이름을 적을 경우 VSCode에서 표시를 해준다.. 참조가 안되었다고) 사소한 오타로 시간을 엄청 잡아 먹었다.
위의 data 저장 형식을 보면 postId값이 posts와 comments 모두에 존재한다. id값은 고유해야하기 때문에 schemas에서 unique: true로 지정을 해줬었는데, post와 comment를 각기 따로 불러올 때는 문제가 없었으나
게시글하나의 id를 지정해서 GET요청을 보내면 게시글의 상세 정보 api를 표현해주었고, 그 상세 정보에는 해당 게시글에 달린 댓글 정보도 모두 표기를 해주려고 했다.
댓글이 하나일 경우에는 오류가 발생하지 않았으나 댓글이 2개 이상이 될 경우 오류가 발생했다.
comments에서 하나의 게시글에 여러 댓글이 달리는 상황이면 postId값이 겹치겠구나 하는 생각이 들어서 comments 부분에서는 unique 값을 false로 지정해주었는데 그래도 저장이 안되었다...
한참 원인을 찾아 검색을 하다보니 schemas에서 특정 값을 변경을 하더라도 이미 DB에 저장되어진 값의 내용까지 변경이 되지는 않기 때문에 해당 부분을 찾아서 삭제해주어야 제대로 적용된다는 글을 발견했고 DB에 넣어뒀던 테스트 정보들을 삭제하자 정상적으로 작동하였다.
그리고 postId값의 unique가 false로 되어서 겹칠 가능성도 존재하기 때문에(해당 id 부여를 시간 Math.random()을 통해서 최대한 난수화를 해보긴 했지만 혹시나 모를 가능성 때문에)
따로 게시글 저장 시에 postId값이 이미 DB에 있을 경우,
요청을 반환하고 다시 시도해달라는 에러 메세지를 보내도록 따로 예외처리를 해주었다.
데이터 구조를 짤 때, 간략하게 들어갈 내용만 정리를 했었는데, 해당 데이터들의 관계 등을 고려해서 속성을 정해주는 작업도 필요함을 느꼈다.
해당 과제를 진행하면서 aws를 통해서 서버를 ec2로 돌리는 작업도 같이 했다. ec2를 대여하고 ubuntu에 node, mongoDB 등을 저장하는데 git clone을 통해서 내 프로젝트를 실행하였으나 자꾸 mongoDB 연결 오류가 발생하였다.
강의를 따라할 때는 작동을 잘 했었어서 문제가 없다고 판단하였으나, 개인 작업 중에 연결 오류가 발생하였고 내 로컬 환경에서 schemas의 index.js의 .connect부분의 주소가 원래 "mongodb://localhost:27017/node_blog"가 기본 값이지만
연결을 시도할 경우 연결이 되지 않았고 해결하기 위해 "mongodb://127.0.0.1:27017/node_blog"로 수정해서 사용중이었다.
ubuntu 환경에서 해당 부분이 자꾸 에러 메세지로 찍혀서 127.0.0.1 부분이 문제가 발생하는 건가 싶어서 vi편집기로 localhost로 변경도 해보았으나 여전히 작동하지 않았다.
오류 메세지를 검색해보기도 했는데 명확한 답변이 나오질 않아서 결국 mongoDB를 재설치 해보았는데, 그러니까 정상적으로 연결되었다...
오류를.. 해결할 방법을 찾는게 맞지만 어떤 경우에는 재설치가 답인 경우도 있는가보다...
이런 저런 오류사항들이 많았는데 해결이 된 과정을 생각해보면, 뭔가 오류를 해결하면서 지식이 늘어나는 해결 과정이 아니라 단순히 시간만 쓴 것 같아 좀 아쉬웠다.
그래도 앞으로는 이런 경우도 있다는걸 알았으니, 다음 프로젝트에는 좀 더 원활한 작업이 가능하지 않을까 생각해본다.
그래도 배포까지 잘 끝마쳤고 과제는 정상적으로 작동한다!!
여담으로 예외처리라는 것에 대해서 다시 한 번 생각해보게 되었다.
그간 했던 작업들은 LiveServer에서 실행을 했었고, 오류 사항이 발생할 경우 그냥 해당 기능이 작동을 안 할 뿐 큰 영향은 없었다.(작동이 안하는 것도 큰 영향이긴 하다.)
그런데 node를 통해서 작업을 해보니 특정 값이 없어서 오류가 발생하거나 여타 예상치 못한 상황이 발생하여 에러가 생겼을 경우, 예외처리가 되어있지 않을 경우 에러메세지와 함께 서버가 바로 종료되어버리는걸 확인했다.
만약에 실제 서비스를 하는 서버였다면 어떠한 에러로 인해서 서버가 다운되어버린 진짜.. 끔찍한 상황이었던 것이다.
단순히 body에서 기입해야할 값이 비어있어서 에러가 나면서 꺼지기도 했고, 존재하지 않는 경로로 잘못 접근해서 그런 상황이 벌어지는 경우도 있었다.
하여 예외처리의 중요성을 크게 느낀 것 같다.
값이 비었을 때, 존재하지 않는 경로(이미 삭제되어버렸다거나, 오타가 났다거나)로 접근했을 때, 등등 테스트 작업을 하면서 발생했던 예외 사항들에 대해서 예외처리를 열심히 해주었다.