Node.js 강의가 시작한지 약 3일 만에 강의 내용을 실제로 실습해보는 과제가 주어졌다.
mongoDB Atlas를 활용하여 CRUD API를 작성하고 AWS EC2로 배포까지 해보는 것 !
해당 과제를 하면서 어려웠던 점과 해결했던 부분을 정리하고자 한다.
#구현하고자 하는 것
- HTTP method를 사용하여 CRUD API 작성하기
** CRUD?
- Create : 생성(POST)
- Read : 조회(GET)
- Update : 수정(PUT), (PATCH)
- Delete : 삭제(DELETE)
대부분의 서비스 특히나 커뮤니티 기반의 서비스라면 가장 기본적인 기능이라고 할 수 있다.
#1. punycode warning

1) 배경
mongoDB를 사용하기 위해서 mongoose라는 도구를 설치 후 해당 문구가 나타나기 시작함 !
* mongoDB : 국내 많은 개발자들이 사용하고 있는 비관계형 데이터베이스(NoSQL) 중 하나로 이번 프로젝트에서도 사용하여 데이터를 저장하고 불러온다.
* mongoose : 내 코드 API와 mongoDB를 연결할 때 사용하며, 데이터의 구조와 저장하는 데이터 유형을 정의하는 스키마를 설정할 때도 사용한다. (모델링)
2) 원인
문구를 그대로 해석해보자면 punycode 라는 모듈을 더 이상 지원하지 않는다는 내용인데, mongoose 내에 punycode 모듈이 포함되어 있어 설치 시 자동으로 함께 설치된다.
다만, 최신버전인 현재 Node.js(21.1.0)에서는 punycode 모듈을 지원하지 않기 때문에 나오는 문구였다.
*punycode : 웹 주소 또는 도메인 이름과 같이 ASCII 문자만 허용되는 상황에서 유니코드 문자를 표현하는 데 사용된다고 한다.
(예를 들면 아시아 국가의 언어로 도메인이 설정되어있을 때 약속된 문자로 변경해주는 코드라고 한다.)
3) 해결
튜터님께 확인 결과 해당 문구는 오류가 아니기 때문에 해결이 딱히 필요는 없다고 했다.
추가적으로 관련된 내용은 현업에서도 자주 발생하는 일인데, 각 라이브러리나 도구들이 노드 버전과 맞지 않을 때 발생한다고 한다.
관련해서 현업에서도 어떠한 도구, 라이브러리를 활용하여 코딩할 때 노드 버전과 각 도구, 라이브러리의 버전을 기록하여 공유하고
요구되는 최소버전을 명시하는게 좋다고 했다. (각 사람마다 버전이 다르면 어떤 문제가 발생할수도 있으니 !)
#2. 수정(UPDATE) / 삭제(DELETE) 시 무한 Processing

1) 배경
수정과 삭제 기능을 테스트하고자 Thunder Client라는 API Client를 수행하던 중 확인되었다.
2) 원인
수정과 삭제 시에 기존 데이터의 password값과 입력된 password값이 같아야 작동하게끔 구현했는데 그쪽에서 문제가 있었나 싶었으나
mongoDB Atlas 에서는 실제로 데이터가 잘 수정되고, 삭제되는 것이 확인되었다 ! => 비밀번호 문제는 아님
확인 결과.. 수정과 삭제가 작동 후 response 값을 주지 않았다.. (초보니깐 초보적인 실수 ..ㅎ;)
3) 해결


상품 수정과 삭제가 된 이후에 response값을 지정해주니 바로 해결되었다 !
해당 문제를 해결하면서 이분 저분께 문의를 드리다가 에러 핸들링을 위해 try...catch문을 사용하는게 좋다고 하셨다.
(이전에는 상품 수정과 삭제 부분에 try...catch 문 사용을 안했었다. 물론, 이 경우 에러가 발생한 것이 아니라 response값이 없었기 때문에 try...catch를 사용해도 에러가 나오지는 않았다.)
#3. 데이터 모델링 시 productId값 자동으로 생성
1) 배경
(1) 특정 상품의 디테일을 요청할 때 별도의 id값을 지정하여 요청하는게 필요하다고 생각 (각 상품별 고유의 id값 필요)
(2) 유저들이 상품을 등록할 때 id값을 수동으로 넣으면 이상할 것이라고 판단 (자동으로 할당)
(3) mongoDB에 저장 시 자동으로 '_id' 키로 파라미터가 생성되지만 내가 테스트 해볼 때는 불편함
(654773671fc935c5025ba18c 이런식으로 표현되기 때문에..)
2) 생각한 해결방안
상품이 등록될 때(CREATE) 0부터 누적으로 productId값 생성하여 할당
3) 진행 내용
(1) schema에 productId 추가

(2) id값 자동으로 할당하는 메서드 추가

pre와 next라는 메서드가 보이는데 'save'가 되기 전에 해당 함수를 실행하는 구문이라고 한다.
새롭게 생기는 데이터에 productId가 없으면 실행되는 함수다.
1. 기존에 있던 데이터(productModel)를 내림차순(sort... -1)으로 정렬 후 findOne함수를 이용해 가장 최신 데이터를 찾는다.
2. 가장 최신 데이터가 있으면 그 데이터 id 값에 +1을 하고, 없으면 0에 +1을 한다. (삼항연산자)
3. 이후 다음 프로세스를 진행한다. (next)
(3) Thunder Client를 통해 확인

#4. mongoDB와 AWS EC2 연결이 안되는 문제
1) 배경
과제 마지막 단계로는 EC2에 배포까지 하는 것이었다.
따라서 리눅스에서 Node.js를 설치하고 EC2에 연결하는 과정에서 mongoDB Atlas와 연결이 되지 않는 문제가 발생하였다.
2) 원인 및 해결
(1) .env 파일

기존 로컬에서 관리하던 .env 파일을 깃헙에 올리면서 .gitignore로 빼면서 리눅스에서 깃 클론을 진행해도 .env파일을 가져올 순 없었다.
따라서 리눅스 환경에서 별도로 .env 파일을 생성하고 로컬 환경에서 작성한 .env파일과 동일한 내용을 기재하였다.
(2) mongoDB Atlas Network Access
mongoDB Atlas 에 접근하기 위해서는 아틀라스 내에서 접근이 가능한 IP주소를 설정해줘야 했다.
따라서 EC2에서 배정받은 IP주소를 아틀라스 내에서 추가해주었다.
mongoDB Atlas 내 왼쪽 메뉴 바 'Network Access'
우측 'ADD IP ADDRESS' 버튼 클릭하여 Access List Entry 에 EC2 IP 삽입 후 Confirm
(3) EC2 인스턴스 문제
사실 나는 위 두가지 방법을 모두 진행했음에도 연결이 되지 않았는데
정확한 원인은 모르지만 EC2 설정 시 뭔가 꼬인거 같다는 생각이라고 다른 분이 말씀해주셔서 EC2 인스턴스를 다시 생성하여 연결을 시도했다.
그랬더니 아주 허무하게 연결이 되었다...ㅠ
(혹시나 나와 동일한 문제가 있는 분은 다시 인스턴스를 생성해보심도..ㅎ)
코드를 구현함에 있어서 사소한 문제는 많았지만 가장 많은 스트레스를 준 사항들 위주로 정리하였다.
그래도 꽤나 재밌는 과제로 기억되고 많은 학습을 하게해준 기회였다.
'프로젝트 진행기' 카테고리의 다른 글
| 끝판왕의 프로젝트_Node.js CRUD 실습(4)_미들웨어 구축 (0) | 2023.11.17 |
|---|---|
| 끝판왕의 프로젝트_Node.js CRUD 실습(3)_로그인 (0) | 2023.11.16 |
| 끝판왕의 프로젝트_Node.js CRUD 실습(2)_회원가입 (1) | 2023.11.15 |
| 끝판왕의 프로젝트_영화 검색 사이트 만들기(심화) (0) | 2023.10.27 |
| 끝판왕의 프로젝트_영화 검색 사이트 만들기 (0) | 2023.10.20 |