1. 데이터 가공:JSON 데이터를 추출해 MySQL 데이터베이스에 저장하기
SQL 쿼리: n 미터 반경의 데이터 추출하는 쿼리 작성
Express API 구현: SQL 쿼리를 바탕으로 반경과 좌표에 따라 주차장 정보를 반환하는 api 완성하기
Sequelize
Sequelize는 Node.js 애플리케이션에서 사용할 수 있는 ORM으로, 코드를 통해 데이터베이스의 데이터를 객체로 조작하고 관리할 수 있게 해준다.
MySQL 클라이언트를 통해 MySQL 서버에 로그인
mysql -u [사용자 이름] -p
데이터베이스 만들기
CREATE DATABASE [데이터베이스 이름]
DB에 들어갈 데이터를 가공하기 위해
원시데이터에서 필요한 속성-값만 추출해서 가공된 데이터 json 파일을 만들어 주었다.
// utils/dataProcessor.js
const fs = require("fs");
let rawData = fs.readFileSync("../data/rawData.json");
let jsonData = JSON.parse(rawData);
let processedData = jsonData.records.map((record) => {
return {
parkingName: record.주차장명,
parkingType: record.주차장구분,
roadAddress: record.소재지도로명주소,
address: record.소재지지번주소,
feeInfo: record.요금정보,
latitude: record.위도,
longitude: record.경도,
};
});
fs.writeFileSync(
"../data/processedData.json",
JSON.stringify(processedData, null, 2)
);
터미널에서 해당 폴더에 들어가서 node [파일명].js 를 입력해 파일을 실행하면 된다.
파일이 실행되고 나면 미리 적어둔 경로에 processedData.json 이 생긴다.
config, model 파일이 필요하다.
데이터베이스 연결 설정을 관리하는 데 사용되는 객체 작성
모델을 정의하는 데 사용하기 위해 config 파일에 Sequelize 인스턴스를 생성해주었다.
require("dotenv").config(); // 환경변수 사용하기 위해 dotenv 사용
const { Sequelize } = require("sequelize");
const sequelize = new Sequelize(
"parkings",
"root",
process.env.MYSQL_PASSWORD,
{
host: "127.0.0.1",
dialect: "mysql",
}
);
module.exports = sequelize;
이제 이 Sequelize 인스턴스를 통해 DB와의 연결을 설정하고, DB 테이블과 매핑되는 모델을 정의하는 데 사용할 수 있다.
모델은 테이블의 구조를 나타낸다.
모델을 통해 데이터베이스에 쿼리를 실행하고 데이터를 조작할 수 있다.
아까 생성한 Sequelize 인스턴스를 가져와 사용한다.
const { DataTypes } = require("sequelize");
const sequelize = require("../config/config");
sequelize
.sync({ force: false })
.then(() => {
console.log("Table 생성");
})
.catch((error) => {
console.error("Error creating tables:", error);
});
const Parking = sequelize.define(
"Parking",
{
parkingName: {
type: DataTypes.STRING,
allowNull: false,
},
...
longitude: {
type: DataTypes.STRING,
allowNull: false,
},
},
{
tableName: "parkings",
timestamps: false,
}
);
module.exports = Parking;
테이블이 없는 경우 새로 만들어주기 위해 sequelize.sync()메서드를 사용했다.
sequelize.sync({ force: false }): 테이블을 생성하는 메서드
sequelize.define(): 모델명, 필드, 테이블 옵션을 정의하는 메서드 - 모델명: Parking이라는 이름의 모델을 정의
//utils/insertData.js
const fs = require("fs");
const Parking = require("../models/parking");
// 가공된 JSON 파일 읽기
fs.readFile("../data/processedData.json", "utf8", async (err, data) => {
if (err) {
console.error("Error reading file:", err);
return;
}
const parkings = JSON.parse(data);
try {
// 데이터베이스에 모든 주차장 정보 삽입
await Parking.bulkCreate(parkings);
console.log("db 삽입 완료");
} catch (error) {
console.error("Error inserting data:", error);
}
});
터미널에서 파일을 실행해주면 MySQL 데이터베이스에 저장 완성이다!