다른 서비스 호출
API 제공 서버를 만들었으니 API를 사용하는 서비스도 만들어 보자.
이 서비스는 다른 서버에게 요청을 보내므로 클라이언트 역할을 한다. API 제공자가 아닌 API 사용자의 입장에서 진행하는 것이며, NodeBird 앱의 데이터를 가져오고 싶어 하는 사용자인 것이다.
{
"name": "nodecat",
"version": "1.0.0",
"description": "노드버드 2차 서비스",
"main": "app.js",
"scripts": {
"start": "nodemon app",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "hvvan",
"license": "ISC",
"dependencies": {
"axios": "^0.19.2",
"cookie-parser": "^1.4.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"express-session": "^1.17.1",
"morgan": "^1.10.0",
"nunjucks": "^3.2.1"
},
"devDependencies": {
"nodemon": "^2.0.3"
}
}
nodecat/package.js
nodebird에서 API를 통해 데이터를 가져오는 프로젝트이다.
const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const nunjucks = require('nunjucks');
const dotenv = require('dotenv');
dotenv.config();
const indexRouter = require('./routes');
const app = express();
app.set('port', process.env.PORT || 4000);
app.set('view engine', 'html');
nunjucks.configure('views', {
express: app,
watch: true,
});
app.use(morgan('dev'));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie:{
httpOnly: true,
secure: false,
},
}));
app.use('/', indexRouter);
app.use((req, res, next) => {
const error = new Error(`${req.method} ${req.url} 라우터가 없습니다. `);
error.status = 404;
next(error);
});
app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
res.status(err.status || 500);
res.render('error');
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기중...');
});
nodecat/app.js
error.html과 .env를 다음과 같이 구현하자
<h1>{{ message }}</h1>
<h2>{{ error.status }}</h2>
<pre>{{ error.stack }}</pre>
nodecat/views/error.html
COOKIE_SECRET=nodecat
CLIENT_SECRET=ffd64ab3-930b-47a1-a92c-bbc4c2b9d8c9
nodecat/.env
CLIENT_SECRET은 이전에 발급받은 도메인 key이다.
그리고 이제 router를 구현하자.
const express = require('express');
const axios = require('axios');
const router = express.Router();
router.get('/test', async (req, res, next) => { //토큰 테스트 라우터
try{
if(!req.session.jwt){
const tokenResult = await axios.post('http://localhost:8002/v1/token', {
clientSecret: process.env.CLIENT_SECRET,
});
if(tokenResult.data && tokenResult.data.code === 200){ //토큰 발급 성공
req.session.jwt = tokenResult.data.token; // 토큰 저장
}else{//토큰 발급 실패
return res.json(tokenResult.data);
}
}
//토큰 테스트
const result = await axios.get('http://localhost:8002/v1/text', {
headers: {authorization: req.session.jwt},
});
return res.json(result.data);
}catch(err){
console.error(err);
if(err.response.status === 419){// 토큰 만료 시
return res.json(err.response.data);
}
return next(err);
}
});
module.exports = router;
nodecat/routes/index.js
GET /test 라우터는 NodeCat 서비스가 토큰 인증 과정을 테스트해보는 라우터이다.
요청이 왔을 때 세션에 발급받을 토큰이 저장되어 있지 않다면 POST http://localhost:8002/v1/token 라우터로 토큰을 발급받아 보관한다.
발급에 성공하면 토큰을 테스트하게 된다.
서버를 동작시켜 보자. api서버도 다른 콘솔로 동작시켜야 한다.


유효기간이 1분이라 1분이 지나면 토큰은 만료된다.
다음 포스트에서 처리해보자.
다른 서비스 호출
API 제공 서버를 만들었으니 API를 사용하는 서비스도 만들어 보자.
이 서비스는 다른 서버에게 요청을 보내므로 클라이언트 역할을 한다. API 제공자가 아닌 API 사용자의 입장에서 진행하는 것이며, NodeBird 앱의 데이터를 가져오고 싶어 하는 사용자인 것이다.
{
"name": "nodecat",
"version": "1.0.0",
"description": "노드버드 2차 서비스",
"main": "app.js",
"scripts": {
"start": "nodemon app",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "hvvan",
"license": "ISC",
"dependencies": {
"axios": "^0.19.2",
"cookie-parser": "^1.4.5",
"dotenv": "^8.2.0",
"express": "^4.17.1",
"express-session": "^1.17.1",
"morgan": "^1.10.0",
"nunjucks": "^3.2.1"
},
"devDependencies": {
"nodemon": "^2.0.3"
}
}
nodecat/package.js
nodebird에서 API를 통해 데이터를 가져오는 프로젝트이다.
const express = require('express');
const morgan = require('morgan');
const cookieParser = require('cookie-parser');
const session = require('express-session');
const nunjucks = require('nunjucks');
const dotenv = require('dotenv');
dotenv.config();
const indexRouter = require('./routes');
const app = express();
app.set('port', process.env.PORT || 4000);
app.set('view engine', 'html');
nunjucks.configure('views', {
express: app,
watch: true,
});
app.use(morgan('dev'));
app.use(cookieParser(process.env.COOKIE_SECRET));
app.use(session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie:{
httpOnly: true,
secure: false,
},
}));
app.use('/', indexRouter);
app.use((req, res, next) => {
const error = new Error(`${req.method} ${req.url} 라우터가 없습니다. `);
error.status = 404;
next(error);
});
app.use((err, req, res, next) => {
res.locals.message = err.message;
res.locals.error = process.env.NODE_ENV !== 'production' ? err : {};
res.status(err.status || 500);
res.render('error');
});
app.listen(app.get('port'), () => {
console.log(app.get('port'), '번 포트에서 대기중...');
});
nodecat/app.js
error.html과 .env를 다음과 같이 구현하자
<h1>{{ message }}</h1>
<h2>{{ error.status }}</h2>
<pre>{{ error.stack }}</pre>
nodecat/views/error.html
COOKIE_SECRET=nodecat
CLIENT_SECRET=ffd64ab3-930b-47a1-a92c-bbc4c2b9d8c9
nodecat/.env
CLIENT_SECRET은 이전에 발급받은 도메인 key이다.
그리고 이제 router를 구현하자.
const express = require('express');
const axios = require('axios');
const router = express.Router();
router.get('/test', async (req, res, next) => { //토큰 테스트 라우터
try{
if(!req.session.jwt){
const tokenResult = await axios.post('http://localhost:8002/v1/token', {
clientSecret: process.env.CLIENT_SECRET,
});
if(tokenResult.data && tokenResult.data.code === 200){ //토큰 발급 성공
req.session.jwt = tokenResult.data.token; // 토큰 저장
}else{//토큰 발급 실패
return res.json(tokenResult.data);
}
}
//토큰 테스트
const result = await axios.get('http://localhost:8002/v1/text', {
headers: {authorization: req.session.jwt},
});
return res.json(result.data);
}catch(err){
console.error(err);
if(err.response.status === 419){// 토큰 만료 시
return res.json(err.response.data);
}
return next(err);
}
});
module.exports = router;
nodecat/routes/index.js
GET /test 라우터는 NodeCat 서비스가 토큰 인증 과정을 테스트해보는 라우터이다.
요청이 왔을 때 세션에 발급받을 토큰이 저장되어 있지 않다면 POST http://localhost:8002/v1/token 라우터로 토큰을 발급받아 보관한다.
발급에 성공하면 토큰을 테스트하게 된다.
서버를 동작시켜 보자. api서버도 다른 콘솔로 동작시켜야 한다.


유효기간이 1분이라 1분이 지나면 토큰은 만료된다.
다음 포스트에서 처리해보자.