Chart.js
나는 npm, CDN 방식이 무슨 이유인지 계속 오류가 나서 직접 다운로드를 하였다
폴더의 다른 파일들은 필요 없고 chart.js 파일들만
resources/static 경로로 넣어준다
연결해서 사용할 파일은
chart.umd.js 다
처음 압축 파일을 다운로드 했을때 chart.js 를 사용해 보았는데
함수가 제대로 사용되지 않았고 chart.umd.js 을 사용하니 정상 동작하였다
chart.min.js 가 없어서도 당황했는데 chart.js 마저 동작하지 않아서 삽질만 엄청했다...
controller
import com.sun.management.OperatingSystemMXBean;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.lang.management.ManagementFactory;
import java.util.HashMap;
import java.util.Map;
@RestController
public class SystemData {
@GetMapping("/system/cpuData")
public Map<String, String> cpuData() throws Exception {
Map<String, String> data = new HashMap<>();
// 서버 PC 의 CPU 사용량 구하기
OperatingSystemMXBean mxBean = ManagementFactory.getPlatformMXBean(OperatingSystemMXBean.class);
String checkData = String.format("%.2f", mxBean.getSystemCpuLoad() * 100);
data.put("value", checkData);
return data;
}
}
html
<!-- Thymeleaf 적용 -->
<script th:src="@{/bootstrap/vendor/chart2/chart.umd.js}"></script>
<script th:src="@{/bootstrap/js/chart.js}"></script>
<!-- Thymeleaf 미적용 -->
<script src="/bootstrap/vendor/chart2/chart.umd.js"></script>
<script src="/bootstrap/js/chart.js"></script>
<!-- Donut Chart -->
<div class="col-xl-4 col-lg-5">
<div class="card shadow mb-4">
<!-- Card Header - Dropdown -->
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold text-primary">CPU 사용량</h6>
</div>
<!-- Card Body -->
<div class="card-body">
<div class="chart-pie pt-4">
<canvas id="myChart"></canvas>
</div>
</div>
</div>
</div>
script 는 본인의 경로에 맞추면 되고
현재 Bootstrap 사용으로 인해 class에 명시된 값이 많은데
우리가 필요한 것은 <div> <canvas id="myChart"></canvas> </div> 다
<script th:src="@{/bootstrap/js/chart.js}"></script> 의
chart.js 는 다운로드한 js가 아니다
html 파일명을 chart.html 로 명하였고 js 파일도 chart.js 로 명한 것임으로 착각하면 안 된다
js
$(document).ready(function() {
// 그리려고 하는 차트 canvas ID
let ctx = $("#myChart");
// 반도넛 중앙에 데이터 값 넣기
const centerTextPlugin = {
id: 'centerText',
beforeDraw: function(chart) {
let width = chart.width,
height = chart.height,
ctx = chart.ctx;
// 상태 복원
ctx.restore();
let fontSize = (height / 114).toFixed(2);
ctx.font = fontSize + "em sans-serif";
ctx.fillStyle = 'rgba(255, 99, 132, 0.5)';
ctx.textBaseline = "middle";
let text = chart.data.datasets[0].data[0] + "%",
textX = Math.round((width - ctx.measureText(text).width) / 2),
textY = (height / 2) + 100;
ctx.fillText(text, textX, textY);
// 상태 저장
ctx.save();
}
};
// 전역에 플러그인을 등록시킬때 사용
Chart.register(centerTextPlugin);
let data = {
datasets: [{
data: [0, 100],
backgroundColor: [
'rgba(255, 99, 132, 0.5)',
'rgba(54, 162, 235, 0.5)'
],
borderWidth: 1
}],
labels: [
'사용량',
'여유량'
]
};
let options = {
responsive: true, // 반응형 , 캔버스 크기 조절
maintainAspectRatio: false, // 크기 조절될때 원본 캔버스 방향 비율 유지
cutout: '60%', // 차트의 중앙 부분을 비우도록 설정
rotation: -90, // 차트를 반시계 방향으로 180도 회전
circumference: 180, // 반도넛 형태를 만들기 위해 차트의 원둘레를 180도로 설정
// rotation: 1 * Math.PI, // 차트를 반시계 방향으로 180도 회전 - 구버전에서 사용
// circumference: 1 * Math.PI, // 반도넛 형태를 만들기 위해 차트의 원둘레를 180도로 설정 - 구버전에서 사용
animation: {
duration: 1000 // 애니메이션 속도 1000 = 1초
},
plugins: {
legend: {display: true} // 범례 사용 여부
}
};
let myChart = new Chart(ctx,{
type: 'doughnut',
data: data,
options: options,
plugins: [centerTextPlugin] // 직접 추가해서 동작시킬수도 있다
});
setInterval(function (){
// ajax 처럼 javascript 비동기 통신 방법
// get 이 default
fetch('/system/cpuData')
.then(response => response.json()) // 서버 요청에 대한 응답이 왔을때 실행된다
.then(data => { // 실행된 응답에 대한 데이터
myChart.data.datasets[0].data[0] = Number(data.value);
myChart.data.datasets[0].data[1] = 100 - Number(data.value);
myChart.update();
});
}, 5000); //5초마다 실행
});
TEST
'개발 > Spring' 카테고리의 다른 글
[SpringBoot] Chart.js 를 이용하여 실시간 바 차트 구현하기 (0) | 2024.07.17 |
---|---|
[SpringBoot] Chart.js 를 이용하여 실시간 라인 차트 구현하기 (0) | 2024.07.17 |
[SpringBoot] Summernote Editor(게시판 글 수정하기) 적용하기 - 3 (0) | 2024.07.15 |
[SpringBoot] Summernote Editor(게시판 글 상세보기) 적용하기 - 2 (0) | 2024.07.15 |
[SpringBoot] Summernote Editor(이미지,동영상 삽입) 적용하기 -1 (0) | 2024.07.11 |
댓글