์ฐจํธ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ๊ณตํ์ฌ API ์๋ต ์๋ ์ต์ ํ
์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ๊ณต (Preprocessing)
โ ์ฐจํธ์ ํ์ํ ๋ฐ์ดํฐ๋ง ์ถ์ถํด์ API ์๋ต์ ์ต์ํ
โ ๋ณต์กํ SQL ์ฟผ๋ฆฌ๊ฐ ์๋๋ผ, ์ฌ์ ์ฐ์ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑ(Cache) ๋๋ ๋ฏธ๋ฆฌ ์ ์ฅ
์์: ์ผ๋ฐ์ ์ธ ๋ฐฉ์ (๋นํจ์จ์ ์ธ ๋ฐฉ์)
SELECT * FROM climate_data WHERE year BETWEEN 1990 AND 2023;
- ์์ฒญ์ด ๋ค์ด์ฌ ๋๋ง๋ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ → ์๋ ๋๋ฆผ
์ต์ ํ๋ ๋ฐฉ์ (Preprocessing + ์บ์ฑ)
- ์๋ฒ์์ ๋ฏธ๋ฆฌ ์ฐ์ฐ๋ ๋ฐ์ดํฐ๋ฅผ JSON ํํ๋ก ์ ์ฅํ๊ณ API ์์ฒญ ์ ๋น ๋ฅด๊ฒ ์๋ต
{
"year": [1990, 2000, 2010, 2020],
"temperature": [15.2, 15.5, 15.8, 16.2]
}
์ฆ, ๋ฐ์ดํฐ๋ฅผ API ์์ฒญ ์๋ง๋ค ์ฒ๋ฆฌํ์ง ์๊ณ , ๋ฏธ๋ฆฌ ๊ฐ๊ณตํ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์ ๊ณต!
ํ๋ก ํธ์๋์์ ๋น๋๊ธฐ ๋ฐ์ดํฐ ๋ก๋ฉ (Lazy Loading)
์ฐจํธ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ๋ก๋
โ fetch() ๋๋ Axios๋ฅผ ์ด์ฉํด API ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ ์์ฒญ (AJAX)์ผ๋ก ๊ฐ์ ธ์ด
โ ํ์ด์ง๊ฐ ๋จผ์ ๋ก๋๋ ํ, ์ฐจํธ ๋ฐ์ดํฐ๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋ถ๋ฌ์์ ํ์
์์ ์ฝ๋ (JavaScript + Chart.js)
fetch("")
.then(response => response.json())
.then(data => {
let ctx = document.getElementById("chart").getContext("2d");
new Chart(ctx, {
type: "line",
data: {
labels: data.year,
datasets: [{
label: "Temperature",
data: data.temperature
}]
}
});
});
ํ์ด์ง ๋ก๋ฉ์ ๋ง์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ์ฐจํธ๋ฅผ ๋น ๋ฅด๊ฒ ๋ ๋๋ง!
3. ํด๋ผ์ด์ธํธ์์ ๋ฐ์ดํฐ๋ฅผ ์บ์ฑํ์ฌ ์ค๋ณต ์์ฒญ ์ต์ํ
โ ๋ธ๋ผ์ฐ์ localStorage ๋๋ sessionStorage๋ฅผ ํ์ฉํ์ฌ ๊ฐ์ ๋ฐ์ดํฐ ์์ฒญ์ ๋ฐฉ์ง
โ IndexedDB ๋๋ Service Worker๋ฅผ ํ์ฉํ์ฌ ์ฐจํธ ๋ฐ์ดํฐ ์บ์ฑ ๊ฐ๋ฅ
์์: ๋ฐ์ดํฐ ์บ์ฑ ํ์ฉ (localStorage)
let cachedData = localStorage.getItem("chartData");
if (cachedData) {
renderChart(JSON.parse(cachedData));
} else {
fetch("")
.then(response => response.json())
.then(data => {
localStorage.setItem("chartData", JSON.stringify(data));
renderChart(data);
});
}
๋์ผํ ์ฐจํธ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์์ฒญํ์ง ์๊ณ , ๋ธ๋ผ์ฐ์ ์์ ์บ์ฑํ์ฌ ๋น ๋ฅด๊ฒ ๋ ๋๋ง!
4. ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ต์ ํ (WebGL ๊ธฐ๋ฐ)
Highcharts, Chart.js, D3.js ๊ฐ์ ์ต์ ํ๋ ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ
โ WebGL์ ํ์ฉํ๋ ECharts, Plotly.js ๊ฐ์ ๊ณ ์ฑ๋ฅ ์ฐจํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋๋ง ์๋๊ฐ ํฅ์๋จ
โ requestAnimationFrame()์ ํ์ฉํด ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์
ํจ๊ณผ ์ ์ฉ
์์: ECharts (WebGL ๊ธฐ๋ฐ์ผ๋ก ๋น ๋ฅธ ์ฐจํธ ๋ ๋๋ง ๊ฐ๋ฅ)
var chart = echarts.init(document.getElementById("chart"));
chart.setOption({
xAxis: { type: "category", data: ["1990", "2000", "2010", "2020"] },
yAxis: { type: "value" },
series: [{ data: [15.2, 15.5, 15.8, 16.2], type: "line" }]
});
Canvas/WebGL์ ํ์ฉํ๋ฉด ๋ณต์กํ SVG ๊ธฐ๋ฐ ์ฐจํธ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ฒ ๋ ๋๋ง ๊ฐ๋ฅ!
5. ์๋ฒ ์ฑ๋ฅ ์ต์ ํ (CDN ๋ฐ API ์๋ ๊ฐ์ )
โ API ์๋ต ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด CDN(Content Delivery Network) ์ฌ์ฉ
โ RESTful API ๋์ GraphQL์ ์ฌ์ฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ง ์์ฒญํ์ฌ ํธ๋ํฝ ์ ๊ฐ
์์: GraphQL API๋ฅผ ์ฌ์ฉํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
query {
climateData(years: [1990, 2000, 2010, 2020]) {
year
temperature
}
}
ํ์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค์ง ์์ผ๋ฏ๋ก API ์๋ต ์๋ ํฅ์!
๊ฒฐ๋ก
| ์ต์ ํ ๊ธฐ๋ฒ | ์ค๋ช |
| ๋ฏธ๋ฆฌ ๊ณ์ฐ๋ ๋ฐ์ดํฐ ์ฌ์ฉ (Preprocessing) | API ํธ์ถ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ฏธ๋ฆฌ ๊ฐ๊ณต |
| ๋น๋๊ธฐ ๋ฐ์ดํฐ ๋ก๋ฉ (Lazy Loading) | ์ฐจํธ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ๋ก ๋ถ๋ฌ์ ํ์ด์ง ๋ก๋ฉ ์๋ ์ต์ ํ |
| ๋ธ๋ผ์ฐ์ ์บ์ฑ (localStorage, IndexedDB) | ๋์ผํ ๋ฐ์ดํฐ ์์ฒญ์ ๋ฐฉ์งํ์ฌ ๋น ๋ฅด๊ฒ ํ์ |
| WebGL ๊ธฐ๋ฐ ์ฐจํธ (ECharts, Plotly.js) | ๋น ๋ฅธ ๋ ๋๋ง์ ์ํด WebGL์ ํ์ฉ |
| CDN ๋ฐ API ์ต์ ํ (GraphQL, RESTful API ๊ฐ์ ) | ์๋ฒ ๋ถํ๋ฅผ ์ค์ด๊ณ API ์๋ต ์๋๋ฅผ ํฅ์ |
์๋ฒ & ํ๋ก ํธ์๋ & ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ต์ ํ๊ฐ ์กฐํฉ๋์ด ๋น ๋ฅธ ์๋๋ฅผ ์ ์งํ๋ ๊ฒ
'๐๏ธ ๋ฐฑ์๋ > ๐Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| # JSP - iframe ์ธ๋ถ(๋ถ๋ชจ)์ ๋ณ์ ๋๊ธฐ๊ธฐ (0) | 2025.03.25 |
|---|---|
| # @ConfigurationPropertiesScan, @ConfigurationProperties (0) | 2025.03.06 |
| # Spring - MyBatis ๊ตฌ์กฐ (0) | 2025.02.17 |
| # FileInputStream - ํ์ผ ๋ค์ด๋ก๋ ์ฒ๋ฆฌ (0) | 2025.02.17 |
| # MultipartFile - ๋ค์ค ํ์ผ์ฒจ๋ถ (0) | 2025.02.13 |