본문 바로가기

프로그래밍/Node.js

[Do it! Node.js 프로그래밍] 6일차

1. 공부한 범위


[06] 데이터베이스 사용하기 (6-3까지)


2. 공부한 내용


[06] 데이터베이스 사용하기


06-1 몽고디비 시작하기

- 노드에서 데이터 저장이 필요할 때는 Mongo DB를 사용하는 경우가 많다.

- 몽고디비는 기존에 널리 쓰이던 관계형 데이터베이스들과는 다르게 SQL을 사용하지 않는다. 또한 자바스크립트 객체를 그대로 저장할 수 있어 데이터 조회 방식도 SQL과는 차이를 보인다.

- 데이터를 저장, 조회하는 방법을 따로 제공해주기 때문에 몇 가지 사용법만 확실히 알아두면 쉽게 이용이 가능하다.

 

몽고디비란?

- 실무에서 최근에 비 관계형 데이터베이스를 적용하는 곳이 늘고 있다. 또한 이들 비 관계형 데이터베이스는 NoSQL 또는 Not Only SQL이라고 부른다.

- NoSQL이 주목받고 있는 이유에는 여러 가지가 있으나, 가장 큰 이유는 성능때문이라 할 수 있다.

- 관계형 데이터베이스는 시스템의 신뢰도를 높이는 데 필요한 장치를 많이 보유하고 있다. 또한 SQL문을 읽고 실행하는 데 많은 리소스를 사용하여 이것이 성능이 많이 떨어지게 된다.

- NoSQL은 다른 무엇보다 성능을 최우선으로 생각하기 때문에 실시간으로 데이터를 처리해야 하거나 대용량 트래픽을 감당해야 하는 메시징 시스템에 많이 채용된다.

- 몽고디비는 관계형 데이터베이스의 테이블 개념 대신에 컬렉션이라는 단위로 데이터를 모아놓는다.

- 컬렉션은 테이블과는 달리 데이터를 정해 놓은 칼럼의 형태에 맞출 필요가 없다는 점에 차이가 있다.

- 몽고디비는 데이터 저장소를 가지고 있으며 그 안에 여러 개의 컬렉션을 넣을 수 있다. 각각의 컬렉션은 여러 개의 문서 객체도 가질 수 있다.

- 문서 객체 : 속성들의 집합으이다. 예를 들어 한 사람의 이름과 나이 등을 저장하고 싶을 때 문서 객체를 하나 생성 후 그 안에 자바스크립트의 객체같은 느낌으로 속성을 추가할 수 있다.

 

Mongo DB 시작하기

 

- 데이터베이스가 시작되면 27017 포트에서 연결을 기다린다는 메시지가 표시된다.

- 몽고디비 데이터베이스를 사용하고자 한다면 "mongod --dbpath /Users/[user]/database/local"을 반드시 먼저 입력해주어야 한다.

- 몽고디비를 사용하기 위해서는 위의 절차가 끝난 명령 프롬프트를 그대로 둔 상태로 새로운 cmd를 실행 후 mongo라고 입력한다.

- mongo를 입력하면 셸 상태로 전환되며 이후 데이터베이스를 조작할 수 있게된다.

- 셸 상태로 전환된 후에는 use명령을 입력해 데이터베이스를 지정한다.

- 데이터베이스는 dv라는 이름으로 접근 가능하며 데이터베이스 안에 컬렉션을 만들며 문서를 저장할 수 있다.

- 컬렉션은 별도로 만들지 않아도 insert 등의 명령을 실행하면 자동으로 만들어지며 그 안에 파라미터로 전달한 JSON 객체가 추가된다.

 

- 생성된 문서 객체는 find() 메소드를 사용해 특정 조건으로 찾아낼 수 있다.

 

- 위 명령을 입력하면 users 컬렉션에 있는 모든 문서 객체들을 반환한다.

 

06-2 익스프레스에서 몽고디비 사용하기

- 새로운 프로젝트에 노드를 적용시키고자 한다면 반드시 해당 프로젝트 폴더에 들어가 npm init 또는 yarn init 명령을 입력해야 한다. package.json파일 유무로 초기화 명령이 실행되었는지 확인 가능하다.

 

mongodb 모듈을 이용해 로그인 기능 만들기

- JSON 객체에는 regexp 표현식으로 표시 조건을 넣을 수 있다. 예를 들어 remove 메소드를 사용할 때 "name" : /lee/라 입력한다면 name속성에 lee가 들어간 모든 데이터를 찾아 지울 수 있게 된다.

 

- 몽고디비에 구축한 데이터베이스를 익스프레스와 연결해준다.

 

- 이후 서버를 시작할 때 connectDB함수를 실행하도록 하여 둘을 연결시킨다.

 

사용자가 보내온 아이디와 비밀번호 비교하기

- 사용자가 아이디와 비밀번호를 보내면 해당 정보가 데이터베이스에 있는지 비교해야 한다.

 

- database.collection() 메소드를 통해 데이터베이스의 해당 컬렉션 객체를 참조하게 된다.

- 조회한 결과는 toArray() 메소드를 통해 배열 객체로 변환하게 된다. 이의 파라미터로 전달되는 콜백 함수에는 error와 result가 있으며 조건문에 따라 다른 결과값을 반환한다.

 

로그인 처리를 요청하는 경로에 라우팅 함수 추가하기

- authUser 함수를 통해 검색한 결과를 라우팅함수를 통해 클라이언트에 다시 전달해준다.

- 로그인 작업 수행


- 사용자 정보를 post 형식으로 보내자 database.collection is not a function 오류가 발생했다.

- 검색 결과 현재 내 몽고디비 버전은 4.2였고, 3.0이상은 connection을 할 때 database 이름을 명시해줘야 한다는 것을 알게 되었다.

 

- 다음으로는 존재하지 않는 아이디라는 결과가 출력되었고 이유를 알기 위해 paramId와 paramPwd변수를 로그에 출력해보니 비밀번호값이 undefined로 나온다는 것을 알 수 있었다.

- 제대로 클라이언트로부터 post되지 않는것이라는 추론을 통해 login.html을 확인해보니 비밀번호의 이름을 id="password"로 설정해놓은 단순한 실수였다.

 

 

사용자 추가 기능 만들기

- 새로운 사용자를 추가하기 위한 회원가입 화면을 만든다.

 

 

 

 

 

데이터베이스 관리 도구

- 몽고디비 또한 터미널을 사용하지 않고 편하게 데이터를 관리할 수 있는 여러 도구들이 있다. 이 중 robomongo를 이용해본다.

 

- 로보몽고 설치 완료 후 몽고디비와의 연결을 완료한 화면

 

06-3 몽구스로 데이터베이스 다루기

- MongoDB를 사용하며 한 컬렉션 안에 똑같은 속성을 가진 문서 객체를 반복적으로 넣어두면 데이터를 조회할 때도 어떤 속성들이 들어 있는지 미리 알 수 있으며 관계형 데이터베이스의 테이블, 엑셀의 시트처럼 관리가 편리해진다.

- 일정 틀을 제공하는 모듈 중 가장 대표적인 것이 몽구스이다.

 

몽구스 모듈 사용하기

- NoSQL인 몽고디비를 사용하면 문서 객체 안에 들어가는 속성을 마음대로 바꿀 수 있어 유연하게 데이터를 저장할 수 있지만, 컬렉션 안에 들어있는 여러 개의 문서 객체를 조회하고자 할 때 제약이 발생할 수 있다.

- 이 제약 사항을 해소하고자 스키마(Schema)를 만들고 해당 스키마에 따라 문서 객체를 저장하는 것이 좋다.

- 스키마 : 데이터베이스의 구조를 정의한 것

- 몽구스 모듈에서 사용이 가능한 대표적인 메소드

connect(uri(s), [options], [callback]) : 몽구스를 이용해 데이터베이스에 연결한다. 연결 후에는 mongoose.connection 객체를 사용해 연결에 관련된 이벤트를 처리할 수 있다.

Schema() : 스키마를 정의하는 생성자

model(name, [schema], [collection], [callback]) : 모델을 정의한다. [collection]이 지정되면 해당 컬렉션을 사용하게 되며, 따로 지정하지 않으면 name으로 유추한 컬렉션을 사용하게 된다.

 

- 데이터 타입과 같은 역할을 하는 스키마 타입의 종류

String : 문자열 타입

Number : 숫자 타입

Boolean : 이진 타입

Array : 배열 타입

Buffer : 버퍼 타입. 바이너리 데이터를 저장할 수 있다.

Date : 날짜 타입

ObjectId : 각 문서마다 만들어지는 ObjectId를 저장할 수 있다.

Mixed : 혼합 타입

- 스키마 내 각 속성들은 좀 더 구체적으로 지정해둘 수 있다.

type : 자료형을 지정한다.

required : true라면 해당 속성은 null이어선 안된다.

unique : true라면 이 속성에는 고유한 값만 들어가야 한다.

 

몽구스로 사용자 인증하기

- 데이터 처리를 위한 대표적인 메소드

find([criteria], [callback]) : 조건을 넣어 컬렉션의 데이터를 조회하며 결과는 콜백 함수로 전달된다.

save([options], [callback]) : 모델 인스턴스 객체의 데이터를 저장한다.

update([criteria], [callback]) : 컬렉션의 데이터를 조회한 후 업데이트한다. where() 메소드와 함께 사용된다.

remove([criteria], [callback]) : 컬렉션의 데이터를 삭제한다.

- 업데이트의 예

userModel.where({id : "user1"}).update({name : "lee2"}, function(error...) {});

 

- 회원가입을 하는 과정에서 데이터베이스에는 제대로 저장되지만 화면에는 저장되지 않았다고 출력되는 문제가 발생해 확인해본 결과 result.insertedCount가 존재하지 않았기 때문이여서 해당 조건을 제거하여 정상 실행이 되었다.