본문 바로가기
바닐라코딩

바닐라코딩 9주차 정리

by Dev_Dank 2022. 1. 3.

강의

이번주의 수업내용은 nodejs, express, mongodb였습니다. 

Nodejs

자바스크립트는 언어가 생성된 목적자체가 브라우저에서 구동가능한 언어를 만드는 것이었기 때문에 웹브라우저 외에서는 구동이 불가능했습니다. 그러나 라이언 달이 구글의 V8자바스크립트엔진을 기반으로 브라우저가 아닌 환경에서도 자바스크립트가 구동가능한 런타임을 구현했으며 그것이 바로 Nodejs입니다. 

브라우저밖에서 자바스크립트를 구동 가능하다는 것은
"자바스크립트로 C처럼 컴퓨터의 자원(파일)에 직접접근이 가능해짐 -> 자바스크립트로도 서버를 만들수 있음"을 의미하게 됩니다. 

https://nodejs.org/api/

 

Index | Node.js v17.3.0 Documentation

 

nodejs.org

Express

노드js 만으로도 서버를 생성할  수 있지만 반복되는 작업이 너무 많고 직접 일일히 설정하기는 귀찮은 부분이 많습니다. 그러한 부분을 해결 할 수있는 프레임워크로 express가 존재합니다. express를 활용하여 노드 서버를 그냥 노드만 쓸때보다 더 쉽고 간편하게 만들어 활용이 가능합니다. 

https://expressjs.com/

 

Express - Node.js web application framework

Fast, unopinionated, minimalist web framework for Node.js $ npm install express --save

expressjs.com

mongodb

서버단에서 사용할 수 있는 데이터 베이스의 종류는 크게 2가지 입니다. 

바로 SQL과 NoSQL 입니다. 

https://academind.com/tutorials/sql-vs-nosql

 

SQL vs NoSQL

Are NoSQL databases better than SQL databases? Should you migrate to NoSQL? In this article and video, I'll compare both and give some guidance.

academind.com

SQL
- Structured Query Language를 이용한 데이터 베이스입니다. 
- 스키마를 정해놓고 해당 스키마에 맞는 정보가 아니면 데이터를 추가 할 수 가 없습니다. (그런데 이건 ODM을 NoSQL에서도 쓰면 지원 되는 부분입니다....)
- 테이블에 저장되는 데이터는 중복되지 않으며 각 테이블간의 정보를 join해서 원하는 형태로 데이터를 표시할 수 있습니다.
- 각테이블간의 정보는 관계 (relation)으로 연결될 수 있으며 따라서 SQL 데이터베이스를 RDBMS라고도 합니다.  
- 데이더베이스의 수직적 확장이 가능합니다. 왜냐하면 서로 관계가짜여진 데이터들 사이에서 복잡한 쿼리문을 연산 하기 위해서는 하드웨어의 성능이 더 좋아져야 하기 때문입니다. 


NOSQL
- SQL의 반대되는 개념의 데이터 베이스입니다. 
-스키마를 정하지 않습니다. (다만 mongoDB 를 mongoose와 같은 ODM과 함께 사용하면 스키마기능을 활용 할 수 있습니다.) 따라서 특정 필드가 비어있는데이터들도 삽입이 가능합니다. 
- 데이터간의 관계가 존재하지 않습니다. (이 부분 또한 mongoose에서  poppulate와 같은 기능을 쓰면 특정 값을 기준으로 다른 콜렉션에 존재하는 데이터를 가져와 필드를 채울순 있긴합니다.) 데이터의 관계가 존재하지 않기 때문에 데이터베이스 간에 중복된 데이터가 존재가 가능합니다. 
- 데이터 베이스의 수평적 확장이 가능합니다. 데이터가 서로 관계성을 갖고 있지 않기 때문에 저장 용량만 늘려주면 되기 때문입니다. (물론 연산성능을 높여주는 수직적확장도 가능합니다.)

Index
또 한가지 데이터베이스에서 중요하게 알고 넘어가야하는 기능은 인덱스입니다. 인덱스를 활용하면 특정 정보를 조회할때 미리 정의해둔 인덱스를 기준으로 검색이 가능하기 때문에 더 빠르게 정보를 데이터베이스에서 조회 할 수있습니다.

예를 들어서 백과사전을 생각해보면 가장 뒤쪽에 ㄱㄴㄷ ...순으로 단어들을 정리해놓은 색인 부분이 있습니다. 만약 제가 해당 백과 사전에서 "라면"이라는 단어를 찾고싶다면 먼저 색인에 가서 ㄹ로 시작하는 단어가 시작되는 페이지를 찾고 해당 페이지부터 "라면" 이라는 단어를 찾을 것입니다. 

그런데 만약 색인이 없었다면 어디서부터 ㄹ로 시작하는 단어가 나오기 시작하는지 알수가 없고 결국 백과사전의 맨 처음부터 탐색을 시작했어야 할 것 입니다. 

데이터 베이스에서도 위의 예시처럼 특정 데이터를 특정 순서로 정렬해놓은 색인을 만들어 놓을수 있으며 해당 색인을 통해 빠른 검색을 도울 수 있습니다. 

다만 인덱스를 유지하는것의 단점은 인덱스정보를 저장하기 위해 추가적인 저장용량이 요구된다는 것이고 쓰기와 수정이 많은 데이터의 경우 해당 인덱스의 순서도 계속 정렬을 시켜줘야하기 때문에 쓰기 속도에 영향을 줄 수 있다는 것 입니다. 

https://stackoverflow.com/questions/1108/how-does-database-indexing-work

 

How does database indexing work?

Given that indexing is so important as your data set increases in size, can someone explain how indexing works at a database-agnostic level? For information on queries to index a field, check out ...

stackoverflow.com


과제

이번주의 과제는 주어진 테스트케이스를 전부 통과 할 수 있도록 익스프레스와 몽고디비를 활용해 간단한 서버를 제작하는 것이었습니다.

과제를 진행 하면서 새롭게 알게되거나 개선을 요구받은 부분은 아래와 같습니다. 

1. 에러처리를 너무 테스트케이스를 통과하기위해 획일적으로 작성했습니다. 


부족하다고 느낀부분

- 몽구스의 스키마를 사용하는 것이 첫주라 아직 많이 미숙합니다. 분명 활용가능한 여러기능들이 더 있음에도 너무 기본적인 것만 사용했으며 데이터 validation을 해주지 못했습니다. 문서를 계속 읽어보며 다음주 과제에서는 더 많은 기능들을 활용해보려 합니다. 

- 에러 핸들링을 여러케이스를 나눠서 세세하게 작성해줬어야 했습니다. 지금은 위의 스크린샷처럼 에러가 발생하면 1가지만 발생하게 되어있습니다. 

 

댓글