웹 API 서버 만들기

웹 API 서버 만들기

API 서버 이해하기

NodeBird SNS 서비스

9 장 NodeBird 서비스의 API 서버를 만듦

API: Application Programming Interface

다른 애플리케이션에서 현재 프로그램의 기능을 사용할 수 있게 함

웹 API: 다른 웹 서비스의 기능을 사용하거나 자원을 가져올 수 있게 함

다른 사람에게 정보를 제공하고 싶은 부분만 API를 열고, 제공하고 싶지 않은 부분은 API를 만들지 않으면 됨

API에 제한을 걸어 일정 횟수 내에서만 가져가게 할 수도 있음

NodeBird에서는 인증된 사용자에게만 정보 제공

프로젝트 구조 갖추기

NodeBird API 폴더 세팅

nodebird-api 폴더를 만들고 package.json 생성

생성 후 npm i로 패키지 설치

NodeBird에서 config, models, passport 모두 복사해서 nodebird-api에 붙여넣기

routes 폴더에서는 auth.js와 middlewares 재사용

.env 파일 복사

views 폴더를 만들고 error.html 파일 생성

// views/error.html {{message}} {{error.status}} {{error.stack}}

app.js 생성하기

소스 코드는 https://github.com/ZeroCho/nodejs-book/blob/master/ch10/10.2/nodebird-api/app.js

8002 번 포트 사용

8001번을 사용하는 NodeBird 서비스와 8003을 사용할 nodecat 서비스와 함께 사용할 수 있음

콘솔을 여러 개 실행해 각각의 서비스를 돌리면 됨

nodebird-api /views/login.html 화면 생성

NodeBird 서비스의 계정으로 로그인하면 됨(카카오톡 로그인은 안 됨)

도메인 모델 생성하기

models/domain.js 작성

API를 사용할 도메인(또는 호스트)을 저장하는 모델

ENUM type으로 free나 premium만 쓸 수 있게 제한

clientSecret은 uuid 타입으로

// views/domain.js const Sequelize = require('sequelize'); module.exports = class Domain extends Sequelize.Model { static init(sequelize) { return super.init({ host: { type: Sequelize.STRING(80), allowNull: false, }, type: { type: Sequelize.ENUM('free', 'premium'), allowNull: false, }, clientSecret: { type: Sequelize.UUID, allowNull: false, }, }, { sequelize, timestamps: true, paranoid: true, modelName: 'Domain', tableName: 'domains', }); } static associate(db) { db.Domain.belongsTo(db.User); } };

models/index.js에서 Domain등록하고 models/user.js에선 1대 다 관계 associate 작성

도메인 등록 라우터

routes/index 에서 도메인 등록 라우터 생성

uuid 패키지로 사용자가 등록한 도메인에 고유한 비밀번호 부여

uuid는 충돌(고유하지 않은 상황) 위험이 있지만 매우 희박

비밀번호가 일치하는 요청만 API 응답

// routes/index.js const express = require('express'); const { v4: uuidv4 } = require('uuid'); const { User, Domain } = require('../models'); const { isLoggedIn } = require('./middlewares'); const router = express.Router(); router.get('/', async (req, res, next) => { try { const user = await User.findOne({ where: { id: req.user && req.user.id || null }, include: { model: Domain }, }); res.render('login', { user, domains: user && user.Domains, }); } catch (err) { console.error(err); next(err); } }); router.post('/domain', isLoggedIn, async (req, res, next) => { try { await Domain.create({ UserId: req.user.id, host: req.body.host, type: req.body.type, clientSecret: uuidv4(), }); res.redirect('/'); } catch (err) { console.error(err); next(err); } }); module.exports = router;

도메인 등록하고 비밀번호 발급받기

라우터 작성 후 localhost:8002 접속

도메인이 다른 프런트엔드에서 요청을 보내면 CORS 에러(10.7) 발생

로그인 후 localhost:8003(nodecat 서버) 등록

https://www.inflearn.com/course/%EB%85%B8%EB%93%9C-%EA%B5%90%EA%B3%BC%EC%84%9C/dashboard/

본글의 모든 내용은 위 강의를 토대로 작성됩니다.

from http://jhg3410.tistory.com/31 by ccl(A) rewrite - 2021-11-17 22:26:56