백엔드 11.21 세션

성균관대학교멋사·2022년 11월 21일
0
post-thumbnail

MongoDB 연결하기

다음으로는 node와 mongoDB를 연결하는 방법입니다.


일단 Cluster를 만듭니다.


user이름과 password를 만들고 본인 ip주소로 연결합니다.

connect your application을 눌러 주면

application code를 받게 됩니다. 이걸 복사해 둡니다.

그 다음에 node와 연결할 때는 mongoose를 사용합니다.
mongoose는 간단히 MongoDB를 연결할수 있는 Object Modeling Tool이라 보시면 됩니다.

npm install mongoose
package.json의 scripts를 수정합니다.

{
  "name": "mongoose-exam",
  "version": "1.0.0",
  "scripts": {
    "start": "node app"
  },
  "dependencies": {
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "mongoose": "^5.12.5"
  }
}

일단 설치한 이후에, index.js파일에 다음과 같이 작성해줍니다.

/*index.js*/
const express = require('express'); // express 임포트
const app = express(); // app생성
const port = 5000;

app.get('/', function (req, res) {
  res.send('hello world!!');
});

app.listen(port, () => console.log(`${port}포트입니다.`));

// 몽구스 연결
const mongoose = require('mongoose');
mongoose
  .connect(
    '여기에 아까 복사한 application code를 넣으면 됩니다.',
    {
      // useNewUrlPaser: true,
      // useUnifiedTofology: true,
      // useCreateIndex: true,
      // useFindAndModify: false,
    }
  )
  .then(() => console.log('MongoDB conected'))
  .catch((err) => {
    console.log(err);
  });

끝!

추가적으로 Django와 mongoDB 연결법도 포스팅하겠습니다. 참고로 Django와 가장 궁합이 좋은 DB는 PostgreSQL이라고 합니다.
django 프로젝트를 처음 시작하면 sqlite3라는 DB가 연결되어있습니다. 이거를 mongoDB로 바꿔주는 작업을 하면 됩니다.

일단 뭐 당연히 Mongodb 있어야겠죠?
그건 저번 세션에서 다루었기 때문에 넘어갑니다.
이번 세션의 주제는 "연결"이기 때문입니다.

방법은 PyMongo, MongoEngine, Djongo 등 여러 방법이 있는데, 저는 Djongo를 사용해 보겠습니다.
개발자가 긴 쿼리를 작성할 필요가 없기 때문에 그렇습니다.
우선 djongo를 설치해줍니다.

pip3 install djongo

그리고 settings.py에서 DATABASES 항목을 찾아서 수정해줍니다.

#settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

원래 이렇게 생겼는데 이거 지워주고 대체합니다.

DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'ENFORCE_SCHEMA': True,
        'LOGGING': {
            'version': 1,
            'loggers': {
                'djongo': {
                    'level': 'DEBUG',
                    'propogate': False,                        
                }
            },
         },
        'NAME': '원하는 데이터베이스의 이름을 넣어주세요',
        'CLIENT': {
            'host': '127.0.0.1',
            'port': 27017,
            'username': '몽고DB 사용자 계정을 넣어주세요',
            'password': "몽고DB 사용자 비밀번호 넣어주세요",
            'authSource': 'admin',
            'authMechanism': 'SCRAM-SHA-1'
        }
    }
}

여기까지하면 연결은 끝.

models.py 파일을 보면 원래 models를 django에서 import해왔을 겁니다.

from django import models

그걸 djongo로 바꿔주면 됩니다.

from djongo import models

이후에는 마이그레이션 해주면 끝입니다!!

python3 manage.py makemigrations
python3 manage.py migrate

API와 Postman

API: **Application Programing Interface**

API는 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스 를 뜻한다.(인터페이스: 어떤 기계간의 장치끼리 정보를 교환하기 위한 수단이나, 방법)

위의 그림에서 보듯이 Client에 해당하는 게 클라이언트 컴퓨터이고, Database에 해당하는 게 서버입니다. 그리고, 이를 연결해주는 체계가 바로 API

  • 클라이언트는 웹 상에서 어떤 서비스를 요청 (Request)하는 컴퓨터를,
  • 서버는 요청받은 서비스에 응답 (Response)하는 컴퓨터를 의미

Eg) 네이버에 로그인:

  • 클라이언트 컴퓨터: “로그인 시켜줘”라고 요청

  • 서버 컴퓨터: 이 요청을 받고 아이디와 비밀번호가 맞는지 확인 후 맞으면 로그인을 시켜주는 컴퓨터

    • 개인이 백엔드를 제작한다고 하면, 자신의 컴퓨터 또한 서버 컴퓨터의 역할 가능

    • 추가적으로 대부분의 서버 컴퓨터는 다음과 같은 데이터 센터에서 제공, 또한 상품으로 구매 가능

근데 웹 상의 요청이 “로그인 시켜줘” 하나면 좋을텐데, 실상은 클라이언트는 매우 다양한 요청을 보낸다. 신문 기사 앱이라고 가정을 하면,

  • 회원가입 해줘
  • 로그인 진행해줘
  • 신문 기사를 띄워줘
  • 신문 기사를 입력해줘

등 다양한 요청이 있는데, 이러한 요청들을 구분할 수 있도록 하는 체계가 바로 API이다.

클라이언트 관점에서의 API:

클라이언트에서 API를 요청할 때의 과정은 4가지 요소로 이루어져 있다.

  • CREATE: 회원 정보 만들기
  • READ: 회원 정보 읽기
  • UPDATE: 회원 정보 갱신
  • DELETE: 회원 정보 삭제

다음과 같은 요청은 각각의 주소를 가지게 된다.

Restful API:

더 체계적인 API를 만들기 위해 REST(Representational State Transfer)한 API 즉, RESTful API라는 공식 체계가 존제하게 된다.

RESTful API는 CRUD를 한 주소로 관리하고, 요청을 보낼 때 다음의 4가지 메소드 (method)를 이용한다.

  • CREATE는 POST 메소드를 사용
  • READ는 GET 메소드를 사용
  • UPDATE는 전체 갱신이면 PUT, 일부 갱신이면 PATCH 메소드를 사용
  • DELETE는 DELETE 메소드 사용

여기서 메소드 (Method)라는 용어는 함수처럼 어떤 요청을 보내면 특정 결과가 나오는 API의 모습에서 착안해 만들어졌으며, .위의 예에서 회원 정보에 들어가는 ID, 비밀번호를 함수의 parameter로 넣으면 마치 POST(ID, 비밀번호)는 회원 정보를 갱신해주는 요청을 하게 된다. 즉, RESTful API는서버주소/account만 URL로 입력하고, POST 메소드를 사용해 회원정보를 생성하는 요청을 하면 된다.

서버 관점에서의 API

이제 요청을 받은 걸 서버에서 처리할 때 크게 두 가지 응답이 있을 수 있다.

  • 요청이 잘 됐으니 요청을 처리했다는 응답
  • 요청이 이상하니 확인해달라는 응답 → 아래와 같은 오류 코드가 존재
    • 200번대 코드 (201, 202,…)는 잘 됐다
    • 400번대 코드 (401, 404,…)는 클라이언트 요청 상의 오류
    • 500번대 코드 (500, 501,…)는 서버 응답 상의 오류

그렇다면 간단한 API를 구성해보자!!

간단히 신문 게시판을 구현, 백엔드로 Node Express를 가정해보도록 하겠다.

아래와 같은 코드를 작성한다고 가정하면, 클라이언트 컴퓨터에서는 get 방식을 통한 request를 진행, 서버 컴퓨터에서는 이에 맞는 api를 다음과 같이 코드로 작성해서 보내주도록 한다.

// 신문 게시판 구현:

app.get("/article/post", async function (req, res) {
  // 1: await 키워드를 사용하는데, await 키워드를 사용하는 함수는 반드시 async 키워드를 function 키워드 앞에 붙여야 함
  ...
  var posts = await Article.find({}) // await를 사용하여 검색된 Article을 변수에 담을 수 있게 함
    .sort("-createdAt")
    .skip(skip)
    .limit(limit)
    .exec();

  try {
    data = posts; //api 데이터를 data 변수에 담는다.
    res.status(200).json({
      // 에러가 발생 안했으므로. json으로 던져준다.
      success: true,
      data: data,
      currentPage: page, // 현재 페이지 번호(currentPage), 마지막 페이지번호(maxPage), 페이지당 보여줄 게시물 수(limit)를 프론트에서 사용할 수 있게 한다.
      maxPage: maxPage,
      limit: limit
    });
  } catch (err) {
    console.log(err);
    return res.send({ success: false, err });
  }
});

이러한 테스트를 진행하기 위해서는 프론트와 백엔드가 모두 완성이 되어있어야 할까? 아니다. 백엔드의 API를 먼저 테스트하기 위해서 제공되는 툴이 바로 POSTMAN이다. 그렇다면 포스트 맨을 통해서 위의 신문 게시판 API를 실행해보도록 하자.

포스트 맨을 접속하면 다음과 같은 형태로 되어있다. 되게 간단하게 보여줄 것만 딱딱 보여준다. 그렇다면 한번 API를 보내보도록 해보자.

위의 서버가 localhost:8000에서 작동을 한다고 가정해보자. 코드 내 주소를 보면, “/article/post”를 볼 수 있을 것이다. 이는 이제 백엔드 내에서 API 주소이다. 그렇다면 우리는 프론트 엔드에서 어떤 주소로 request를 보내야 할까? 바로 http://localhost:8000/article/post 이다.

다음과 같이 입력을 한 이후에, send 버튼을 눌러보자 그렇다면 아래와 같은 결과를 얻을 수 있을 것이다. API의 결과를 자세히 살펴보도록 하자!!

Json에서 볼 수 있는 정보는 다음과 같다.

{
    "success": true,
    "data": [
        {
            "_id": "6371d62d56e914c0d68a6995",
            "Date": "2022-10-16T00:00:00.000Z",
            "article_name": "12시간 먹통된 카톡 다시 수면위로 오른 재난관리기본계획 개정",
            "reporter": "김만기",
            "image": "https://image.fnnews.com/resource/media/image/2022/10/16/202210161213532160_l.JPG",
            "article_main": "  SK㈜ C&C의 경기도 판교 데이터센터 화재로 메신저 카카오톡 등이 12시간 넘게 서비스 장애를 일으키면서 과거 불발된 인터넷데이터센터 국가재난관리기본계획 포함법(방송통신발전기본법 개정)에 대한 재개정이 추진될 것으로 보인다.  이종호 과학기술정보통신부 장관은 16일 SK C&C 데이터센터 화재현장 점검 후 관계 기업 대표들과의 간담회에서 관련법 개정을 시사했다. 이종호 장관은 이 자리에서 ''이러한 문제들이 반복되지 않도록 중요한 부가통신서비스와 관련 시설에 대한 점검·관리 체계를 보완하는 등 필요한 제도적·기술적 방안들을 적극 검토하겠다''고 말했다.  지난 15일 오후 3시 30분경 SK C&C의 데이터센터 지하 3층 전기실에서 발생한 화재는 이날 오후 11시 46분쯤 완전히 진화됐다. SK C&C의 데이터센터에는 카카오, 네이버, SK텔레콤, SK브로드밴드 등이 입주해 있다.  이번 사건으로 2020년 법개정을 논의했던 방송통신재난관리기본계획이 다시 주목받고 있다. 과거 법개정을 반대했던 논리는 데이터센터를 사회기반시설로 봐서는 안된다는 것이었다. 하지만 이번 사태를 겪으면서 재산권 침해보다 국가적 안정성이 다시 부각되고 있다.  이종호 장관은 이와관련해 ''부가통신서비스의 안정성이 무너진다면 어제 우리가 경험했듯이 우리 국민들의 일상의 불편을 넘어 경제, 사회활동이 마비될 우려도 있는 만큼, 정부도 이번 상황을 매우 엄중히 여기고 있다''고 말했다.  과거에도 데이터센터 안전사고가 있었다. 2014년에는 삼성SDS의 과천 데이터센터에서 발생한 화재로 삼성카드, 삼성생명, 삼성화재 등 금융 서비스가 일체 중단돼 사용자들이 혼란을 겪었다. 2018년 2월에는 KT 강남 데이터센터 서버 관리용 냉각 장치에 쓸 전력 공급이 일시 중단돼 KT의 서버를 이용하는 모든 기업들의 사이트가 마비되기도 했다.  현행 방송통신재난관리기본계획에는 기간통신사업자와 지상파 방송사업자, 종편방송사업자로 한정돼 있다. 2020년 당시 법개정 논의때에는 여기에 데이터센터 사업자를 포함해야 하고 재난대비 항목에 주요 데이터의 보호를 추가해야 한다는 의견이 있었다.  당시 박선숙 의원이 방송통신발전 기본법의 방송통신재난 대비 대상에 주요 데이터의 보호를 포함시키는 개정안을 발의했었다.  2018년 11월 KT 아현 지사 지하 통신구 화재 사건으로 통신망을 포함한 데이터를 다루는 시설 관리의 중요성이 부각됐었다. 데이터 센터는 다양한 융합서비스의 기반시설이다. 이 시설이 재난으로 파괴되거나 훼손돼 데이터 서비스가 중단될 경우, 사회경제적 영향과 손실은 심각한 양상으로 나타날 것이라는 우려가 확산됐었다.  과기정통부도 데이터센터는 디지털 시대의 핵심 시설로 재난이나 장애가 생기면 국민 생활에 큰 피해를 줄 수 있기에 사후 방안에 대한 법안이 추가로 필요하다고 주장했었다.  업계와 국회 법사위에서 제기했던 중복 사항은 시행령으로 조절하면 된다며 강하게 어필했다.  하지만 인터넷기업들은 한국인터넷기업협회를 앞세워 데이터센터를 법에서 정의하는 사회기반시설로 보기 어렵고, 재산권 침해 논란을 불러 올 수 있다고 반발했었다.  결국 법사위는 판단을 보류했고, 관련법 개정안은 20대 국회를 통과하지 못한 채 국회 임기 종료와 함께 자동 폐기됐다.",
            "article_summary": "SK(주) C&C의 경기도 판교 데이터센터 화재로 메신저 카카오톡 등이 12시간 넘게 서비스 장애를 일으키면서 과거 불발된 인터넷데이터센터 국가재난관리기본계획 포함법(방송통신발전기본법 개정)에 대한 재개정이 추진될 것으로 보이는 가운데 이종호 과학기술정보통신부 장관은 16일 SK C&C 데이터센터 화재현장 점검 후 관계 기업 대표들과의 간담회에서 관련법 개정을 시사하며 '이러한 문제들이 반복되지 않도록 중요한 부가통신서비스와 관련 시설에 대한 점검·관리 체계를 보완하는 등 필요한 제도적·기술적 방안들을 적극 검토하겠다'고 말했다.",
            "keywords": [
                "데이터센터",
                "화재",
                "SK"
            ],
            "__v": 0
        }
}
  1. success:

    클라이언트 컴퓨터의 API request에 있어서, 서버 컴퓨터의 reponse가 적절하다는 것을 의미

  2. data:

    API에 담겨져 있는 데이터 정보를 의미 위의 코드를 보면, data를 지정해서 함께 API에 담아 response, 이 데이터를 통해서 프론트엔드에서 표현이 가능

profile
성균관대학교 멋쟁이사자처럼

0개의 댓글