[NODE] openAPI를 mySQL에 간단 저장하기

서수·2022년 12월 11일
4

MySQL

목록 보기
1/1

방법 소개

이 게시물은 openAPI를 MySQL에 간단하게 저장하는 방법입니다.
사실 이 방법은 대용량을 저장하는 방법에는 맞지가 않습니다. 비효율적이며
대용량의 정보를 저장하려면 이 방법이 아닌 bulk insert 를 사용하는것이 맞습니다.

이 게시물은 데이터 양이 얼마 되지 않을 때, 간단하게 사용할 수 있습니다.

GitHub

GitHub 참고

구현하는 방법

서울시 공공 openAPI 를 예로 들어보겠습니다.
서울시에 회원가입을 한 뒤 openAPI를 제공하는 페이지로 넘어가면 인증키를 받을 수 있는 곳이 있는데 이 인증키가 있어야 제대로 openAPI를 사용 할 수 있습니다.

위에 보면 일반 인증키 부분에 인증키가 나오게 됩니다.
그리고 아래에 가서 알맞은 API를 검색하고 출력을 누르면

이렇게 API 주소가 나옵니다. 경로에 sample 자리에는 인증키가 들어가며 뒤에 xml은 문서 양식인데 우리는 xml 이 아니라 json 형식으로 된 API가 필요하므로 xml 대신 json을 입력하여 주소창에 입력해줍니다. 내가 저장하려는 API는 체육 공공시설의 테니스장을 저장하려 해주므로 API를 검색하여 입력하면 인터넷 창에 이렇게 뜨게 됩니다.

이렇게 Json 형식으로 API가 나오는 것을 볼수 있습니다.
그리고 한가지 더 작업이 필요한데 postman 프로그램으로 openAPI URL을 변경해줘야 합니다.
그럼 기존 URL이
http://openapi.seoul.go.kr:8088/{발급받은인증키들어가는자리 }/json/ListPublicReservationSport/1/10/%ED%85%8C%EB%8B%88%EC%8A%A4%EC%9E%A5?serviceKey={서비스키들어가는자리}
이런 형식으로 바뀌게 됩니다.

이제 코드를 짜주면 되는데 우리는 request 라는 모듈을 사용해 줄 것입니다.

$npm install request

이렇게 request 를 깔아줍니다.

이제 파일 디렉토리 구조를 보겠습니다.

이렇게 mySQL을 연결시켜주는 config.js 와 DB에 Table을 구성해주는 migration과 model는 mySQL의 Table을 생성해주기 위한 폴더이며 openAPI를 저장해 주기 위한 코드는 app.js에 넣어주겠습니다. 저장해주는 Table의 이름은 Opens로 해주었습니다.

TABLE 에 어떤걸 저장해 줄지는 openAPI에 적혀있는 key 값들을 보고 필요한 부분을 설정해주면 됩니다.

'use strict';
const {
  Model
} = require('sequelize');
module.exports = (sequelize, DataTypes) => {
  class Opens extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  };
  Opens.init({
    opensId: {
    primaryKey: true,
    autoIncrement: true,
    type: DataTypes.INTEGER,
    },
    minclassnm: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    svcstatnm: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    svcnm: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    placenm: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    svcurl: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    x: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    y: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    areanm: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    imgurl: {
    type: DataTypes.STRING,
    allowNull: false,
    },
    createdAt: {
      allowNull: false,
      type: DataTypes.DATE,
    },
    updatedAt: {
      allowNull: false,
      type: DataTypes.DATE,
    },}, 
  {
    sequelize,
    modelName: 'Opens',
  });
  return Opens;
};

저는 저장 할 것을 이렇게 작성해 두었습니다.
다시 app.js 로 돌아가보면 request와 Opens 라는 TABLE을 불러와줍니다.

const request = require("request");  
const {Opens} = require("./models")

그리고 request 를 이용해 줄건데 request는 option에 method 와 url 등을 넣어줘 불러올 수가 있습니다.

const options = {
  method: "GET",
  url: "http://openapi.seoul.go.kr:8088/{인증키들어가는자리}/json/ListPublicReservationSport/1/10/%ED%85%8C%EB%8B%88%EC%8A%A4%EC%9E%A5?serviceKey={서비스키들어가는자리}",
  headers: {
    'Accept': 'application / json'
  },
};

위 코드는 openAPI를 GET 방식으로 불렀다는 뜻입니다.

//JSON 으로 된 openAPI 보고 적절히 변경
  request(options, async(error, response, ListPublicReservationSport) => {
  if (error) {throw new Error(error);}
  let info = JSON.parse(ListPublicReservationSport);

//DB에 넣기위한 반복문   
  for(i in info['ListPublicReservationSport']['row'] ){
    let MINCLASSNM = info['ListPublicReservationSport']['row'][i]['MINCLASSNM']
    let SVCSTATNM = info['ListPublicReservationSport']['row'][i]['SVCSTATNM']
    let SVCNM = info['ListPublicReservationSport']['row'][i]['SVCNM']
    let PLACENM = info['ListPublicReservationSport']['row'][i]['PLACENM']
    let SVCURL =info['ListPublicReservationSport']['row'][i]['SVCURL']
    let X = info['ListPublicReservationSport']['row'][i]['X']
    let Y = info['ListPublicReservationSport']['row'][i]['Y']
    let AREANM = info['ListPublicReservationSport']['row'][i]['AREANM']
    let IMGURL = info['ListPublicReservationSport']['row'][i]['IMGURL']
//DB에 저장.
    await Opens.create({minclassnm:MINCLASSNM, svcstatnm:SVCSTATNM, svcnm:SVCNM, placenm:PLACENM, svcurl:SVCURL, x:X,y:Y, areanm:AREANM, imgurl:IMGURL })
  }  
});

위 코드는 openAPI에서 정보를 나타내는 정보 key 값들을 반복문으로 돌려 mySQL에 저장시켜 준 것입니다. key 값들은 브라우저에 URL을 입력하여 아래와 같이 확인 할 수 있습니다.

이제 터미널 창에 node app.js 명령어를 입력 하면 아래와 같이 INSERT 되는 모습을 볼 수 있습니다.

그리고 DB를 확인해 보면

이렇게 잘 들어간 모습을 볼 수가 있습니다.

처음에 할 때 오류가 나거나 헷깔리는 부분이 있을 수 있기때문에 반복문을 바로 짜서 실행시키기 보다는 console.log로 먼저 잘 돌아가나 실행시켜보는 것을 추천합니다.

console.log를 돌려 먼저 실행해 보았을 때는 아래와 같은 코드로 작성이 됩니다.

  request(options, async(error, response, ListPublicReservationSport) => {
  if (error) {throw new Error(error);}
  let info = JSON.parse(ListPublicReservationSport);

//console.log를 돌려보기 위한 반복문   
  for(i in info['ListPublicReservationSport']['row'] ){
    console.log(info['ListPublicReservationSport']['row'][i]['MINCLASSNM'])
    console.log(info['ListPublicReservationSport']['row'][i]['SVCSTATNM'])
    console.log(info['ListPublicReservationSport']['row'][i]['SVCNM'])
    console.log(info['ListPublicReservationSport']['row'][i]['PLACENM'])
    console.log(info['ListPublicReservationSport']['row'][i]['SVCURL'])
    console.log(info['ListPublicReservationSport']['row'][i]['X'])
    console.log(info['ListPublicReservationSport']['row'][i]['Y'])
    console.log(info['ListPublicReservationSport']['row'][i]['AREANM'])
    console.log(info['ListPublicReservationSport']['row'][i]['IMGURL'])
    console.log("================================================")
  }  
});

이렇게 코드를 짜고 실행을 시켜보면

이렇게 터미널에 콘솔이 찍히는 것을 확인 할 수가 있습니다.

profile
패션디자인과 출신 비전공자가 개발자로 성장하려 만든 노트

0개의 댓글