구글맵 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/) 를 이용하면 수면상태로 전환되는 것을 방지할 수 있다.
'🚣활동 > 멋쟁이사자처럼' 카테고리의 다른 글
[멋사 12기 중앙해커톤 참여] (0) | 2024.08.09 |
---|---|
[멋쟁이사자처럼] 4주차 정기세션 (0) | 2024.03.31 |
[멋쟁이사자처럼] 3주차 정기세션 (0) | 2024.03.24 |
[멋쟁이사자처럼] 2주차 정기세션 (0) | 2024.03.14 |
[멋쟁이사자처럼] 1주차 정기세션 - 2 (0) | 2024.03.13 |