| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
- 엘리스
- 브루트포스
- JavaScript
- 엘리스트랙
- 프로그래머스
- 온라인코딩
- 스프링부트
- 개발자국비지원
- 백준
- 프론트엔드학원
- Web
- 리액트
- spring boot
- 정렬
- 그리디
- C++
- 온라인코딩학원
- 엘리스트랙후기
- 웹개발
- 코딩테스트
- 온라인코딩부트캠프
- 개발자부트캠프
- 프론트엔드
- 내일배움카드코딩
- 백엔드
- 리액트네이티브강좌
- 알고리즘
- 후기
- react
- 부트캠프
- Today
- Total
All Night Coding
[엘리스 SW트랙 6기] 6주차 회고록 본문
들어가기에 앞서
이번 주부터 본격적으로 백엔드(Node.js)에 대해서 자세히 배웠다.
백엔드라고는 데이터베이스랑 인터넷프로그래밍 수업시간에 잠깐 만져본게 다라서.. 이번에 배울 때는 엄청 새로웠다.
주관적인 감상은, Spring 보다는 Node.js가 훨씬! 프론트 친화적이다.
일단 자바라는 언어 자체에 거부감이 있어서 그런지.. 백엔드를 스프링으로 처음 배웠을 때 느꼈던 감정은 들지 않았다.
그래서 생각보다 백엔드도 꽤 재미있음을 느꼈다. 앞으로 풀스택으로 뭔갈 만들어봐도 좋겠다는 생각이 들었다.
배운 것
1. Express Router
2. Express Middleware
3. REST API
4. MongoDB, Mongoose
이번 주차는 주로 Express.js를 통해 서버를 구동하고, DB와 연결하는 방법을 학습하게 되었다.
먼저 가장 기본이 되는 Router부터 다시 보자면,
const { Router } = require('express');
const router = Router();
router.get('/', (req, res) => {
res.send('GET /users');
});
//routes/users.js
app.get('/', (req, res) => {
res.send("OK");
});
app.use('/users', userRouter)
app.listen(8080);
//index.js
index.js의 app.use() 에서 '/users' 경로로 향하는 router를 정의하고,
routes/users.js에서는 '/users' 경로로 들어왔을 때 router가 취할 액션을 정의한다.
해당 코드에서는 '/users' 경로로 진입했을 때 'GET /users' 라는 문구가 화면에 나타나게 된다.
즉 Router란 특정 path로 이동했을 때 어떠한 동작을 수행할 수 있도록 처리해주는 것이다.
그리고 Middleware란, 요청과 응답을 진행하는 사이에서 함수의 동작을 실행하는, 즉 중간에 거쳐가는 함수이다.
app.get('/', function(req, res, next) {
next();
});
이러한 형태로 app.get()이 정의되었을 때, 중간에 위치하는 함수가 미들웨어이다.
미들웨어 함수는 req(요청), res(응답) 파라미터를 받아 해당 객체를 변경할 수 있고,
next()를 함수내에서 호출한다면 다음 미들웨어 함수로 넘어갈 수 있다. next는 선택 사항이다.
오류 처리 미들웨어라는것도 있는데, 이는 미들웨어에서 전달된 오류를 함수 내에서 응답으로 반환하는 역할을 한다.
app.use((err, req, res, next) => {
res.send(`Request failed with ${err}`)
})
만약 다른 미들웨어 함수를 실행하다가 오류가 발생한다면, 해당 오류처리 미들웨어에서 오류를 처리한다.
즉 에러 핸들러와 비슷한 성격이라고 할 수 있겠다.
REST API란? HTTP URI를 통해 자원(Resource)를 명시하고,
HTTP Method(get, post, put, delete, patch)를 통해 해당 자원(URI)에 대한 CRUD operation을 적용하는 것이다.
데이터 통신의 기본 중의 기본이고, 면접에서도 단골 질문이다.
이를 Express에서도 사용할 수 있는데, 흔히 router 내에서 get, post, put, delete 등의 메소드를 사용한다.
router.get("/", (req, res, next) => {
//get 요청을 받고 실행할 코드
//ex) Model에 get 메소드로 값을 불러온다.
});
router.post('/', (req, res, next) => {
//post 요청으로 보낼 코드
//ex) req.body에 담긴 데이터를 Model에 create한다.
});
router.put('/:id', (req, res, next) => {
//put 요청으로 보낼 코드
//ex) req.body에 담긴 데이터를 특정 id의 Model에 update한다.
});
router.delete('/:id', (req, res, next) => {
//delete 요청으로 삭제할 코드
//ex) Model에 delete 메소드로 특정 id의 값을 삭제한다.
});
마지막으로 MongoDB가 도대체 무엇인지와,
Express에서 mongoose를 통해 MongoDB를 편리하게 사용하는 방법에 대해 학습했었다.
MongoDB란 NoSQL 데이터베이스이다. 여기서 NoSQL이란?
구조화된 질의어를 사용하지 않는 데이터베이스이다. 즉 데이터를 구조화하는 작업이 필요없다.
사전작업 없이 데이터베이스를 바로 사용할 수 있기 때문에 프로젝트를 빠르게 진행할 수 있다는 장점이 있다.
그럼 이렇게 편리한 MongoDB를 Express에서 어떻게 사용하는지 다시 리마인드 해보자.
먼저 스키마를 어떻게 정의하는지를 알아보자.
const { Schema } = require('mongoose');
const PostSchema = new Schema({
title: {type: String, required: true},
content: {type: String, required: true}
})
module.exports = mongoose.model("Post", PostSchema);
먼저 mongoose를 불러오고, mongoose 내의 Schema 객체를 통해 PostSchema를 정의한다.
type 속성은 말그대로 타입을 부여할 수 있고, required는 해당 멤버가 필수로 정의되어야 할 때 사용한다.
그리고 mongoose.model() 메서드를 통해 모델을 만들 수 있다!
첫번째 인자에는 해당 스키마의 이름을 넣고, 두번째 인자에는 스키마 자체를 넣는다.
const mongoose = require('mongoose');
const { Post } = require('./models');
// 몽고디비 연결
mongoose.connect('몽고디비 주소');
async function main() {
const posts = await Post.find({
author: ['andy', 'bob', 'kate'],
likes: {
$gt: 5,
$lte: 10,
},
$or: [{ category: { $exists: false } }, { category: 'notice' }],
});
return posts;
}
그리고 정의했던 모델을 불러와서, mongoose.connect()로 MongoDB와 연결하면 바로 사용 가능하다.
Post.find({})에서 {} 내부가 비어있을 경우 모든 값을 불러오며,
해당 예제처럼 조건이 작성되어있을 경우는 해당 조건에 해당하는 값들을 불러온다.
예제에서는 author가 'andy', 'bob', 'kate' 중 하나이며 likes가 5보다 크고 10보다 작거나 같은 post 또는 카테고리가 없거나 notice인 post를 불러온다.
기존에 복잡한 쿼리문을 따로 써서 db를 조작해야 했던 것에 비해,
코드 내에서 json 객체와 비슷한 형태로 db를 조작할 수 있으니 정말 편리했다!😊
이번 주에도 정말 많은 것들을 배웠다..
백엔드는 나도 아무것도 모르는 상태로 배우고 있고, 진도가 너무 빨라서 따라가기가 조금 벅찬 느낌이 있다.
하지만 백엔드도 백엔드 나름의 재미가 느껴진다.
예전에 스프링으로 이해도 안되는거 꾸역꾸역 배울 때와는 다른 느낌이다..!ㅋㅋㅋㅋㅋㅋ
그리고 스터디는 이제 마지막을 향해 달려가고 있다. 기존에 생각했던 것보다 기능을 훨씬 많이 추가할 수 있었다.
이제 점점 하나의 멋진 프로젝트가 되어간다는게 너무 뿌듯하고 좋다.🥰
이번주도 수고했다 나 자신!
'Bootcamp' 카테고리의 다른 글
| [엘리스 SW트랙 6기] 1차 프로젝트 회고록 (0) | 2023.10.22 |
|---|---|
| [엘리스 SW트랙 6기] 7주차 회고록 (0) | 2023.09.24 |
| [엘리스 SW트랙 6기] 5주차 회고록 (0) | 2023.09.10 |
| [엘리스 SW트랙 6기] 4주차 회고록 (0) | 2023.09.04 |
| [엘리스 SW트랙 6기] 3주차 회고록 (0) | 2023.08.27 |