🚣활동/멋쟁이사자처럼

구글맵 API 이용하기, Heroku로 배포하기

말동말동현 2024. 8. 19. 23:47

구글맵 API 이용하기

 

프로젝트에서 내 위치 기준 주변 피부과 찾는 방법에 대해 알아보았다.

 

그 중 프로젝트에서 이용한건 프론트엔드에서 구글맵 키워드를 이용하여 사용하였지만, 백엔드에서도 구글 맵을 통해 사용자의 현재 위치 주변의 피부과 병원을 검색하고 결과를 뷰에 전달하여 렌더링하는 방법을 알아보자.

 

@Controller
public class DermatologistController {

    @Value("${google.api.key}")
    private String apiKey;

 

@Value 어노테이션을 사용하여 application.properties 파일에서 Google API 키를 주입

    @GetMapping("/findDermatologists")
    public String findDermatologists(Model model) {
        double latitude = 37.5665;  // 예: 서울 시청
        double longitude = 126.9780;  // 예: 서울 시청
        int radius = 1000;  // 1km 반경

 

findDermatologists 메서드는 /findDermatologists 경로에 대한 요청을 처리

        String[] keywords = {"dermatology", "plasonic"};
        JSONArray combinedResults = new JSONArray();

 

keywords 배열에 검색할 키워드를 저장

combinedResults 배열에 모든 검색 결과를 저장

        for (String keyword : keywords) {
            String url = String.format(
                    "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=%s,%s&radius=%d&keyword=%s&key=%s",
                    latitude, longitude, radius, keyword, apiKey);

            RestTemplate restTemplate = new RestTemplate();
            ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);

            JSONObject responseObject = new JSONObject(response.getBody());
            JSONArray results = responseObject.getJSONArray("results");

            for (int i = 0; i < results.length(); i++) {
                combinedResults.put(results.getJSONObject(i));
            }
        }

 

for 루프를 통해 각 키워드에 대해 Google Places API 요청을 보냄 RestTemplate을 사용하여 API 요청을 보내고 응답을 받음.

        model.addAttribute("results", combinedResults);
        return "dermatologists";
    }
}

 

 

전체 코드

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.client.RestTemplate;
import org.json.JSONArray;
import org.json.JSONObject;

@Controller
public class DermatologistController {

    @Value("${google.api.key}")
    private String apiKey;

    @GetMapping("/findDermatologists")
    public String findDermatologists(Model model) {
        double latitude = 37.5665;  // 예: 서울 시청
        double longitude = 126.9780;  // 예: 서울 시청
        int radius = 1000;  // 1km 반경

        String[] keywords = {"dermatology", "plasonic"};
        JSONArray combinedResults = new JSONArray();

        for (String keyword : keywords) {
            String url = String.format(
                    "https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=%s,%s&radius=%d&keyword=%s&key=%s",
                    latitude, longitude, radius, keyword, apiKey);

            RestTemplate restTemplate = new RestTemplate();
            ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);

            JSONObject responseObject = new JSONObject(response.getBody());
            JSONArray results = responseObject.getJSONArray("results");

            for (int i = 0; i < results.length(); i++) {
                combinedResults.put(results.getJSONObject(i));
            }
        }

        model.addAttribute("results", combinedResults);
        return "dermatologists";
    }
}

 

 

 

또한 만든 프로젝트를 Heroku로 이용하여 배포하는 법을 알아보자.

 

Heroku

Heroku는 Java, Node.js, Python등 여러 언어를 지원하는 클라우드 Paas로, 해보기 전엔 어려울 것 같아 겁먹었지만 생각보다 간단한 작업이었다.

 

 

※ Paas란?


서비스형 플랫폼(Platform as a Service, PaaS)은 클라우드 컴퓨팅 서비스 분류 중 하나다. 일반적으로 앱을 개발하거나 구현할 때, 관련 인프라를 만들고 유지보수하는 복잡함 없이 애플리케이션을 개발, 실행, 관리할 수 있게 하는 플랫폼을 제공한다. SaaS의 개념을 개발 플랫폼에도 확장한 방식으로, 개발을 위한 플랫폼을 구축할 필요 없이, 필요한 개발 요소를 웹에서 쉽게 빌려쓸 수 있게 하는 모델이다.

 

 

 

Heroku로 배포하기

1. Heroku 가입 및 로그인  (https://id.heroku.com/login)

 

 

 

이메일 인증하고 비밀번호를 설정한다.

 

2. Create a new app으로 배포를 하게 될 새로운 앱을 만들어준다.

 

 

3. App name 및 region을 지정한다. 

 

4. Heroku CLI를 설치한다. 

 

설치 후 커맨드창에서 heroku --version 명령어를 통해 정상적으로 설치되었는지 확인한다.

 

 

5. 커맨드 창에서 heroku login 명령어를 통해 로그인 한다.

 

6. 커맨드창에서 배포 할 프로젝트가 위치한 경로로 이동후, git repository 생성 및 원격 연결을 한다.

$ cd my-project/
$ git init
$ heroku git:remote -a <app-name>

 

 

7. git 사용법과 동일하게 프로젝트 add -> commit -> push 한다.

$ git add .
$ git commit -am "first commit"
$ git push heroku master -> 이 명령어에서 에러가 발생한다면 git push heroku HEAD:master로

 

 

Heroku는 한 계정당 5개의 앱을 무료로 호스팅 할 수 있다.

하지만 무료인 만큼 치명적인 단점이 있는데, 해당 도메인에 몇 시간 동안 접속 요청이 없는 경우에는 앱이 수면 상태로 전환되어, 초기 접속이 느려진다.

또한, 무료버전은 500MB밖에 이용할 수 없어서 프로젝트의 크기가 크면 에러가 나므로 추가 결제를 통해 배포할 수 있다.

 

그래서 수면 상태로 전환되는 것을 방지하기 위해 계속 request를 해주는 방법이 있다. => 감사하게도 요청을 일정 시간 단위로 보내주는 사이트가 있어서 (https://kaffeine.herokuapp.com/) 를 이용하면 수면상태로 전환되는 것을 방지할 수 있다.