[D3.js] Data 실시간 처리
[D3.js] Data 실시간 처리
시각화 데이터를 웹페이지에 열때 기본적으로 처음 한번만 해당 데이터를 읽어와 화면에 챠트와 같은 이미지로 출력을 하게 됩니다. 한번만 html문서로 출력을 한다면 뭔가 부족해 보일 수 있습니다. 대개 html 문서 상의 데이터들은 실시간 데이터를 다루는 경우가 많습니다. D3.js에서 이러한 데이터를 실시간 처리를 하는 코딩이 필요합니다. 그래서 오늘의 내용은 D3.js 상의 데이터를 일정시간 시간단위로 데이터를 갱신하는 실험을 해보겠습니다.
1. 기본 소스
지난 시간의 p태그에 data 값을 출력하는 예제를 통해 실시간 처리를 해보도록 하죠.
<body>
<p>1</p>
<p>1/p>
<p>1</p>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script>
var data = [1,2,3,4,5];
//갱신
var p = d3.select("body").selectAll("p").data(data)
.text(function(d){return d;})
//추가
p.enter().append("p")
.text(function(d){return d;})
//종료
p.exit().remove();
</script>
</body>
[결과]
1
2
3
4
5
위와같이 html 문서가 열릴 때 처음 한번만 data 값들을 순차적으로 p태그에 출력하게 됩니다. 여기서 html 상의 데이터들이 출력한 상태에서 일정 시간 단위로 새로운 데이터로 갱신 시키는 코딩을 간단히 표현해 보겠습니다.
2. setTimeout() 함수를 통한 갱신
setTimeout(function(){호출함수(data);},1000);
다른 방법도 있지만 간단히 의미 전달로 setTimeout 함수를 사용해 보고자 합니다. setTimeout함수는 호출함수를 1초(1000) 후 호출하게 됩니다. 즉, 호출함수에 인자값을 새로운 data로 하여 호출함수를 수행하게 하면 일정 시간단위로 데이터 갱신 할 수 있게 됩니다.
위 기본소스를 간단히 수정해 볼까요.
기본 text()출력을 수행하는데 전체 코딩 부분을 render()함수로 묶어서 처리하도록 하겠습니다.
var data = [1,2,3,4,5];
function render(data){
출력문;
setTimeout(function(){render([k,12,13]);},1000);
}
render함수가 1초(1000) 단위로 호출되게 됩니다. 동작은 render함수가 호출되면 내부동작을 수행하고 마지막 SetTimeout 함수를 통해 다시 render함수가 새로운 data값으로 재호출 됩니다. 재호출 되는 시간을 1초로 하였는데 이 표현을 통해 반복 수행을 하게 되면 1초 단위로 호출되어 데이터 값이 갱신을 하게 되더군요. 정확한 표현은 아니고 생각나는데로 표현한 것입니다.
[소스]
<body>
<script src="https://d3js.org/d3.v5.min.js"></script>
<script>
var data=[1,2,3,4,5];
var k = 1;
function render(data){
var p = d3.select("body").selectAll("p").data(data)
.text(function(d){return d;})
p.enter().append("p")
.text(function(d){return d;});
p.exit().remove();
k++;
setTimeout(function(){render([k,12,13]);},100);
}
render(data);
</script>
</body>
위 소스는 0.1초 단위로 갱신이 되는데 결과 영상을 짧게 보기 위해서 갱신 시간으로 아주 짧게 만들었네요. 결과는 아래 움짤로 재편집 했습니다.
[결과]

처음 데이터 1,2,3,4,5값이 p태그에 text()함수를 통해 출력이 됩니다. 그다음 새로운 데이터 값 3개가 들어오고 기존에 5개의 p태그에서 3개의 p태그 값이 갱신되어 집니다. 여기서 나머지 2개의 값은 remove()함수를 통해 제거가 됩니다.
참고로, k변수를 새로 만들어서 k++로 표현하였는데 k값은 실시간으로 갱신되는 데이터 값을 보기 위한 표현으로 의미를 둘 필요는 없는 변수입니다. 결과를 실시간 갱신이 이루어지는지 보기 위해서 표현한 부분입니다.
마무리
위 setTimeout()함수외에도 다른 표현 방법으로 타이머함수도 있으며 몇가지 다르게 표현하는 방법들이 있었는데 간단히 실시간 데이터 갱신을 하게 된다면 이런 느낌으로 코딩을 하고 그 결과를 간단히 보기 위한 표현으로 보시면 되겠습니다.
오. 인제는 뭔가 갱신이 되는군요. ㅎㅎ
챠트가 움직이는 것들 있잖아요 애니메이션도 넣으면 재밌어요. css 부분의 d3.js 함수들이 잘 나와 있어서 표현하면 재밌을 것 같아요. v5버전으로 기초적인 부분부터 다시 공부하지만 재밌을 것 같네요.
아! 아두이노 실험하고 싶은데 못하고 있는게 아쉬움!
아.... 차트 그냥 차트만 봤는데 움직이는군요. 헐...
저도요. 아두이노 프로젝트 진행코 싶습니다.
재밌는 것은 이걸로 게임 만드는 분도 있어요.
외국 사이트였는데 간단한 게임을 구현했더군요.
와.... d3로요? 헐. 게임 만드는거는 js 다른게 뭐 있었던것 같은데. 기억이 안 나네요.
D3.js 상당히 유용한 언어네요.
d3 사이트 가시면 갤러리에 예제들을 보시면 진짜 고퀄리티 작품들이 많고 오픈소스로 되어 있어서 학습하기 최고이지요.
갤러리정도 표현하시면 써먹을 곳이 엄청 많은 것 같아요.
코딩을 배우려 서점을 찾았어요...
책을 열고 보곤 ....3초..... 덥고 나왔답니다.
아직 마음의 준비가 덜 되었나 봅니다.....
(사실 아직 뭐 부터 해야 하는지 조차 모르겠더라구요 ㅡ ㅡ:)
우선배우고자 하는 것을 인터넷 유튜브 강좌같은게 많으니깐요.
사전 학습하시고 서점가시면 돼요.
생활코딩이라는 사이트 가시면 책 필요 없이 기초 코딩 지식을 배울 수 있어요.
아직 Payout 되지 않은 관련 글
모든 기간 관련 글
인터레스팀(@interesteem)은 AI기반 관심있는 연관글을 자동으로 추천해 주는 서비스입니다.
#interesteem 태그를 달고 글을 써주세요!
이오스 계정이 없다면 마나마인에서 만든 계정생성툴을 사용해보는건 어떨까요?
https://steemit.com/kr/@virus707/2uepul
방문해주셔서감사합니다.