주말간의 삽질과 결과물(AWS Lambda 내에서 HTTP로 JSON 데이터 불러오기)

2019. 2. 18. 09:26Programming/JavaScript

반응형

하고 싶었던 것

온라인 게임인 스마이트(SMITE)의 홈페이지에 들어가보면, 아이템 리스트를 가져오는 API로 아이템을 불러오는 걸 알 수 있었다. 이 데이터를 특정 저장소에 저장한 뒤, 한글로 번역하고 싶었다. 문제는 시즌이 계속되는 중간에도 이 데이터는 미세하게 변경된다. 물론 모든 데이터가 그런 것은 아니다. 하지만 어찌됐건 귀찮은 문제였다. 그래서 생각해낸것이 AWS의 Lambda였다. 우선 데이터를 한글로 번역해놓은 뒤, 일부 수치는 일정 기간마다 API를 통해 업데이트하면 되지 않을까.

실제로 주말간 했던 것

Node.js나 Python을 제대로 써본적이 없었다. 물론 검색해서 더듬더듬 구현하는거야 큰 문제가 되진 않겠지만, 내 코드가 아니라 그저 복사 붙여넣기에 그치지 않을까싶었다. 그나마 Node.js에서 http모듈을 통해 get을 써봤던 게 생각나서 적당적당히 구현해봤지만 에러가 발생했다.

결국에는 검색 후 복사 붙여넣기…를 하게 됐다. 검색해보니 http.get의 내부에서 처리를 잘못했기 때문에 발생하는 문제였다. 다음과 같이 코드를 수정하니 에러는 발생하지 않았지만, 결과물로 받아왔어야 할 데이터를 출력하지 않았다. 아무리해도 동작하지 않아서, 한참을 고민했다.

let https = require("https");

exports.handler = async (event, context) => {
    const req = https.get("https://cms.smitegame.com/wp-json/smite-api/getItems/1", res => {
        let body = "";

        res.on("data", chunk => (body += chunk));
        res.on("end", () => {
            let itemArray = JSON.parse(body);
            for(let i=0; i<itemArray.length; i++) {
                console.log(itemArray[i].itemIcon_URL);
            }
        })
    })

    console.log("done");
};

한 두시간 정도 머리를 싸맨뒤에야 원인을 파악했는데, 람다 내부에서 선언된 async 키워드가 문제였다. exports.handler 안에 await이 존재하지도 않고, https.get이 Promise를 반환하지도 않기 때문에 res.on(“end”)의 처리가 되기 전에 함수가 종료되는 듯 했다. 이 부분은 좀 더 테스트해보고 확인해봐야 할 듯 하다.

실제로 주말간 했던 것(실제)

아이템 리스트를 가져오는 API을 통해서 받아온 JSON데이터를 Lint로 정렬한 후에, Description_kor이라는 필드를 추가해서 직접(…) 한글로 번역했다. 구글의 번역 API를 사용할까 했었는데, 번역해야 할 내용도 많았고 번역 결과물도 썩 맘에 들지 않았다. 게임에서 쓰이는 용어들이 많았고, 공식으로 변환하지 않으면 알아보기 힘든 내용도 꽤 있었기 때문이었다.

결국 이틀간 앉아서 내리 번역만 하고 있었는데, 퀄리티가 생각보다 높지도 않은데다 코딩은 커녕 번역만 하고 있자니 머리가 아팠다. 일단 AWS를 사용하는 작업은 뒤로 미뤄두고, 이 JSON데이터를 어떻게 가져다 사용할 것인지 고민해봐야 할 듯 했다. 우선은 Kotlin도 좀 써먹을 겸, 이 JSON데이터를 출력해주는 안드로이드 앱을 만들어볼까 생각중이다.

반응형