프로젝트에서 쓰일 간단한 서버를 구축하기위해 Node.js 에 mongoDB를 연결 해보겠습니다.
1. 터미널에서 npm init 입력
프로젝트를 초기화하는 명령어이며 package.json을 생성해줍니다
2. 서버구축에 필요한 모듈을 설치
- nodemon - 파일을 수정 후 저장만으로 서버를 자동으로 재실행
- express - 서버를 구축
- dotenv - 환경 변수 관리
- express-session - 세션 관리
- cors - 서로 다른 출처 간의 HTTP 요청을 허용하거나 제어
express-session은 세션을 관리하는 미들웨어입니다. 세션을 통해 서버는 사용자의 상태를 유지하고, 사용자가 로그인 상태를 유지하는 등 다양한 사용자 관련 정보를 관리할 수 있습니다.
cors는 Cross-Origin Resource Sharing의 약자로, 서로 다른 출처(도메인, 프로토콜, 포트 등) 간의 HTTP 요청을 허용하거나 제어하는 메커니즘입니다. 기본적으로 웹 브라우저는 보안을 위해 웹 페이지가 다른 출처의 리소스에 접근하는 것을 제한합니다. CORS는 이러한 제한을 완화할 수 있는 방법을 제공합니다.
3. package.json 에서 scripts 수정
다음과 같이 수정하면 npm start를 입력하면 nodemon을 통해 서버가 실행됩니다. (선택사항)
4. server.js 생성
서버를 실행시켜줄 파일인 server.js에 필요한 기본 적인 요소들을 생성해줍니다.
몽고 db의 URI에는 암호가 포함되기 때문에 .env 파일에 저장후 process.env.환경변수명 으로 불러오는걸 권장합니다.
몽고 db에서 생성한 cluster에 원하는 db를 생성하고 URI끝에 db명을 작성하면 해당 db로 접속됩니다
ex) EveloDB에 접속하려할때
MONGO_URI=mongodb+srv://evelo0702:@cluster0.bn8os.mongodb.net/EveloDB
5. 라우터 파일 생성
routes 폴더는 클라이언트가 요청한 URL 경로에 따라 특정한 코드를 실행하는 파일들을 보관하는 폴더입니다. routes 폴더를 사용하면 경로 관리를 체계적으로 분리하여 코드의 가독성과 유지보수성을 높일 수 있습니다.
6. Schema 생성
스키마(Schema)는 데이터베이스에서 데이터의 구조를 정의하는 방법입니다. 스키마는 데이터베이스의 테이블, 컬렉션, 문서, 필드, 데이터 타입 및 제약 조건 등을 설명하며, 데이터의 조직적이고 일관된 저장을 보장합니다.
tests컬렉션에 접속하는 스키마입니다.
MongoDB에서 컬렉션 이름은 Mongoose 모델의 이름에 따라 자동으로 소문자로 변환되고 복수형으로 변경됩니다.
(확실하진 않지만 소문자가아니거나 복수형이 아닌 컬렉션엔 접속이 안되는거같습니다
원래 컬렉션 명이 test였고 model에 test라 적었는데 접속이 안되다가 찾아보니 저런 문제가 있어서 tests로 변경하니 접속이 잘되네요)
localhost:8000/board에 접속하니 db에있는 데이터를 잘 가져오는걸 볼수있습니다
* 참고 * 몽고db 메소드
- find()
용도: 조건에 맞는 모든 문서를 조회합니다.
조건을 작성하지 않으면 모든 문서를 가져옵니다.
예시: db.collection.find({ age: { $gt: 18 } })
설명: age가 18보다 큰 모든 문서를 찾습니다.
- findOne()
용도: 조건에 맞는 첫 번째 문서를 조회합니다.
예시: db.collection.findOne({ name: "Alice" })
설명: name이 "Alice"인 첫 번째 문서를 찾습니다.
- insertOne()
용도: 하나의 문서를 컬렉션에 추가합니다.
예시: db.collection.insertOne({ name: "Bob", age: 30 })
설명: 새로운 문서를 컬렉션에 추가합니다.
- insertMany()
용도: 여러 문서를 컬렉션에 추가합니다.
예시: db.collection.insertMany([{ name: "Charlie" }, { name: "Dave" }])
설명: 여러 문서를 동시에 추가합니다.
- updateOne()
용도: 조건에 맞는 첫 번째 문서를 업데이트합니다.
예시: db.collection.updateOne({ name: "Bob" }, { $set: { age: 31 } })
설명: name이 "Bob"인 문서의 age를 31로 업데이트합니다.
- updateMany()
용도: 조건에 맞는 모든 문서를 업데이트합니다.
예시: db.collection.updateMany({ age: { $lt: 30 } }, { $set: { status: "young" } })
설명: age가 30보다 작은 모든 문서의 status를 "young"으로 설정합니다.
- deleteOne()
용도: 조건에 맞는 첫 번째 문서를 삭제합니다.
예시: db.collection.deleteOne({ name: "Bob" })
설명: name이 "Bob"인 문서를 삭제합니다.
- deleteMany()
용도: 조건에 맞는 모든 문서를 삭제합니다.
예시: db.collection.deleteMany({ age: { $lt: 18 } })
설명: age가 18보다 작은 모든 문서를 삭제합니다.
- aggregate()
용도: 복잡한 데이터 집계 연산을 수행합니다.
예시: db.collection.aggregate([{ match: { age: { $gte: 18 } } }, { $group: { _id: "city", total: { $sum: 1 } } }])
설명: age가 18 이상인 문서들을 도시별로 그룹화하고 총 문서 수를 계산합니다.
- countDocuments()
용도: 조건에 맞는 문서의 수를 계산합니다.
예시: db.collection.countDocuments({ age: { $gte: 18 } })
설명: age가 18 이상인 문서의 수를 반환합니다.