1. 서버에서 req 보내고, res 받아서 DB에 값 저장하기 (setInterval 사용) (라우터, 웹 X)
그대로 보내면
https://polling.finance.naver.com/api/realtime.nhn?query=SERVICE_ITEM:068270|SERVICE_RECENT_ITEM:068270&_callback=window.__jindo2_callback._9294
response가
window.__jindo2_callback._9294({"resultCode":"success","result":{"pollingInterval":8000,"areas":[{"datas":[{"nv":316500,"eps":2514,"bps":21666.12270,"cnsEps":3770,"ov":315500,"sv":319000,"cv":2500,"nav":null,"aq":415720,"aa":132587111500,"cd":"068270","cr":0.78,"hv":323000,"nm":"셀트리온","rf":"5","mt":"1","pcv":319000,"tyn":"N","ul":414500,"ll":223500,"keps":2236,"dv":null,"ms":"OPEN","lv":315500}],"name":"SERVICE_ITEM"},{"datas":[{"nv":316500,"eps":2514,"bps":21666.12270,"cnsEps":3770,"ov":315500,"sv":319000,"cv":2500,"nav":null,"aq":415720,"aa":132587111500,"cd":"068270","cr":0.78,"hv":323000,"nm":"셀트리온","rf":"5","mt":"1","pcv":319000,"tyn":"N","ul":414500,"ll":223500,"keps":2236,"dv":null,"ms":"OPEN","lv":315500}],"name":"SERVICE_RECENT_ITEM"}],"time":1593048845938}})
콜백 잘라서 보내면
https://polling.finance.naver.com/api/realtime.nhn?query=SERVICE_ITEM:068270|SERVICE_RECENT_ITEM:068270
response가
{"resultCode":"success","result":{"pollingInterval":8000,"areas":[{"datas":[{"cd":"068270","nv":316000,"eps":2514,"bps":21666.12270,"cnsEps":3770,"ov":315500,"sv":319000,"cv":3000,"nav":null,"aq":419598,"aa":133814248000,"hv":323000,"lv":315500,"cr":0.94,"ms":"OPEN","nm":"셀트리온","rf":"5","mt":"1","pcv":319000,"tyn":"N","ul":414500,"ll":223500,"keps":2236,"dv":null}],"name":"SERVICE_RECENT_ITEM"},{"datas":[{"cd":"068270","nv":316000,"eps":2514,"bps":21666.12270,"cnsEps":3770,"ov":315500,"sv":319000,"cv":3000,"nav":null,"aq":419598,"aa":133814248000,"hv":323000,"lv":315500,"cr":0.94,"ms":"OPEN","nm":"셀트리온","rf":"5","mt":"1","pcv":319000,"tyn":"N","ul":414500,"ll":223500,"keps":2236,"dv":null}],"name":"SERVICE_ITEM"}],"time":1593048946733}}
로 온다.
DB에 기본값으로 CURRENT_TIMESTAMP()를 넣고 테이블을 만들면 값을 저장할 때마다 DB가 알아서 DB 서버의 시간을 저장한다.
이것을 이용해 DB에 매 초마다 주식 정보를 가져와 저장하도록 해보자.
app.js
var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(app).listen(80);
console.log("server is running...")
var mysql = require('mysql');
var request = require('request');
var connection = mysql.createConnection({
host: 'localhost',
port: 3308,
user:'root',
password: '1234',
database: 'javascript' // test라는 데이터베이스에 접속
});
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({limit: '50mb', extended: false}));
app.use(bodyParser.json({limit: '50mb'}));
// 1. 라우터 없이 서버에서 긁어서 바로 DB에 저장하는 방법.
const options = {
url:'https://polling.finance.naver.com/api/realtime.nhn?query=SERVICE_ITEM:068270|SERVICE_RECENT_ITEM:068270',
method: 'GET'
}
setInterval(function () {
request.get(options, function(err,httpResponse,body){
// console.log(JSON.parse(httpResponse.body));
response = JSON.parse(httpResponse.body);
console.log("방법1: " + response["result"]["areas"][0]["datas"][0]["nv"]);
console.log("방법2: " + response.result.areas[0].datas[0].nv);
var price = response.result.areas[0].datas[0].nv;
var unixTimeStamp = response.result.time;
function timeConverter(UNIX_timestamp){
var a = new Date(UNIX_timestamp); // 보통 1000을 곱하라고 되어 있는데 이는 13자리를 맞춰주기 위해 곱하거나 떨구는거. 네이버는 기본으로 13자리를 주어 따로 처리 할 필요가 없다.
var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var date = a.getDate();
var hour = a.getHours();
var min = a.getMinutes();
var sec = a.getSeconds();
var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ;
return time;
}
var time = timeConverter(unixTimeStamp)
console.log(time); // timeConverter 함수 인풋 파라미터로 유닉스타임스탬프를 넣는다.
// INSERT 쿼리 보내기
connection.query(`INSERT INTO celltrion (price, navertime) VALUES('${price}','${time}');`)
});
},1000);
});
timestamp 컬럼은 DB 테이블에 default value로 CURRENT_TIMESTAMP를 넣어서 DB 서버가 직접 기록한 시간
navertime 컬럼은 네이버에서 받아온 response에 있는 unix timestamp를 직접 바꿔서 쿼리로 string 타입으로 쏴서 넣어준 시간
2. 라우터 사용
네이버 주식 정보 가져와 매 초마다
(1) DB에 저장하고,
(2) mail.html에 response 보내기 (main.html에서는 DB에서 읽어와 그래프를 그리지 않고 실시간 response를 배열에 누적해서 그래프를 그린다.)
app.js
var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(app).listen(80);
console.log("server is running...")
var mysql = require('mysql');
var request = require('request');
var connection = mysql.createConnection({
host: 'localhost',
port: 3308,
user:'root',
password: '1234',
database: 'javascript' // test라는 데이터베이스에 접속
});
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({limit: '50mb', extended: false}));
app.use(bodyParser.json({limit: '50mb'}));
// 2. 라우터 사용 : 네이버 주식 정보 가져와 매 초마다 (1) DB에 저장하고, (2) main.html에 response 보내기 (main.html에서는 DB에서 읽어와 그래프를 그리지 않고 실시간 response를 배열에 누적해서 그래프를 그린다.)
app.get('/', function (req, res) {
res.sendfile("main.html");
});
app.get('/main', function (req, res) {
res.sendfile("main.html");
});
app.get('/getNaver', function (req, res) {
// var price = getPrice();
// res.send(price);
const options = {
url:'https://polling.finance.naver.com/api/realtime.nhn?query=SERVICE_ITEM:035720|SERVICE_RECENT_ITEM:035720',
method: 'GET'
}
request.get(options, function(err,httpResponse,body){
// console.log(JSON.parse(httpResponse.body));
response = JSON.parse(httpResponse.body);
console.log("방법1: " + response["result"]["areas"][0]["datas"][0]["nv"]);
console.log("방법2: " + response.result.areas[0].datas[0].nv);
var price = response.result.areas[0].datas[0].nv;
var unixTimeStamp = response.result.time;
function timeConverter(UNIX_timestamp){
var a = new Date(UNIX_timestamp); // 보통 1000을 곱하라고 되어 있는데 이는 13자리를 맞춰주기 위해 곱하거나 떨구는거. 네이버는 기본으로 13자리를 주어 따로 처리 할 필요가 없다.
var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
var year = a.getFullYear();
var month = months[a.getMonth()];
var date = a.getDate();
var hour = a.getHours();
var min = a.getMinutes();
var sec = a.getSeconds();
var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ;
return time;
}
var time = timeConverter(unixTimeStamp)
console.log(time); // timeConverter 함수 인풋 파라미터로 유닉스타임스탬프를 넣는다.
// 쿼리 보내기
connection.query(`INSERT INTO kakao (price, navertime) VALUES('${price}','${time}');`)
res.send(""+price); // 숫자만 response로 보낼 경우 23530이라는 값을 response 보내면 HTTP Response 코드로 인식해 응답코드 23530 이라고 낭게 된다. 따라서 문자로 바꿔준다. (2개 이상을 response로 보내 배열로 만들어 보내는 경우는 무관하다.)
});
});
// const options = {
// url:'https://polling.finance.naver.com/api/realtime.nhn?query=SERVICE_ITEM:068270|SERVICE_RECENT_ITEM:068270',
// method: 'GET'
// }
// 함수를 따로 뺐는데 위에 함수 호출한 곳에 return이 되지 않는다. promise 개념이 들어가야한다 함.
// function getPrice() {
// request.get(options, function(err,httpResponse,body){
// // console.log(JSON.parse(httpResponse.body));
// response = JSON.parse(httpResponse.body);
// console.log("방법1: " + response["result"]["areas"][0]["datas"][0]["nv"]);
// console.log("방법2: " + response.result.areas[0].datas[0].nv);
// var price = response.result.areas[0].datas[0].nv;
// var unixTimeStamp = response.result.time;
//
// function timeConverter(UNIX_timestamp){
// var a = new Date(UNIX_timestamp); // 보통 1000을 곱하라고 되어 있는데 이는 13자리를 맞춰주기 위해 곱하거나 떨구는거. 네이버는 기본으로 13자리를 주어 따로 처리 할 필요가 없다.
// var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
// var year = a.getFullYear();
// var month = months[a.getMonth()];
// var date = a.getDate();
// var hour = a.getHours();
// var min = a.getMinutes();
// var sec = a.getSeconds();
// var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ;
// return time;
// }
// var time = timeConverter(unixTimeStamp)
// console.log(time); // timeConverter 함수 인풋 파라미터로 유닉스타임스탬프를 넣는다.
//
// // 쿼리 보내기
// connection.query(`INSERT INTO celltrion (price, navertime) VALUES('${price}','${time}');`)
// console.log("나나난나"+price);
// return price;
// });
// };
// {"resultCode":"success",
// "result":{"pollingInterval":8000,
// "areas":[
// {"datas":[{"ll":223500,"ms":"OPEN","nv":316000,"cd":"068270","eps":2514,"bps":21666.1227,"cnsEps":3770,"ov":315500,"sv":319000,"cv":3000,"nav":null,"aq":531756,"aa":169225844500,"dv":null,"keps":2236,"nm":"��Ʈ����","rf":"5","mt":"1","pcv":319000,"tyn":"N","ul":414500,"lv":314500,"hv":323000,"cr":0.94}],
// "name":"SERVICE_ITEM"},
// {"datas":[{"ll":223500,"ms":"OPEN","nv":316000,"cd":"068270","eps":2514,"bps":21666.1227,"cnsEps":3770,"ov":315500,"sv":319000,"cv":3000,"nav":null,"aq":531756,"aa":169225844500,"dv":null,"keps":2236,"nm":"��Ʈ����","rf":"5","mt":"1","pcv":319000,"tyn":"N","ul":414500,"lv":314500,"hv":323000,"cr":0.94}],
// "name":"SERVICE_RECENT_ITEM"}],
// "time":1593051026214}}
});
res.send(""+price); 에 주목하자
숫자만 response로 보낼 경우 23530이라는 값을 response 보내면 HTTP Response 코드로 인식해 응답코드 23530 이라고 낭게 된다. 따라서 문자로 바꿔준다. (2개 이상을 response로 보내 배열로 만들어 보내는 경우는 무관하다.)
main.html (http://localhost/)
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<span id="result"></span>
<br><br>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>
</body>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
var time=0;
var graphValue = [];
var stockPrice;
setInterval(function () {
$.ajax({
url : '/getNaver',
type : 'GET',
data : {
},
success : function(res) {
stockPrice = res; // 크롬에서 콘솔에서 stockPrice를 찍어보면 보기 좋게 나온다.
// console.log(res);
graphValue.push([time,Number(stockPrice)])
time++;
drawCurveTypes(graphValue); // 구글 차트를 그려주는 함수를 호출한다.
}
});
},1000);
google.charts.load('current', {packages: ['corechart', 'line']});
google.charts.setOnLoadCallback(drawCurveTypes);
function drawCurveTypes() {
var data = new google.visualization.DataTable();
data.addColumn('number', '시간(초)');
data.addColumn('number', '카카오');
data.addRows(graphValue);
var options = {
hAxis: {
title: '시간(초)'
},
vAxis: {
title: '가격(원)'
},
series: {
1: {curveType: 'function'}
}
};
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
</html>
DB
Database : MySQL / Database Name : javascript / Table Name : celltrion
![](https://k.kakaocdn.net/dn/lInTF/btqFjej3Mnz/ES5lEitXjLVrB4yeVT1AMk/img.png)
timestamp의 'Data Type'를 더블클릭하고 들어가서 default value 설정하기
![](https://blog.kakaocdn.net/dn/mHROj/btqFg4XeOYe/Vo50EdILng7vpk5aKWsrAK/img.png)
Database : MySQL / Database Name : javascript / Table Name : kakao
![](https://blog.kakaocdn.net/dn/cH5Vov/btqFhlYLgDZ/ek7u33ZecbBcc8V1zs2Ll1/img.png)
![](https://blog.kakaocdn.net/dn/mE4kb/btqFg4wcZNJ/CQiKNYaNUQ2vJQvm6LU6H1/img.png)
2개 동시에 그리기
app2.js (navertime은 코드가 길어져서 뺐음)
var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(app).listen(80);
console.log("Server is running...")
var mysql = require('mysql');
var request = require('request');
var connection = mysql.createConnection({
host: 'localhost',
port: 3308,
user:'root',
password: '1234',
database: 'javascript' // test라는 데이터베이스에 접속
});
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({limit: '50mb', extended: false}));
app.use(bodyParser.json({limit: '50mb'}));
app.get('/', function (req, res) {
res.sendfile("newMain.html");
});
app.get('/main', function (req, res) {
res.sendfile("newMain.html");
});
app.get('/getNaver', function (req, res) {
const kakao = {
url:'https://polling.finance.naver.com/api/realtime.nhn?query=SERVICE_ITEM:035720|SERVICE_RECENT_ITEM:035720',
method: 'GET'
}
const naver = {
url:'https://polling.finance.naver.com/api/realtime.nhn?query=SERVICE_ITEM:035420|SERVICE_RECENT_ITEM:035420',
method: 'GET'
}
request.get(kakao, function(err,httpResponse,body){
response = JSON.parse(httpResponse.body);
var kakaoPrice = response.result.areas[0].datas[0].nv;
// connection.query(`INSERT INTO kakao (price, navertime) VALUES('${kakaoPrice}','time');`)
connection.query(`INSERT INTO kakao (price) VALUES('${kakaoPrice}');`)
request.get(naver, function(err,httpResponse,body){
response = JSON.parse(httpResponse.body);
var naverPrice = response.result.areas[0].datas[0].nv;
// connection.query(`INSERT INTO naver (price, navertime) VALUES('${naverPrice}','time');`)
connection.query(`INSERT INTO naver (price) VALUES('${naverPrice}');`)
console.log([kakaoPrice,naverPrice]);
res.send([kakaoPrice,naverPrice]); // 배열로 보내기 때문에 문자로 바꿔서 보낼 필요가 없다.
});
});
});
newMain.html
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<span id="result"></span>
<br><br>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>
</body>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
var time=0;
var graphValue = [];
var kakaoPrice;
var naverPrice;
setInterval(function () {
$.ajax({
url : '/getNaver',
type : 'GET',
data : {
},
success : function(res) {
kakaoPrice = res[0];
naverPrice = res[1];
// graphValue.push([time,Number(kakaoPrice),Number(naverPrice)])
graphValue.push([time,kakaoPrice,naverPrice]) // 배열로 넘어와 문자로 변경하지 않았기 때문에 다시 숫자로 형변환 할 필요가 없다.
time++;
drawCurveTypes(graphValue); // 구글 차트를 그려주는 함수를 호출한다.
}
});
},1000);
google.charts.load('current', {packages: ['corechart', 'line']});
google.charts.setOnLoadCallback(drawCurveTypes);
function drawCurveTypes() {
var data = new google.visualization.DataTable();
data.addColumn('number', '시간(초)');
data.addColumn('number', '카카오');
data.addColumn('number', 'Naver');
data.addRows(graphValue);
var options = {
hAxis: {
title: '시간(초)'
},
vAxis: {
title: '가격(원)'
},
series: {
1: {curveType: 'function'}
}
};
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
</script>
</html>
DB
3. 버튼을 누르면 내부망 서버에 접속해 받아온 response로 각각의 그래프를 갱신하라.
app.js
var express = require('express');
var app = express();
var http = require('http');
var server = http.createServer(app).listen(80);
console.log("server is running...")
var mysql = require('mysql');
var request = require('request');
var connection = mysql.createConnection({
host: 'localhost',
port: 3308,
user:'root',
password: '1234',
database: 'javascript' // test라는 데이터베이스에 접속
});
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({limit: '50mb', extended: false}));
app.use(bodyParser.json({limit: '50mb'}));
// 3. 버튼을 누르면 내부망 서버에 접속해 받아온 response로 각각의 그래프를 갱신하라.
app.get('/main2', function (req, res) {
res.sendfile("main2.html");
});
app.get('/findprice', function (req, res) {
var priceUrl = req.query.priceUrl;
const options = {
url: `${priceUrl}`,
method: 'GET'
}
request.get(options, function(err,httpResponse,body){
console.log(JSON.parse(httpResponse.body));
response = JSON.parse(httpResponse.body);
res.send(response);
});
});
main2.html
<!DOCTYPE html>
<html lang="en" dir="ltr">
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<select name="cars" id="cars">
<option value="http://192.168.110.26/price1">price1</option>
<option value="http://192.168.110.26/price2">price2</option>
<option value="http://192.168.110.26/price3">price3</option>
</select>
<input type="button" value="시작" onclick="sendRequest()">
<br><br>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<div id="chart_div"></div>
</body>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
var graphValue = [];
function sendRequest() {
// $("#cars > option:nth-child(1).val()")
// console.log(`${$("#cars option:selected").val()}`);
$.ajax({
url : '/findprice',
type : 'GET',
data : {
priceUrl: `${$("#cars option:selected").val()}`
},
success : function(res) {
// 배열 초기화
graphValue = [];
// 배열에 값 담기
for(var i=0; i<res.length; i++) {
graphValue.push([Number(res[i].no),Number(res[i].price)]);
google.charts.load('current', {packages: ['corechart', 'line']});
google.charts.setOnLoadCallback(drawCurveTypes);
function drawCurveTypes() {
var data = new google.visualization.DataTable();
data.addColumn('number', '시간(초)');
data.addColumn('number', '가격');
data.addRows(graphValue);
var options = {
hAxis: {
title: '시간(초)'
},
vAxis: {
title: '가격(원)'
},
series: {
1: {curveType: 'function'}
}
};
var chart = new google.visualization.LineChart(document.getElementById('chart_div'));
chart.draw(data, options);
}
}
}
});
};
</script>
</html>
price 3에 접속할 때 받아오는 값
[{"no":1,"price":10},{"no":2,"price":9},{"no":3,"price":8},{"no":4,"price":6},{"no":5,"price":8},{"no":6,"price":8},{"no":7,"price":9},{"no":8,"price":7},{"no":9,"price":2},{"no":10,"price":8}]
'시작'버튼을 누르면 아래와 같은 그래프를 그린다.
ajax에서 success에 graphValue=[]; 로 초기화 해주는 과정이 없다면 price 1~3을 계속 req, res 할 때마다 그래프가 누적되기 때문에 반드시 초기화를 해줘야한다.
'개발자 > Javascript' 카테고리의 다른 글
Javascript (자바스크립트) Crawling, Excel Download 8.27 (0) | 2020.09.24 |
---|---|
Javascript (자바스크립트) 기말고사 07.02 (0) | 2020.07.02 |
Javascript (자바스크립트) setInterval, setTimeout 06.18 (0) | 2020.07.01 |
Javascript (자바스크립트) Query Table Join (aircraft 06.11) (0) | 2020.07.01 |
★ Javascript (자바스크립트) Request Type 분리 get, post, put, delete (newsList 06.04) (0) | 2020.06.25 |