개발/출근log
Week3_02. API 사용(데이터 그리드에 담기)
우당탕카멜레온
2024. 4. 4. 12:16
1. api로 호출한 데이터를 그리드에 담는 과정에서 오류
api로 호출한 데이터를 넘겼으나
async function getCycleStaionData() {
const url = `http://openapi.seoul.go.kr:8088/${APIKey}/json/tbCycleStationInfo/1/5/`
const response = await fetch(url);
const data = await response.json();
console.log("data", data);
createGrid(data);
}
createGrid()함수에서 data를 확인해보면
[object object]로 나오면서 type오류가 발생한다.
원인)
"[objet Object]"는
JavaScript에서 일반적으로 발생하는 오류 메시지다. 이 오류는 일반적으로 코드 내에서 객체를 문자열로 변환하려고 할 때 발생한다.
해결 1 )
객체를 JSON 문자열로 변환하는 과정 필요!
JSON.stringify(storedData)
으로 JSON데이터를 문자열로 바꿔주는 코드 필요
2. api 호출과 로컬스토리지에 데이터 저장.
아래코드는 api 데이터를 불러와서 로컬스토리지에 저장하는 코드
*로컬스토리지에 대한 내용은 다음번에 자세히 공부해보겠다
async function getCycleStaionData() {
//로컬스토리지에 데이터 저장
//대여소 정보 API
const baseURL = 'http://openapi.seoul.go.kr:8088/';
const urls = [];
// URL 생성
for (let i = 0; i < 4; i++) {
const start = i * 1000 + 1;
const end = (i + 1) * 1000;
const url = `${baseURL}${APIKey}/json/tbCycleStationInfo/${start}/${end}/`;
urls.push(url);
}
// 기존에 저장된 데이터 가져오기
let storedData = localStorage.getItem('masterData');
if (storedData) {
storedData = [];
storedData = JSON.parse(storedData);
}
// 데이터 가져오기
for (const url of urls) {
const response = await fetch(url);
const data = await response.json();
storedData.push(data.stationInfo.row);
// 새로운 데이터를 누적하여 배열에 추가
//storedData = storedData.concat(data.stationInfo.row);
// 누적된 데이터를 로컬 스토리지에 저장
}
localStorage.setItem('masterData', JSON.stringify(storedData));
console.log("데이터 누적 저장 완료");
}
2. 저장된 데이터를 그리드에 담아 화면에 보여주기.
본인은 토스트 그리드를 사용했기에, 토스트 그리드에서 제공해주는 툴을 사용했다.
코드도 지저분하고 디자인도 맘에 들지 않았기 때문에 조만간 코드를 수정해서 다시 올려보겠다..!
*그리드 만드는 코드
const initGrid = () => {
// 그리드 객체
const Grid = tui.Grid;
const stationData = []; //배열 초기화
/**
* Grid 테마 커스텀
* Grid.applyTheme('striped', {...}) :
* @param {String} default : 프리셋 (기본)
* @param {String} striped : 프리셋 (줄무늬)
* @param {String} clean : 프리셋 (클린)
* - preset theme name. Available values are 'default', 'striped' and 'clean'.
* - https://nhn.github.io/tui.grid/latest/Grid#applyTheme
*/
Grid.applyTheme('defualt', {
cell: {
normal: {
border: 'black'
},
header: {
background: 'gray',
text: 'white'
},
evenRow: {
background: '#fee'
}
}
});
var toolGrid = new Grid({
el: document.getElementById('gridDiv'),
// scrollX: true,
// scrollY: true,
draggable: false,
// header: { height: 30 },
// bodyHeight: 500,
contextMenu: null,
pageOptions: {
useClient: true,
perPage: 10
},
pagination: true,
columns: [
{
header: '대여 ID',
name: 'RENT_ID',
align: "center",
width: 200,
whiteSpace: 'normal',
formatter: function (e) {
return e.value
},
},
{
header: '대여소명',
name: 'RENT_NM',
align: "center",
width: 200,
whiteSpace: 'normal',
formatter: function (e) {
return e.value
},
},
{
header: '주소1',
name: 'STA_ADD1',
align: "center",
width: 300,
whiteSpace: 'normal',
formatter: function (e) {
return e.value
},
},
{
header: '주소2',
name: 'STA_ADD2',
align: "center",
width: 200,
whiteSpace: 'normal',
formatter: function (e) {
return e.value
},
},
{
header: '거치대 수',
name: 'HOLD_NUM',
align: "center",
width: 100,
whiteSpace: 'normal',
formatter: function (e) {
return e.value
},
},
{
header: '위도',
name: 'STA_LAT',
align: "center",
width: 200,
whiteSpace: 'normal',
formatter: function (e) {
return e.value
},
},
{
header: '경도',
name: 'STA_LONG',
align: "center",
width: 200,
whiteSpace: 'normal',
formatter: function (e) {
return e.value
},
},
]
});
return {
grid: toolGrid,
data: stationData // 그리드와 함께 반환되는 데이터 배열
};
}
*그리드에 데이터 넣기
function viewGrid(data) {
var {grid, data: stationData} = initGrid();
const masterData = JSON.parse(data);
for (const innerArr of masterData) {
for (const row of innerArr) {
// stationData 배열에 객체 추가
stationData.push({
RENT_ID: row.RENT_ID,
RENT_NM: row.RENT_NM,
STA_ADD1: row.STA_ADD1,
STA_ADD2: row.STA_ADD2,
HOLD_NUM: row.HOLD_NUM,
STA_LAT: row.STA_LAT,
STA_LONG: row.STA_LONG
});
}
}
grid.resetData(stationData);
}