동적(jsp, servlet) & 정적(html, css, javascript)
둘의 시간차 존재함. 왜? 브라우저 처리 vs 톰캣 처리 후 다운로드하여 화면 출력
XMLHttpRequest, {} 클로저, ajax, fetch
$.ajax({
url:json, jsp, servlet,spring
dataType:
success:function(){
}
error:function(){
}
})
Ajax (Asynchronous JavaScript and XML):
Fetch API:
WebSockets:
Server-Sent Events (SSE):
[!quote] 비동기처리는?
비동기 처리 방식들은 사용자 경험을 향상시키고, 웹 애플리케이션에서 데이터를 보다 빠르고 효율적으로 처리할 수 있도록 도와준다.
JSP 사용시 문제가 되는것은? => 동기화 이슈!! (처리주체 다름)
정적페이지는 브라우저에서 처리하고, 돔트리를 그려 준다. 동적페이지는 익스프레션(<%=%>)의 경우, 톰캣에서 처리하고 난 뒤 결과를 다운로드하는 것이다.(따라서 소스보기에서 자바코드를 볼 수 없다.)
동적페이지 처리 > 정적페이지 처리
s코드는 앞단에서 처리,
같이 사용하는 것은 가능하지만 그 둘은 절대 동기적이지 않다?! 그럼 어떻게 해결하지? => 비동기통신 처리
https://developers.google.com/chart/interactive/docs/gallery/barchart?hl=ko#bar-styles
json 형식으로 직접 입력하여 표시
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>drawChart1</title>
<%--비동기처리--%>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<%--구글차트 라이브러리 지원--%>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
/*막대그래프 요청*/
google.charts.load('current', {'packages':['bar']});
/*막대그래프 데이터 필요 - 함수호출*/
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
/*데이터타입 배열 or json형식 사용 시 DataTable()*/
const jsonData = ([
['Year', 'Sales', 'Expenses', 'Profit'],
['2014', 1000, 400, 200],
['2015', 1170, 460, 250],
['2016', 660, 1120, 300],
['2017', 1030, 540, 350]
]);
var data = google.visualization.arrayToDataTable(jsonData);
var options = {
chart: {
title: 'Company Performance',
subtitle: 'Sales, Expenses, and Profit: 2014-2017',
},
// bars: 'horizontal' // Required for Material Bar Charts.
};
var chart = new google.charts.Bar(document.getElementById('barchart_material'));
chart.draw(data, google.charts.Bar.convertOptions(options));
}
</script>
</head>
<body>
<div id="barchart_material" style="width: 900px; height: 500px;"></div>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>drawChart2</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
google.charts.load('current', {'packages':['bar']});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
let jsonData = ([])
$.ajax({
url: './drawChartJSON.jsp',
dataType: 'json',
/*res : Array(5)*/
success: function (res) {
console.log(res);
//res에 담긴 정보 jsonData에 담기
jsonData=res;
//data 변수 초기화
var data = google.visualization.arrayToDataTable(jsonData);
//막대그래프 옵션 초기화
var chart = new google.charts.Bar(document.getElementById('barchart_material'));
var options = {
chart: {
title: 'Company Performance',
subtitle: 'Sales, Expenses, and Profit: 2014-2017',
},
// bars: 'horizontal' // Required for Material Bar Charts.
};
//DOM API 접근
chart.draw(data, google.charts.Bar.convertOptions(options));
},
error: function (jqXHR, txtStatus, errorThrow) {
console.log('error');
}
});
}
</script>
</head>
<body>
<div id="barchart_material" style="width: 900px; height: 500px;"></div>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>drawChart2</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script>
<script type="text/javascript">
google.charts.load('current', {'packages':['bar']});
google.charts.setOnLoadCallback(drawChart);
function drawChart() {
let jsonData = ([])
$.ajax({
url: './drawChart3',
dataType: 'json',
/*res : Array(5)*/
success: function (res) {
console.log(res);
//data 변수 초기화
for(let i=0;i<res.length; i++){
jsonData.push(res[i]);
}
//res에 담긴 정보 jsonData에 담기
var data = google.visualization.arrayToDataTable(jsonData);
//막대그래프 옵션 초기화
var chart = new google.charts.Bar(document.getElementById('barchart_material'));
var options = {
chart: {
title: 'Company Performance',
subtitle: 'Sales, Expenses, and Profit: 2014-2017',
},
// bars: 'horizontal' // Required for Material Bar Charts.
};
//DOM API 접근
chart.draw(data, google.charts.Bar.convertOptions(options));
},
error: function (jqXHR, txtStatus, errorThrow) {
console.log('error');
}
});
/*바뀌는 값이니까!! */
}
</script>
</head>
<body>
<div id="barchart_material" style="width: 900px; height: 500px;"></div>
</body>
</html>
비동기처리할 때, ajax의 어디로 코드를 넣어야할지 이해하기 위해 기존 라이브러리의 코드에 대한 전체적인 이해가 바탕이 되어야한다. 소스를 많이 보고, 많이 사용해봐야한다.
초보자는 body 요소의 가장 아래에 자바스크립트를 위치시키는 것은 좋은 아이디어이다. 그 이유는 아래와 같다.
HTML 요소들이 스크립트 로딩 지연으로 인해 렌더링에 지장 받는 일이 발생하지 않아 페이지 로딩 시간이 단축된다.
DOM이 완성되지 않은 상태에서 자바스크립트가 DOM을 조작한다면 에러가 발생한다.