Repository: prgrms-be-devcourse/NBE5-6-2-Team03
Pull request #8: feature: place 기초 데이터 받기 구현
Author: login: NoviceWyatt19
Created: 2025-05-13T04:08:58Z | Merged: 2025-05-13T08:19:07Z

<!--
  템플릿은 아직 PR 작성이 익숙하지 않으신 분들을 위해서 제공하는 가이드입니다!
  리뷰어 또는 이 PR을 보게 될 다른 사람들이 이 PR을 보는데 참고할 수 있는 내용이 있다면 포함해서 작성해주시면 됩니다.
-->

## 📌 과제 설명 <!-- 어떤 걸 만들었는지 대략적으로 설명해주세요 -->
google places api를 통한 기초 데이터(place 테이블) 준비

## 👩‍💻 요구 사항과 구현 내용 <!-- 기능을 Commit 별로 잘개 쪼개고, Commit 별로 설명해주세요 -->
현재 global.placeinitializer의 PlaceDataInitializer를 보시면 한글 확인을 어제 배운 정규식으로 하고 있는데 한글자라도 보는게 많으니 성능에 영향이 가지 않을까 하는 우려가 있습니다.
일단은 이게 중요한게 아니니 그냥 빠르게 구현하고 넘기고 싶은데 좋은 방법이 있거나 코드상에 피드백주실 내용있으시다면 해주십쇼!
![Screenshot 2025-05-13 at 12 55 20 PM](https://github.com/user-attachments/assets/ce3776ba-0b14-4ad7-9ec3-ca06fa897ddb)


## ✅ 피드백 반영사항  <!-- 지난 코드리뷰에서 고친 사항을 적어주세요. 재PR 시에만 사용해 주세요! (재PR 아닌 경우 삭제) -->

## ✅ PR 포인트 & 궁금한 점 <!-- 리뷰어 분들이 집중적으로 보셨으면 하는 내용을 적어주세요 -->



Diff:
diff --git a/build.gradle b/build.gradle
index 51c9c6e..ddff372 100644
--- a/build.gradle
+++ b/build.gradle
@@ -30,6 +30,8 @@ dependencies {
 	implementation 'org.springframework.boot:spring-boot-starter-validation'
 	implementation 'org.springframework.boot:spring-boot-starter-web'
 	implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6'
+	implementation 'com.google.api-client:google-api-client:1.33.2'
+	implementation 'com.google.maps:google-maps-services:0.18.1'
 	compileOnly 'org.projectlombok:lombok'
 	runtimeOnly 'com.mysql:mysql-connector-j'
 	annotationProcessor 'org.projectlombok:lombok'
diff --git a/src/main/java/grepp/NBE5_6_2_Team03/api/controller/admin/place/dto/CityResponse.java b/src/main/java/grepp/NBE5_6_2_Team03/api/controller/admin/place/dto/CityResponse.java
new file mode 100644
index 0000000..cc46173
--- /dev/null
+++ b/src/main/java/grepp/NBE5_6_2_Team03/api/controller/admin/place/dto/CityResponse.java
@@ -0,0 +1,37 @@
+package grepp.NBE5_6_2_Team03.api.controller.admin.place.dto;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import java.util.List;
+import java.util.stream.Collectors;
+import lombok.Getter;
+
+@Getter
+public class CityResponse {
+    private String city;
+    private Double latitude;
+    private Double longitude;
+    private int radius;
+
+    public CityResponse(String city, Double latitude, Double longitude, int radius) {
+        this.city = city;
+        this.latitude = latitude;
+        this.longitude = longitude;
+        this.radius = radius;
+    }
+
+    public static CityResponse from(City city) {
+        return new CityResponse(
+            city.getCityName(),
+            city.getLatitude(),
+            city.getLongitude(),
+            city.getCityRange()
+        );
+    }
+
+    public static List<CityResponse> fromList(List<City> cities) {
+        return cities.stream()
+            .map(CityResponse::from)
+            .collect(Collectors.toList());
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/grepp/NBE5_6_2_Team03/api/controller/googleplace/GooglePlace.java b/src/main/java/grepp/NBE5_6_2_Team03/api/controller/googleplace/GooglePlace.java
deleted file mode 100644
index 1a328af..0000000
--- a/src/main/java/grepp/NBE5_6_2_Team03/api/controller/googleplace/GooglePlace.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package grepp.NBE5_6_2_Team03.api.controller.googleplace;
-
-public class GooglePlace {
-
-}
diff --git a/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/CityService.java b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/CityService.java
new file mode 100644
index 0000000..b9104b8
--- /dev/null
+++ b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/CityService.java
@@ -0,0 +1,31 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityResponse;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.CityRepository;
+import java.util.List;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class CityService {
+    private final CityRepository cityRepository;
+
+    public City getCityEntity(String cityName) {
+        return cityRepository.findByCityName(cityName)
+            .orElseThrow(() -> new IllegalArgumentException("City not found"));
+    }
+
+    public CityResponse getCityResponse(String cityName) {
+        City city = getCityEntity(cityName);
+        return CityResponse.from(city);
+    }
+
+    public List<CityResponse> getAllCities() {
+        List<City> cities = cityRepository.findAll();
+        return CityResponse.fromList(cities);
+    }
+
+
+}
diff --git a/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/GooglePlaceService.java b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/GooglePlaceService.java
new file mode 100644
index 0000000..04d7692
--- /dev/null
+++ b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/GooglePlaceService.java
@@ -0,0 +1,176 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.PlaceRepository;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+@Service
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class GooglePlaceService {
+    private static final int MAX_REQUEST = 3;
+    private final PlaceRepository placeRepository;
+
+    @Value("${google.maps.api.key}")
+    private String apiKey;
+
+    private final RestTemplate restTemplate;
+    private final List<String> fields = List.of("name", "geometry/location",
+    "address_components", "formatted_address", "photos");
+
+    public List<String> searchPlaceIds(double lat, double lng, int radius, String type, int maxPageRequests
+    ) {
+        List<String> placeIds = new ArrayList<>();
+        String nextPageToken = null;
+        int attempt = 0;
+        int limit = Math.min(maxPageRequests, MAX_REQUEST);
+
+         do {
+            URI uri = getDetailsUriWithNextPageToken(lat, lng, radius, type, nextPageToken);
+
+            JsonNode root = restTemplate.getForObject(uri, JsonNode.class);
+            JsonNode results = root.path("results");
+
+            extractPlaceId(results, placeIds);
+
+            nextPageToken = root.path("next_page_token").asText(null);
+            attempt++;
+
+            // next_page_token 를 포함한 요청은 2-5초후 요청해야 INVALID Request 가 안뜸
+            if (nextPageToken != null) {
+                waitUntilToValidToken();
+            }
+        } while ( hasNextPage(nextPageToken) && attempt < limit);
+
+        return placeIds;
+    }
+
+    private boolean hasNextPage(String nextPageToken) {
+        return nextPageToken != null;
+    }
+
+    private void waitUntilToValidToken() {
+        try {
+            Thread.sleep(3000);
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+        }
+    }
+
+    /**
+     * 구글 주변 검색 결과 중 placeId만 추출
+     */
+    private static void extractPlaceId(JsonNode results, List<String> placeIds) {
+        if (results.isArray()) {
+            for (JsonNode result : results) {
+                String status = result.path("business_status").asText();
+                if ("OPERATIONAL".equals(status)) {
+                    String placeId = result.path("place_id").asText();
+                    placeIds.add(placeId);
+                }
+            }
+        }
+    }
+
+    public Map<String, Place> getDetailsByPlaceIds(Set<String> placeIds) {
+        Map<String, Place> resultMap = new HashMap<>();
+
+        for (String id : placeIds) {
+            Place place = getDetailsByPlaceId(id);
+            place.setPlaceId(id);
+            resultMap.put(id, place);
+        }
+
+        return resultMap;
+    }
+
+    public Place getDetailsByPlaceId(String placeId) {
+
+        String fieldsString = String.join(",", fields);
+        URI uri = getDetailsUri(placeId);
+
+        JsonNode root = restTemplate.getForObject(uri, JsonNode.class);
+        JsonNode result = root.path("result");
+
+        String name = result.path("name").asText();
+        JsonNode geometry = result.path("geometry").path("location");
+        double lat = geometry.path("lat").asDouble();
+        double lng = geometry.path("lng").asDouble();
+        String address = result.path("formatted_address").asText();
+        String country = null;
+        String city = null;
+
+        // address_components 에서 원하는 속성만을 추출
+        for (JsonNode component : result.path("address_components")) {
+            List<String> typeList = new ArrayList<>();
+            for (JsonNode typeNode : component.path("types")) {
+                typeList.add(typeNode.asText());
+            }
+
+            if (typeList.contains("country")) {
+                country = component.path("long_name").asText();
+            }
+
+            if (typeList.contains("administrative_area_level_1")) {
+                city = component.path("long_name").asText();
+            }
+        }
+
+        return new Place(country, city, name, address, lat, lng);
+    }
+
+    private URI getDetailsUri(String placeId) {
+        URI uri = UriComponentsBuilder
+            .fromHttpUrl("https://maps.googleapis.com/maps/api/place/details/json")
+            .queryParam("place_id", placeId)
+            .queryParam("language", "ko")
+            .queryParam("key", apiKey)
+            .build()
+            .encode()
+            .toUri();
+        return uri;
+    }
+
+    private URI getDetailsUriWithNextPageToken(double lat, double lng, int radius, String type, String nextPageToken) {
+        URI uri = UriComponentsBuilder
+            .fromHttpUrl("https://maps.googleapis.com/maps/api/place/nearbysearch/json")
+            .queryParam("location", lat + "," + lng)
+            .queryParam("radius", radius)
+            .queryParam("type", type)
+            .queryParam("key", apiKey)
+            .queryParamIfPresent("pagetoken", nextPageToken == null ? java.util.Optional.empty() : java.util.Optional.of(
+                nextPageToken))
+            .build()
+            .encode()
+            .toUri();
+        return uri;
+    }
+
+    @Transactional
+    public void saveAll(Collection<Place> values) {
+        placeRepository.saveAll(values);
+    }
+
+    @Transactional
+    public void save(Place place) {
+        placeRepository.save(place);
+    }
+
+    public boolean isDataInitialized() {
+        return placeRepository.count() > 0;
+    }
+
+}
\ No newline at end of file
diff --git a/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/City.java b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/City.java
new file mode 100644
index 0000000..c00156f
--- /dev/null
+++ b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/City.java
@@ -0,0 +1,24 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import lombok.Getter;
+
+@Getter
+@Entity
+@Table(name = "city")
+public class City {
+    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private int id;
+    @Column(name = "city_name") // DDL auto 설정 시 없어도 됨
+    private String cityName;
+    private Double latitude;
+    private Double longitude;
+    @Column(name = "city_range")
+    private int cityRange;
+
+}
diff --git a/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/Place.java b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/Place.java
new file mode 100644
index 0000000..9e352eb
--- /dev/null
+++ b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/Place.java
@@ -0,0 +1,39 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Entity
+@Table(name = "place")
+@Getter 
+@NoArgsConstructor
+public class Place {
+
+    @Id
+    private String placeId;
+    private String country;
+    private String city;
+    private String placeName;
+    private Double latitude;
+    private Double longitude;
+
+
+    public Place(String country, String city, String placeName, String address, Double latitude, Double longitude) {
+        this.country = country;
+        this.city = city;
+        this.placeName = placeName;
+        this.latitude = latitude;
+        this.longitude = longitude;
+    }
+    
+    public void setPlaceId(String placeId) {
+        this.placeId = placeId;
+    }
+    public void setCity(String city) {
+        this.city = city;
+    }
+
+}
diff --git a/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/repository/CityRepository.java b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/repository/CityRepository.java
new file mode 100644
index 0000000..454c58f
--- /dev/null
+++ b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/repository/CityRepository.java
@@ -0,0 +1,14 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.repository;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import java.util.Optional;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+public interface CityRepository extends JpaRepository<City, Long> {
+
+    @Query("SELECT c FROM City c WHERE c.cityName = :cityName")
+    Optional<City> findByCityName(@Param("cityName") String cityName);
+
+}
diff --git a/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/repository/PlaceRepository.java b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/repository/PlaceRepository.java
new file mode 100644
index 0000000..c057b87
--- /dev/null
+++ b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/repository/PlaceRepository.java
@@ -0,0 +1,8 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.repository;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface PlaceRepository extends JpaRepository<Place, Long> {
+
+}
diff --git a/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/util/TranslationService.java b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/util/TranslationService.java
new file mode 100644
index 0000000..4c0cd44
--- /dev/null
+++ b/src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/util/TranslationService.java
@@ -0,0 +1,28 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.util;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import jakarta.annotation.PostConstruct;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Map;
+import org.springframework.stereotype.Component;
+
+@Component
+public class TranslationService {
+
+    private Map<String, String> translations;
+
+    @PostConstruct
+    public void init() throws IOException {
+        ObjectMapper objectMapper = new ObjectMapper();
+        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("translate.json");
+        if (inputStream != null) {
+            translations = objectMapper.readValue(inputStream, Map.class);
+        }
+    }
+
+    public String getTranslatedName(String originName) {
+        return translations.getOrDefault(originName, originName);  // 없으면 원본 그대로 반환
+    }
+}
diff --git a/src/main/java/grepp/NBE5_6_2_Team03/global/config/RestTemplateConfig.java b/src/main/java/grepp/NBE5_6_2_Team03/global/config/RestTemplateConfig.java
new file mode 100644
index 0000000..3d81eb9
--- /dev/null
+++ b/src/main/java/grepp/NBE5_6_2_Team03/global/config/RestTemplateConfig.java
@@ -0,0 +1,14 @@
+package grepp.NBE5_6_2_Team03.global.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class RestTemplateConfig {
+    @Bean
+    public RestTemplate restTemplate() {
+        return new RestTemplate();
+    }
+
+}
diff --git a/src/main/java/grepp/NBE5_6_2_Team03/global/placeinitializer/PlaceDataInitializer.java b/src/main/java/grepp/NBE5_6_2_Team03/global/placeinitializer/PlaceDataInitializer.java
new file mode 100644
index 0000000..08e37c0
--- /dev/null
+++ b/src/main/java/grepp/NBE5_6_2_Team03/global/placeinitializer/PlaceDataInitializer.java
@@ -0,0 +1,60 @@
+package grepp.NBE5_6_2_Team03.global.placeinitializer;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityResponse;
+import grepp.NBE5_6_2_Team03.domain.admin.place.CityService;
+import grepp.NBE5_6_2_Team03.domain.admin.place.GooglePlaceService;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.util.TranslationService;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class PlaceDataInitializer implements CommandLineRunner {
+
+    private final GooglePlaceService googlePlaceService;
+    private final CityService cityService;
+    private final TranslationService translationService;
+
+
+    @Value("${app.data-initialized}")
+    private boolean dataInitialized;
+
+    @Override
+    public void run(String[] args) {
+
+        boolean isDataInitialized = googlePlaceService.isDataInitialized();
+        if (isDataInitialized) {
+            return;
+        }
+
+        List<CityResponse> cities = cityService.getAllCities(); // 모든 도시 조회
+
+        for (CityResponse cityResponse : cities) {
+            Set<String> placeIds = new HashSet<>();
+            placeIds.addAll(googlePlaceService.searchPlaceIds(cityResponse.getLatitude(), cityResponse.getLongitude(), cityResponse.getRadius(), "tourist_attraction", 3));
+            placeIds.addAll(googlePlaceService.searchPlaceIds(cityResponse.getLatitude(), cityResponse.getLongitude(), cityResponse.getRadius(), "point_of_interest", 3));
+
+            Map<String, Place> details = googlePlaceService.getDetailsByPlaceIds(placeIds);
+
+            // Place 객체에 placeId 설정 후 DB에 저장
+            for (Place place : details.values()) {
+                // 번역된 도시 이름 설정
+                String translatedCityName = translationService.getTranslatedName(place.getCity());
+                place.setPlaceId(place.getPlaceId());
+                place.setCity(translatedCityName);
+                String placeName = place.getPlaceName();
+                if (placeName != null && !placeName.isEmpty() && placeName.substring(0, 1).matches("[가-힣]")) {
+                    googlePlaceService.save(place);
+                }
+            }
+        }
+    }
+
+}
diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql
new file mode 100644
index 0000000..a0fa8b9
--- /dev/null
+++ b/src/main/resources/data.sql
@@ -0,0 +1,23 @@
+
+insert into city(`city_name`, `latitude`, `longitude`, `city_range`)
+values ('도쿄', 35.6895, 139.6917, 10000);
+insert into city(`city_name`, `latitude`, `longitude`, `city_range`)
+values ('오사카', 34.6937, 135.5023, 8000);
+insert into city(`city_name`, `latitude`, `longitude`, `city_range`)
+values ('교토', 35.0116, 135.7681, 5000);
+insert into city(`city_name`, `latitude`, `longitude`, `city_range`)
+values ('하노이', 21.0285, 105.8544, 9000);
+insert into city(`city_name`, `latitude`, `longitude`, `city_range`)
+values ('호치민', 10.7769, 106.7009, 9000);
+insert into city(`city_name`, `latitude`, `longitude`, `city_range`)
+values ('다낭', 16.0544, 108.2022, 5000);
+insert into translate (`origin_name`, `rename_name`) values
+('Japan', '일본'),
+('Vietnam', '베트남'),
+('Tokyo', '도쿄'),
+('Osaka', '오사카'),
+('Kyoto', '교토'),
+('Hà Nội', '하노이'),
+('Hồ Chí Minh', '호치민'),
+('Đà Nẵng', '다낭'),
+('京都府', '교토');
\ No newline at end of file
diff --git a/src/main/resources/place.sql b/src/main/resources/place.sql
new file mode 100644
index 0000000..ed2428f
--- /dev/null
+++ b/src/main/resources/place.sql
@@ -0,0 +1,383 @@
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJB1aZxO0HAWARP5-Nz2JRaFM', '일본', '교토', '엔토쿠인', 35.0007927, 135.7796186, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJucn_AzcPAWARYTuLwGgIQJU', '일본', '교토', '승림사', 34.9800511, 135.7737036, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJzY-pNZMIAWARdjMJj5IORp0', '일본', '교토', '카모가와칸', 35.00908020000001, 135.7709373, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ_7zQmkEIAWARyjP6gAwXB60', '일본', '교토', '다다스노모리', 35.036467, 135.7724128, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJqeJAF-IIAWARU4YU3rm3HcI', '일본', '교토', '오카자키 신사', 35.0173671, 135.7887934, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJo5J473EIAWARer7FcfTAkeU', '일본', '교토', '레이제이 가 주택', 35.0292482, 135.7609715, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJuazqXbQHAWARvPIr1l-85Sk', '일본', '교토', '사이인카스가 신사', 35.0050648, 135.7294532, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJZwoDQJAIAWARKXhAcOYyGQ0', '일본', '교토', '마쓰이 - 베칸 하나간자시', 35.007479, 135.7627743, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJF42zshgJAWARVK2wk6AFlxw', '일본', '교토', '젠린지(에이칸도)', 35.0148543, 135.7941588, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJEdzLq-0GAWARfUpevjWDfcE', '일본', '교토', '호텔 몬토레 교토', 35.0078486, 135.7594248, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ-QrMYI4IAWARn3M5GUqaXZY', '일본', '교토', '호텔 스기초', 35.0117068, 135.7651829, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJqewQoHkIAWAR6RokWp3Iesc', '일본', '교토', '야사카 신사', 35.0036559, 135.7785534, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJqSJy8t8HAWARkdIzPrXZIFc', '일본', '교토', '니시진직물회관', 35.0288437, 135.7516461, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ-zb_esYIAWARbP9V4pnisEc', '일본', '교토', '로쿠도친노지', 34.99827459999999, 135.7754201, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJf438RkAIAWARzM3lfzI7uAM', '일본', '교토', '가모미오야 신사 (시모가모 신사)', 35.0389778, 135.7730068, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJf6jVFpMIAWARpsdyUf-86CQ', '일본', '교토', '더 로열 파크 호텔 교토 산조', 35.0089996, 135.7695068, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJmTmwfSAJAWARbs7Ryg8uVTI', '일본', '교토', '곤치인', 35.0105075, 135.7906663, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ0YDNkboIAWARNjCEax81LBo', '일본', '교토', '쇼세이엔', 34.9913391, 135.7631395, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ187BbeYIAWARFtc1KdlA0UE', '일본', '교토', '교토국립근대미술관', 35.0124077, 135.7821571, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJuU17z9oIAWARgMhsX3kqUSQ', '일본', '교토', '고다이지', 35.0007687, 135.7812718, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ1e95GRsIAWARxYokwoFuups', '일본', '교토', '교토부립식물원', 35.0486172, 135.7630378, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJUxH3jkkIAWARjIY5uOKmnVk', '일본', '교토', '케이분샤 이치조지점', 35.0439648, 135.7849094, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJUXmPed8HAWAR0BFoGpHqivI', '일본', '교토', '세이메이 신사', 35.02776, 135.7511802, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJlwyrGNAIAWARNb5hUHdZruY', '일본', '교토', '니넨자카', 34.9981744, 135.7808578, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJfXhv2hoJAWARAyBdLecA72I', '일본', '교토', '호넨인', 35.0240638, 135.7973229, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJU_c9zi8GAWARp_WAfxEjqGU', '일본', '교토', '미부데라', 35.0016701, 135.7433877, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ2Sp91xyoAWARuy5EQKrDDAg', '일본', '교토', '이마미야 신사', 35.0459513, 135.7420479, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJLS3WZJIIAWARqQv8aoODVqs', '일본', '교토', '교토 호텔 오쿠라', 35.01184819999999, 135.7694265, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJLS3WZJIIAWAREjx2gUcH3DM', '일본', '교토', '우키야 호텔 오쿠라 교토점', 35.0116831, 135.7694683, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ30M0kskIAWAR2YB3p_JWeB0', '일본', '교토', '도요쿠니 신사', 34.99158979999999, 135.772277, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJg4LAZJIIAWAR846tP-P5HGo', '일본', '교토', '본능사 호텔', 35.0105831, 135.7683275, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJydhUfYMIAWARqCOG4ar27pc', '일본', '교토', '본격 고기구이 지화자 산조카와라마치 본점', 35.0097812, 135.7687414, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ44GFHdkAAWARL3Fpt0e5SZI', '일본', '교토', '교토예대 부속 미술관', 34.9869911, 135.7638754, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJd9pWqK8IAWAR1L-X_-4WKew', '일본', '교토', '교토 타워', 34.9875205, 135.7592518, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJuxR_z9oIAWARdXWvK-RZLRY', '일본', '교토', '카만자', 34.9988658, 135.780733, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJy595gNAIAWARAQmAag8k6zw', '일본', '교토', '교토 료잔 호국신사', 34.9999349, 135.7829385, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ4W9CCwUJAWARyauI6BzKiiU', '일본', '교토', '지쇼지', 35.0270213, 135.7982058, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJLfxAUf0IAWARuQA15g3dY1Y', '일본', '교토', '신뇨도', 35.021455, 135.7892507, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJGc7Srt0IAWARJ1CbE9_-INY', '일본', '교토', '쇼렌인', 35.00730830000001, 135.7831667, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJgXj-F5MIAWARkA0y8vgIOOA', '일본', '교토', '독실 이자카야 이케다야 하나노마이 - 산조역점', 35.0089441, 135.7699035, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJlakf5IUIAWARRkz_eK81n2E', '일본', '교토', '하톤 호텔 교토', 35.0116946, 135.7609035, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJTTuq0-oIAWARAR87f2zoSko', '일본', '교토', '폰토초 코토시', 35.0054457, 135.7711297, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJh-aPopMIAWARiHVjSN-Qz8g', '일본', '교토', '호텔 비스타 프레미오 교토', 35.0079208, 135.7682044, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJL31JquwIAWARUBsHQFFzOGs', '일본', '교토', '스시테츠', 35.0082234, 135.7712893, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ682-F-oIAWARYS8LIvTE3ec', '일본', '교토', '기온 신몬소', 35.0064571, 135.7751889, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJUY7u4SAGAWARJG810LLXIls', '일본', '교토', '고코유', 34.99693200000001, 135.749782, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJl0OsIMQIAWARHJSxqArrUDY', '일본', '교토', '야스이곤피라 궁', 35.00011260000001, 135.7758058, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ73n36IYIAWAR0OYK9dUDK5g', '일본', '교토', '이치란 교토 가와라마치점', 35.0057683, 135.7680923, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJh1qJf4YIAWARTAOFMHrSHvI', '일본', '교토', '교토국제 만화 박물관', 35.0118576, 135.7594192, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJtfs36bEOAWARR0txeohXi5A', '일본', '교토', '소린인 (야마시나 쇼텐)', 35.0019167, 135.817425, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJKUS3ZtAIAWARVzZB5xrerEw', '일본', '교토', '료잔역사관', 34.998987, 135.7826268, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJuYNCQdwIAWARfPnq0Ktzk2A', '일본', '교토', '지온인', 35.0051988, 135.7833827, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJKQUNgYMIAWAR76j9IMgrEBs', '일본', '교토', '립톤 티하우스 산조점', 35.0087828, 135.7677803, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJkQo2v8gIAWAR4k7mdKr_3JY', '일본', '교토', '와카미야 하치만궁사 (도기신사)', 34.9951301, 135.7748261, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJr_gZonkIAWARB1xyACZNUKM', '일본', '교토', '산넨자카', 34.99666440000001, 135.781008, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ8ywE3JEIAWARLSie0fhSHUY', '일본', '교토', '시티 펜션 토미 리치 인 교토', 35.0093254, 135.7648575, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJtfozjyoGAWARCBgIc2T1ap8', '일본', '교토', '긴파로', 35.0044983, 135.7642634, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJJzgo5iUJAWAR3ZZo6XwH72Y', '일본', '교토', '히무카이 대신궁', 35.006749, 135.7953638, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJzYVfPY4IAWAR9YmMkv5T9Rk', '일본', '교토', '나카무라', 35.01038, 135.7650802, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJvUbrwCCoAWARX2QiHCsn5A4', '일본', '교토', '금각사', 35.03937, 135.7292431, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJjch8GOUIAWART0WX2JLZvnU', '일본', '교토', '헤이안 신궁', 35.0159823, 135.7824263, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJTar7hQQGAWAREHkXsNkt7tM', '일본', '교토', '도지(교왕호국사)', 34.98033949999999, 135.7476935, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJj-9V6PgHAWARobrWGXEGn58', '일본', '교토', '다이토쿠지', 35.043891, 135.74603, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJiXmNDMoIAWARNUZyTY1OAH0', '일본', '교토', '호코지', 34.9921198, 135.7720541, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJT8uMzZwIAWARnGzsARCjnrY', '일본', '교토', '니시키 시장', 35.00502580000001, 135.764723, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJA4Pi1_gIAWARjoS9UxmAvsI', '일본', '교토', '요시다 신사', 35.0252843, 135.784702, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJrXARYtcIAWARDiuE173gewo', '일본', '교토', '쇼군즈카', 35.002102, 135.7869601, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJA8Lvs5QIAWARcluMJK3ZcZI', '일본', '교토', '아고츠유 샤브샤브 야마후쿠', 35.0071128, 135.7707992, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJaaPzJ4wIAWARpNHs1WVqmTc', '일본', '교토', '니시야마 료칸', 35.013105, 135.766303, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJIW0uPRUPAWAR6eI6dRzKGns', '일본', '교토', '후시미 이나리 신사', 34.96769449999999, 135.7791876, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJw6twrXsIAWARBOOJZKNt64M', '일본', '교토', '고오 신사', 35.0222174, 135.7588455, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJT1QTwIsIAWAR67LTaxHhPqI', '일본', '교토', '스미야키 아카리', 35.016428, 135.767446, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJs4Cbj8oIAWARiBZl2-sBK6o', '일본', '교토', '렌게오인(산주산겐도)', 34.9878845, 135.7717126, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJt1kBRcoIAWAR00msugECEYw', '일본', '교토', '교토 국립박물관', 34.9899887, 135.773116, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJS4iqNYUIAWARyFYH6TVLWsU', '일본', '교토', '롯카쿠도', 35.00771319999999, 135.7602563, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJIcT4YMUIAWARSTUi4EEky7E', '일본', '교토', '호칸지', 34.998558, 135.7792358, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJSc2g_SAJAWAR0qGARCaZRs4', '일본', '교토', '텐쥬안', 35.0106694, 135.7922833, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJAQDrPokIAWARS52vnO72Sio', '일본', '교토', '히츠지 도넛', 35.0149968, 135.7649429, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJSd6AdY0IAWARyddvKYDTJ4g', '일본', '교토', '비브리오틱 헬로 카페', 35.0137573, 135.7641567, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJI1C2Ja4OAWARhNUxQIQteok', '일본', '교토', '비샤몬도', 35.0013626, 135.81926, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJB_vchdMIAWARujTEUIZlr2I', '일본', '교토', '기요미즈데라', 34.9946662, 135.784661, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJSfVT54wHAWAR2yBLWbHLplE', '일본', '교토', '히라노 신사', 35.0325953, 135.7319823, '2025-05-13 12:42:29', '2025-05-13 12:42:29');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJPVLCZzIYQjERfFoH2A6LIA0', '베트남', '다낭', '원스타 호텔', 16.0672541, 108.2245584, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJEymIkTYYQjERWO-pgjkKGMk', '베트남', '다낭', '다낭박물관', 16.0745542, 108.2239668, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJSRHNYzIYQjERyqgy_wxG-7Y', '베트남', '다낭', '브릴리언트 호텔', 16.0667352, 108.2246568, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJBa6tzjIYQjERYUANyQkdLDU', '베트남', '다낭', '레인보우 호텔', 16.0645389, 108.2239685, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJbbs1ZTQYQjERi3OdfmnRk2g', '베트남', '다낭', '하이 초우 마을 회관', 16.0677019, 108.2192454, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJISuvVcsZQjERhnOk-O_w9pI', '베트남', '다낭', '문라이트 다낭 호텔', 16.0639225, 108.2197256, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJRZhHIMkZQjERYBH-5S1xKNg', '베트남', '다낭', '포다사(普沱寺)', 16.0559509, 108.2186556, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJa3dDoTQYQjERIX7-BPgt6-U', '베트남', '다낭', '탄 히엔 호텔', 16.0655376, 108.2194196, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJj1wfpTQYQjERyAwSp1WRPpg', '베트남', '다낭', '오렌지호텔', 16.0650129, 108.2194786, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ9fqsdOcZQjERZcIMEHw3HtY', '베트남', '다낭', '선월드 다낭 원더스 대관람차', 16.0401624, 108.2285171, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJk9JRqTcZQjERUvDzQoQF4R8', '베트남', '다낭', '드래곤 불쇼', 16.061687, 108.230045, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJkToVUDMYQjER-ZFawI7x_ow', '베트남', '다낭', '냣린 다낭 호텔', 16.0645969, 108.2204652, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJkZi7gkcYQjERPd87DaNuhW0', '베트남', '다낭', '온더 라디오 바', 16.06524509999999, 108.2213507, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJH5FAHiEYQjERi-kdX4gd-eE', '베트남', '다낭', '다낭음식 투어', 16.0661013, 108.2243619, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJkzSVjMoZQjERwedbE3VmKt4', '베트남', '다낭', '팝럼사 (法林寺)', 16.0622908, 108.2155449, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJL1GKWJYZQjERLrEGqlK2kwQ', '베트남', '다낭', '용다리', 16.0612215, 108.2296818, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJL710Z-gZQjERTwK6WEaLM1c', '베트남', '다낭', '다낭 어린이 문화센터', 16.0383904, 108.2253727, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJY3QYS88ZQjERyxMhbywP-Lg', '베트남', '다낭', '골드 호텔', 16.0539436, 108.2201004, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ598PYTIYQjERyESkAkbGE2c', '베트남', '다낭', '해피데이 호텔', 16.0667959, 108.2246663, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJtVsuOdsZQjERelakzsqyQyo', '베트남', '다낭', '그랜드머큐어다낭', 16.0483415, 108.2267041, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJD0R5P8sZQjER_nZgGVVRagk', '베트남', '다낭', '시온 호텔', 16.0626391, 108.2186137, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJqUSEHDMYQjERso5xmrgdgH0', '베트남', '다낭', '다이아 호텔', 16.066131, 108.222685, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJY5Fbi7UZQjERbXnfnxJJqVs', '베트남', '다낭', '옵 띠엔 사 호텔', 16.0607236, 108.2137202, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJybANfzMYQjER3THMpSZICa8', '베트남', '다낭', '사노우바호텔', 16.06697519999999, 108.2200454, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJDcx-OTIYQjERP4eyjItPspA', '베트남', '다낭', '한시장', 16.0681959, 108.2242217, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJYdX2LgAZQjERoDO037rxpic', '베트남', '다낭', '다낭시내 자전거투어', 16.0683101, 108.2250366, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJLWoAs80ZQjERLKHDYD-ZymI', '베트남', '다낭', '참 박물관', 16.0603007, 108.2232677, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJZ4VHdDQYQjERpZjbKRvqo14', '베트남', '다낭', '투 도 호텔', 16.0677255, 108.217317, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJm-yAmTQYQjER2ymVQcz7RzQ', '베트남', '다낭', '안남 호텔', 16.0660526, 108.2194068, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJu0XSwlEYQjERcpf5Oh-ZvKQ', '베트남', '다낭', '와이키키 호텔', 16.0730246, 108.2014084, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJU1LFNzIYQjERy0iTTLoLR7c', '베트남', '다낭', '마야나 호텔', 16.0681565, 108.2234649, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJdZsHAkoYQjER9tHLms7dmVI', '베트남', '다낭', '아이리스 호텔', 16.07007549999999, 108.2138671, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJM560Qk0YQjERJDvIocFeEIw', '베트남', '다낭', '나이스 호텔', 16.0672779, 108.2045311, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJzdmTxe8ZQjERbvAggIAHQLc', '베트남', '다낭', '민 토안 갤럭시 호텔', 16.0441656, 108.2227215, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJu7rVaDIYQjERin9i1pZWOCE', '베트남', '다낭', '썬리버호텔', 16.067425, 108.224725, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJF8yRoecZQjERdDBeBdSRD-Y', '베트남', '다낭', '썬월드 다낭 아시아파크', 16.0412139, 108.2256332, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ0atM70kYQjERt8DDC2MBtX4', '베트남', '다낭', '다낭한인연합교회', 16.0710393, 108.2129536, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJMy-mQjIYQjERRrzYoziQtfc', '베트남', '다낭', '파라다이스 호텔', 16.0672539, 108.2245597, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ-3wY7lEYQjERrJ9wTeoa-WQ', '베트남', '다낭', '블루 서머 호텔', 16.0720623, 108.2013925, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ-3GM1TAYQjERzpji9y3rUiQ', '베트남', '다낭', '다나 펄 호텔', 16.0728311, 108.2203461, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJNYSLZK4ZQjERlBk4NJMHzdU', '베트남', '다낭', '사랑의부두', 16.06307019999999, 108.2297743, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJUddRjUoYQjERKmqv9Qnyujs', '베트남', '다낭', '루이스 호텔', 16.067859, 108.2173772, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJb2wOY8sZQjERiUcaYt-GT_I', '베트남', '다낭', '후안헝호텔', 16.0672681, 108.2201214, '2025-05-13 12:44:03', '2025-05-13 12:44:03');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJubHyMNaMGGARFRSq4A7C3Uo', '일본', '도쿄', '사누키우동 타이시 도쿄멘츠단', 35.6947874, 139.6981912, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJK9584NuMGGARVKfZjpYoQDs', '일본', '도쿄', '하나조노 신사', 35.6935311, 139.7053279, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJP5nfE2uMGGARCD9T7XHuNb4', '일본', '도쿄', '쇼와관', 35.6950861, 139.750718, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJEX3XFIOOGGAR3XdJvRjWLyM', '일본', '도쿄', '도쿄 국립박물관', 35.7188351, 139.7765215, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJF0MR5MSmH2ARj3x0ov0aQ-8', '일본', '도쿄', '히에 신사', 35.6746656, 139.7399379, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJPyOTG8KMGGARh_IXobWxHmo', '일본', '도쿄', '신주쿠 교엔', 35.68517629999999, 139.7100517, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJOxerKXyLGGARKNvbpemyeys', '일본', '도쿄', '갤러리-마', 35.6674967, 139.7267444, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJf8xB-pyOGGARizzhlNTcI7s', '일본', '도쿄', '국립서양미술관', 35.71538690000001, 139.7758138, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJE2tqZtSMGGARt24OI2Lv-MA', '일본', '도쿄', '올데이 다이닝 주린', 35.6901609, 139.6943219, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJoTcat9SMGGAR6GGG8zdcZvE', '일본', '도쿄', '도쿄 도청사', 35.6894807, 139.6916863, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ_fapMy6MGGAR1CVStFYOSfQ', '일본', '도쿄', '야요이 미술관', 35.7148861, 139.7634696, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJdUFk9inzGGARVx9UtikMlU4', '일본', '도쿄', '라멘 야마다야', 35.6897219, 139.6858956, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ_fFg4taMGGARzkeRkpAV6u0', '일본', '도쿄', '텐카네', 35.6926263, 139.6980911, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJDTEgTOKLGGARRjeD6dnAoVY', '일본', '도쿄', '일본 국립 영화 아카이브', 35.6755095, 139.7706169, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJnYY2Lz-MGGAR6WLn5_eeaOs', '일본', '도쿄', '아소보~노！', 35.7039082, 139.7546676, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJdfZ2xRKMGGARQSyxv6wfzw8', '일본', '도쿄', '과학기술관', 35.691589, 139.753069, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJfzpHnMWMGGARnXkmq5KQ2LQ', '일본', '도쿄', '사롱 부처&비어', 35.6884337, 139.7004666, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJtW7K92qNGGARBBLnvRhDQPM', '일본', '도쿄', '키시모신당', 35.7221228, 139.7132761, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJNe9mqeOLGGARV5mPNz_El_A', '일본', '도쿄', '호텔 선루트 플라자 신주쿠', 35.6870282, 139.6988425, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJZQpgdf6KGGARXCH1FGs07t0', '일본', '도쿄', '에바라 하타케야마 미술관', 35.6322686, 139.7272422, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJgeazv1aMGGARQh5cREuvLjI', '일본', '도쿄', '아카기 신사', 35.70491390000001, 139.7361059, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJcxyfz9TyGGAR5fxFZjoXLqM', '일본', '도쿄', '모우얀 카레 니시신주쿠점', 35.6953946, 139.690589, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJCSOV_omLGGARC30qXmCHB7A', '일본', '도쿄', '헌정기념관', 35.6792684, 139.7453457, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJCewJkL2LGGAR3Qmk0vCTGkg', '일본', '도쿄', '도쿄 타워', 35.6585805, 139.7454329, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJTQbYAg2MGGARt22eNwtfGtE', '일본', '도쿄', '고쿄', 35.685175, 139.7527995, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJH_9NndCMGGARaE6V1MvB1Wc', '일본', '도쿄', '댄싱 클랩 도쿄', 35.6903733, 139.7013626, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ0biN2-OLGGARY5qjgA8Ayb8', '일본', '도쿄', '호텔 몬테레이 라 • 소우르 긴자', 35.6738746, 139.7693678, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJUyA7lICLGGARuHfsHqZ2U0Y', '일본', '도쿄', '아카사카 사카스', 35.67280079999999, 139.7351128, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJC5-nF5CLGGAR9M3JUrPsBj8', '일본', '도쿄', '오쿠라집고관', 35.6670149, 139.7433053, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJC2xnkb6LGGARJL0d222opIg', '일본', '도쿄', '조죠지', 35.657479, 139.7482928, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJh64KT6uLGGARKx4cxgOaL54', '일본', '도쿄', '센가쿠 절', 35.6377397, 139.7364006, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJQUsA2nmLGGARYAdeN1dwsWc', '일본', '도쿄', '이즈모 대사 도쿄분사', 35.66226899999999, 139.7287888, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ1UOuDWiMGGARkM6Iv-ZU57U', '일본', '도쿄', '야스쿠니 신사', 35.69413600000001, 139.743849, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJBZk1rgyLGGARtjJYTaN0hBA', '일본', '도쿄', '아리스가와노미야 기념공원', 35.6520827, 139.7257986, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJhT_wQW-NGGARyeOCR2L-W-I', '일본', '도쿄', '선샤인 수족관', 35.7289254, 139.7201573, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJBzFEFG6NGGARTsARiXqpz-U', '일본', '도쿄', '고대 오리엔트 박물관', 35.7288381, 139.7209159, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJYXBWR1uNGGARtkqckMsH1QU', '일본', '도쿄', '아가리야시키 공원', 35.7264919, 139.7052836, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJhXPtBNOMGGARJs-RCxNEsGA', '일본', '도쿄', '유데타로 신주쿠 워싱턴호텔점', 35.68680559999999, 139.6928787, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJBVDeRkaMGGARXsIjrhYCIhs', '일본', '도쿄', '고이시카와 고라쿠엔', 35.70569130000001, 139.7492718, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJB9gt78-MGGAR1m-scQlkRsg', '일본', '도쿄', '오다큐 호텔 센츄리 서던 타워', 35.6863845, 139.7004339, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJlVe4oleLGGARDsczGV9jSIU', '일본', '도쿄', '힐튼 도쿄', 35.6925835, 139.6911889, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJseohrGmLGGARWx9gVUaRc7Y', '일본', '도쿄', '야마타네 미술관', 35.65315019999999, 139.7136591, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJb_o7HiiMGGARUKu8uO7fGIQ', '일본', '도쿄', '도쿄도 미술관', 35.7172113, 139.7729387, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJVVXOW9GMGGARzJ3xnMJyAXY', '일본', '도쿄', '히노야 카레 신주쿠니시구치점', 35.68948229999999, 139.6965801, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJywcn0AqMGGARUlUzdWX_byI', '일본', '도쿄', '호텔 로즈가든 신주쿠', 35.69445160000001, 139.6937059, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ4Y-GGVWKGGARAHFc8A6VDf0', '일본', '도쿄', '코야산 도쿄 별원', 35.6349814, 139.7340404, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJibDhsomLGGARkIZSXvrUx0g', '일본', '도쿄', '국회의사당', 35.675888, 139.744858, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJs8KhbdqMGGARXWxh64CFs6s', '일본', '도쿄', '쿄마치 코이시구레', 35.6911161, 139.7020887, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ5SZMmreMGGARcz8QSTiJyo8', '일본', '도쿄', '메이지 신궁', 35.67639760000001, 139.6993259, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJIe1uymKLGGARGpOwOiZEDog', '일본', '도쿄', '아오야마 영원', 35.6656277, 139.7220659, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJAQDAl9eMGGAR3QSk73VsTrQ', '일본', '도쿄', '신주쿠 프린스 호텔', 35.6944772, 139.7001337, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJl2Rt_tOMGGARSbquYusMyFw', '일본', '도쿄', '카도야 호텔', 35.68981, 139.69619, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJAQBfjdXyGGARKUPAKzH-oro', '일본', '도쿄', '카나 본점', 35.69169659999999, 139.6873447, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJS_iXTweNGGAR5UD9ZCvcZmg', '일본', '도쿄', '하토야마 회관', 35.7138211, 139.7312132, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJL0kSfg2MGGARKv5KX53ZZ2Y', '일본', '도쿄', '도쿄국립근대미술관', 35.6905432, 139.7546932, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJKWj2d6ntGGARv7OJvjYsCNo', '일본', '도쿄', '토시마엔 니와노유', 35.7438303, 139.6481385, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJacm73Oz0GGAR1AL_tviNeCE', '일본', '도쿄', '고마자와 올림픽 공원 종합 운동장', 35.6255722, 139.66365, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJIw6SsciMGGAR83ZIsDoZAec', '일본', '도쿄', '뽀빠이', 35.6820426, 139.6984725, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ85hbBNOMGGARYgvauINiX18', '일본', '도쿄', '신주쿠 워싱턴 호텔', 35.6868353, 139.69325, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ89TugkeMGGARDmSeJIiyWFA', '일본', '도쿄', '도쿄 돔', 35.70563959999999, 139.7518913, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJwfegutyLGGARGjiY-L2eSps', '일본', '도쿄', '하마리큐 은사정원', 35.6596559, 139.7634091, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJwR2lZ36LGGAR43Z0b6e3Gw4', '일본', '도쿄', '노기 신사', 35.6688249, 139.7279607, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJJbavS2GLGGARFLUeTte2lt0', '일본', '도쿄', '오카모토 타로 기념관', 35.66130799999999, 139.715583, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ9RJ2PJGMGGARwG4ChjnDW3I', '일본', '도쿄', '메이지 신궁 외원', 35.67543990000001, 139.7182668, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJJRmFiCOLGGARyLhUN8vGRXs', '일본', '도쿄', '메구로기생충관', 35.6316814, 139.7066661, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJkSMU8dmMGGARU20fByF59WI', '일본', '도쿄', '쿠루마야 별관', 35.6928375, 139.7022637, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJXf9Z6JiMGGARRZ0zg4fFgLU', '일본', '도쿄', '와타리움 미술관', 35.6707251, 139.7133581, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ8Vuh65yOGGARyj4L5IBFiIk', '일본', '도쿄', '국립과학박물관', 35.7164273, 139.7763336, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJKaP2UNGMGGARgKAoClztbmk', '일본', '도쿄', '프론토 니시신주쿠', 35.6896981, 139.6965618, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJR3s9zSrzGGARck5SsvgMA6Q', '일본', '도쿄', '하얏트 리젠시 도쿄', 35.691516, 139.690852, '2025-05-13 12:41:27', '2025-05-13 12:41:27');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJP95WHtaMGGARXUH4nc7FwvQ', '일본', '도쿄', '호텔 마이스테이스 니시 신주쿠', 35.6949249, 139.6973203, '2025-05-13 12:41:26', '2025-05-13 12:41:26');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJR5zaJTLnAGARyuJ_yX2DhOk', '일본', '오사카', '오사카 역사박물관', 34.68261409999999, 135.5207975, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJX8GEj-7mAGARA_wTy6_UPQI', '일본', '오사카', '스시 사카우', 34.6962475, 135.4997658, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ8zDk78zgAGARZSdGd9lVP2Y', '일본', '오사카', '호코쿠 신사', 34.6842971, 135.5263235, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJRc2v2MLmAGARtZTIpzCGMfg', '일본', '오사카', '호텔 일 그란데 우메다', 34.6974598, 135.508699, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJXeLVg9DgAGARqlIyMCX-BTY', '일본', '오사카', '유니버설 스튜디오 재팬', 34.6656768, 135.4323185, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJqWEt-fvmAGARjB6FHsOgvtI', '일본', '오사카', '우쓰보 공원', 34.6858568, 135.4962345, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJReJA0VjnAGAROYGpLFKMkSM', '일본', '오사카', '기요미즈데라', 34.6551886, 135.5114196, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJWUdcb5LmAGARtX99h-wZPKQ', '일본', '오사카', '신우메다 쇼쿠도가이', 34.70357970000001, 135.4980814, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ_0Lgd2DnAGARV0X03lbPy-U', '일본', '오사카', '츠텐카쿠', 34.6524992, 135.5063058, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJWbWCZuLmAGARof7rzWYGg_s', '일본', '오사카', '정토진종 본원사파 쓰무라별원 (북어당)', 34.6850446, 135.4996097, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJw8nTR8_gAGARGCF7kEZrDzo', '일본', '오사카', '오사카 성 궁도장', 34.6862637, 135.5335936, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJAQAw8ObmAGARrSXcn5Zm9p4', '일본', '오사카', '데키주쿠', 34.6912792, 135.5032834, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ7xwqpNvmAGARsm6fpyLvNaE', '일본', '오사카', '오사카텐만구 (오사카 천만궁)', 34.69605759999999, 135.5126556, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJxUAgS-zmAGARBbrgC7JCLlM', '일본', '오사카', '야키니쿠 돈돈 난바', 34.6979271, 135.4993393, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJQVW9eXLnAGARn-pUdRl0w4A', '일본', '오사카', '난바 야사카 신사', 34.66155920000001, 135.4967039, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJIVA6O_jdAGARLWCtv8iBqrY', '일본', '오사카', '시텐노지', 34.6544581, 135.5165239, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ7-6IV_vmAGARYbUIz2plL4g', '일본', '오사카', '오사카 과학기술관', 34.68652319999999, 135.496534, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJXUg-SY3mAGARGoOwO1U017E', '일본', '오사카', '힐튼 오사카', 34.6998245, 135.4959532, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJAQD8GOjmAGARkcj_Xba6li8', '일본', '오사카', '나니와오키나', 34.6962383, 135.5059279, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ67mcWJLmAGARrUf0FlFtm7w', '일본', '오사카', '한큐백화점 우메다 본점', 34.70281860000001, 135.4985323, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJY1rGCPXmAGAR-elbPldcf0k', '일본', '오사카', '호타루마치', 34.6939857, 135.4887972, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJqVhiwkTnAGARZP6JtOa4uOY', '일본', '오사카', '녕연사', 34.6636512, 135.5126777, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJAQDAo5PmAGARcMqvnh2Reqs', '일본', '오사카', '헵파이브 관람차', 34.70381529999999, 135.499969, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJlbSmfm7nAGARvVx2YegSHUQ', '일본', '오사카', '난바나카 공원', 34.6606834, 135.4991614, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ50FCqF7mAGARUc58xwmw5aM', '일본', '오사카', '혼죠 절', 34.6895897, 135.4827889, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJI7QyuRTnAGARU28-XLGEOfU', '일본', '오사카', '호젠지', 34.6679398, 135.5024676, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJAQDEs-3mAGARuUJUJ1xvGTk', '일본', '오사카', '후쿠다테이', 34.6980049, 135.4990995, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ2Tm6DNvmAGARNFVGtxl88ZQ', '일본', '오사카', '다이쇼군 사', 34.6962726, 135.5123764, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJVVUZ-e3mAGARPjxBFm1go-I', '일본', '오사카', '키타신치 코류', 34.6959614, 135.4971424, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJbyd0kIjmAGAR_crecCbjwlc', '일본', '오사카', '우메다 스카이빌딩', 34.7052872, 135.4896527, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJzakNjPToAGARzCwIriDFg28', '일본', '오사카', '해유관', 34.65451819999999, 135.4289645, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJTdPOeOPmAGAR_63Ex_WTubw', '일본', '오사카', '고료 신사', 34.6874395, 135.4991582, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ1fryC8XmAGARAH91XeuVRfA', '일본', '오사카', '요리키쵸 공원', 34.70074100000001, 135.5139537, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJV6JXdmDnAGAR-9a4atjXsTY', '일본', '오사카', '신세카이', 34.65160129999999, 135.5059562, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJMSKoWcLmAGAR8bjl_PbJEyI', '일본', '오사카', '니시텐마 공원', 34.698553, 135.5079031, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJCemqKvDmAGARaa9f56LdsFk', '일본', '오사카', '라・페트 히라마츠', 34.6937845, 135.4967409, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJmV068LHmAGARers37j3sC_M', '일본', '오사카', '부손 공원', 34.7189548, 135.5198216, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJd8--0bPgAGARJVND9nERdsI', '일본', '오사카', '산코 신사', 34.67306149999999, 135.529404, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ-WWA3NPmAGARQ4QUEkWU9YY', '일본', '오사카', '아트 코트 갤러리', 34.6990745, 135.5209584, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJN051sN_mAGAR_bYL1QvF-Qo', '일본', '오사카', '호텔 브라이튼 시티 오사카 기타하마', 34.68900179999999, 135.5079962, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ-ScDixTnAGARqFDg38ZEDQ4', '일본', '오사카', '톤보리 River walk', 34.6689557, 135.5052283, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJnc0vMO_mAGARphl7b-wVsg4', '일본', '오사카', '오에바시', 34.6946699, 135.5011711, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJdePJiBvnAGAR3Brg9OzvKO0', '일본', '오사카', '난바신사', 34.6787746, 135.4999284, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ_TooXM3gAGARQR6hXH3QAQ8', '일본', '오사카', '오사카 성', 34.6872571, 135.5258546, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJdQQtaOHmAGAR221DW1H95Iw', '일본', '오사카', '토요코인 오사카 요도야바시 에키 미나미', 34.6880825, 135.5023109, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJffnrY-zmAGARVLGXbRijxws', '일본', '오사카', '츠유노텐 신사(오하츠텐진)', 34.6992683, 135.5007629, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJo5Txd7bgAGARuym58IhH4Kg', '일본', '오사카', '다마쓰쿠리이나리 신사', 34.677965, 135.529966, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJFcyRJ97mAGAR4uT_aqEYmFQ', '일본', '오사카', '다이와 로이넷 호텔 오사카-키타하마', 34.6894051, 135.5063607, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJq6pmKeHmAGARbFmknwEZXSU', '일본', '오사카', '나니와 교회', 34.6895124, 135.5037795, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJe0vaVJHoAGARiQnzn8ODfPE', '일본', '오사카', '할리우드 드림 - 더 라이드', 34.6665133, 135.4338993, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJq6o6zPbmAGAR5Q9OsQN_voo', '일본', '오사카', '국립국제미술관', 34.6917819, 135.491984, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJed3mI_DdAGARJyFcpACSbwc', '일본', '오사카', '아베노하루카스', 34.6460706, 135.5134771, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJOyLHeiHnAGARraAPQSkmfLU', '일본', '오사카', '오사카 기업가 뮤지엄', 34.68403599999999, 135.5092116, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJedldte_mAGARFpNCQktXURM', '일본', '오사카', '할리스 카페 나카노시마 센트럴 타워점', 34.6937634, 135.4980335, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJUS1GJObmAGARqxn_vOMej7k', '일본', '오사카', '오사카부립 나카노시마 도서관', 34.693671, 135.5031463, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJPU3BpJLmAGAR6L51aIqg0ZA', '일본', '오사카', '한신우메다 본점', 34.7012797, 135.4983196, '2025-05-13 12:41:57', '2025-05-13 12:41:57');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJZy8ip_ToAGARqWp5xOR-AwM', '일본', '오사카', '덴포산 하버 빌리지', 34.6558407, 135.4302126, '2025-05-13 12:41:58', '2025-05-13 12:41:58');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ__8jvJWrNTERoYMvS7zr7WI', '베트남', '하노이', '오텔 드 로페라 하노이 - MGallery', 21.02440069999999, 105.8555913, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJV3CGar-rNTERyGUmVmj76UM', '베트남', '하노이', '하노이프린스2호텔', 21.03474869999999, 105.8510674, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJeY1cq76rNTERnByU5oQJHIw', '베트남', '하노이', '하노이 스타라이트 호텔', 21.0350938, 105.8469883, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJP_qrg_KrNTERnOWkD67p0p8', '베트남', '하노이', '함롱성당', 21.0186893, 105.8535584, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJoyV0YpWrNTERAubm9AgKWG4', '베트남', '하노이', '하노이 모닝 호텔', 21.0317201, 105.8506659, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJQ3n_oJWrNTERLITBjBznz5s', '베트남', '하노이', '아쿠아리우스 호텔', 21.028046, 105.848048, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ_z3FqbirNTER-t50pP861X0', '베트남', '하노이', '홀리데이 다이아몬드 호텔', 21.0366211, 105.8523772, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJORcGYcCrNTER9pKMHVN7CdE', '베트남', '하노이', '매이데빌구시가지호텔', 21.0329965, 105.8521542, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ08xdLaWrNTERkn2aWCcWL5E', '베트남', '하노이', '북문교구성당', 21.04142359999999, 105.8404889, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ22EygMCrNTER-MABtMNSl20', '베트남', '하노이', '칼립소 스위트 호텔', 21.03343929999999, 105.852535, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJZ0iRjr6rNTERjqsoQbtofmA', '베트남', '하노이', '하노이 그레이스풀 호텔', 21.0342184, 105.8476936, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJz-h-aMCrNTERSLOh0GmrrYk', '베트남', '하노이', '라이징 드라곤 레전드 호텔', 21.03252329999999, 105.8538985, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJM9PWf7-rNTERnUG3QY4aniQ', '베트남', '하노이', '카멜리아 호텔 6', 21.0334981, 105.8524779, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJld5RqparNTERVK8x7gvhAZc', '베트남', '하노이', '호아 로 감옥 박물관', 21.0253297, 105.8464781, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJl8nCbJWrNTERew4HOH_pX4U', '베트남', '하노이', '서린 프리미어 호텔', 21.0319595, 105.8476434, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ2ehlkZOrNTERzL1Vpx8rlfM', '베트남', '하노이', '멜리아 하노이 호텔', 21.024347, 105.8486232, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ2UR73byuNTERWMvJGwOBLXM', '베트남', '하노이', '남즈교회', 20.9845607, 105.8890199, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJyVBDX32sNTERWF7ITQqdcrY', '베트남', '하노이', '베트남 공군 박물관', 20.9999719, 105.8298892, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJKaqTe76rNTERinO9mbIYOHw', '베트남', '하노이', '하노이 랑데부 호텔', 21.0324494, 105.851783, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJK9ijgb-rNTERLBz8geHutqY', '베트남', '하노이', '하노이 티란트 호텔', 21.0331996, 105.8522141, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ46E0UJGrNTERWZKWlKdAI3s', '베트남', '하노이', '하노이공안박물관', 21.0242944, 105.8458167, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJY5ql272rNTERK5mstX45rMY', '베트남', '하노이', '노블 앤 스완 부티크 호텔', 21.032651, 105.846249, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ4aZX93GrNTER9eRzL7m91pM', '베트남', '하노이', '레이크사이드호텔(湖邊客棧)', 21.027605, 105.8179852, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ__8jvJWrNTER8SsptLC9ED8', '베트남', '하노이', '호안끼엠 레이크 호텔', 21.0308014, 105.8496879, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJiwm49L2rNTER_vBA45-OSO8', '베트남', '하노이', '라이징 드라곤 에스테이트 호텔', 21.0312315, 105.8453435, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ5zLG-pWrNTERGdezH-2rqDs', '베트남', '하노이', '럭키 3 호텔', 21.030068, 105.8470878, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJIVT_K7-rNTERUlFvpdPvatA', '베트남', '하노이', '추아 꺼우 덩', 21.035982, 105.849683, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJiUJFE8CrNTERHK060qWnXk4', '베트남', '하노이', '탕롱 수상인형극장', 21.0316826, 105.8533466, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJIUDcgL6rNTER2lsmfqTQxT8', '베트남', '하노이', '하노이 시티 호스텔', 21.0341004, 105.8470995, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJiQKhfpWrNTERx3EHfuirrqY', '베트남', '하노이', '골든 썬 빌라 호텔', 21.0301781, 105.8497142, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJIbhTQzmrNTERHBoID7tQyUc', '베트남', '하노이', '베트남 민족학박물관', 21.0403422, 105.7987354, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJi3PpbWqrNTERcL7DLQFRKNw', '베트남', '하노이', '투레공원', 21.0305802, 105.8055016, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJi3I61wSsNTEREPGWbUmEBoY', '베트남', '하노이', '타임즈 시티 아쿠아리움', 20.996341, 105.8680046, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJi18zsL-rNTERcRMExjfmfHw', '베트남', '하노이', '하노이 포커스 호텔', 21.03281, 105.8498625, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJI0BzUKKrNTERQxpT05blVCk', '베트남', '하노이', '레이크사이드 팰리스 호텔', 21.0314715, 105.8506231, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJxZVbuqKrNTER4I2XSRfxbLg', '베트남', '하노이', '하노이깃발탑', 21.0325556, 105.8398039, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJSXwdOKOrNTERNylYj9mnIbU', '베트남', '하노이', '탕롱황성(昇龍皇城)', 21.0352231, 105.8402594, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJsxZg9r6rNTER0VziPI0s96I', '베트남', '하노이', '하노이 버디 인', 21.0339676, 105.8487248, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJxwnWy6usNTERS_TY4hfsH2s', '베트남', '하노이', '하노이 박물관', 21.0099234, 105.7863024, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJHXNVj76rNTERBH-42jeB_00', '베트남', '하노이', '하노이 시티 백패커스 호스텔', 21.0341718, 105.8473719, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJT3KSisCrNTERI9nPWplhUjQ', '베트남', '하노이', '베트남 애플 트래블 홈스테이', 21.0333684, 105.8538863, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ6wlG3fOqNTERporAUcwXt0g', '베트남', '하노이', '베트남 문학 박물관', 21.0709625, 105.8245648, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ7XWEcqGrNTERrsLf6W8259s', '베트남', '하노이', '못꼿 사원(일주사)', 21.0358277, 105.8336206, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJhSHjMrmrNTERt6XqLWz7u_8', '베트남', '하노이', '탕롱 오페라 호텔', 21.0283029, 105.857347, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJTbX4mOurNTERJV-mNCKY1pA', '베트남', '하노이', '소피텔 레전드 메트로폴 하노이', 21.0254125, 105.856375, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ8yTc1xirNTER-6v9RI-w7jQ', '베트남', '하노이', '서호공원', 21.0729824, 105.8172732, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJx4_H0u2rNTERCEU1B-5sZ0s', '베트남', '하노이', '호아빈호텔 平和客棧', 21.0219502, 105.8539013, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJh9x2jpWrNTERpMSWflrmprs', '베트남', '하노이', '하노이 세렌디피티 호텔', 21.0305318, 105.8485743, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJh5k5kmyrNTERs-VDhLpmX6M', '베트남', '하노이', '롯데센터 전망대', 21.0321022, 105.8126712, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJgzR5acCrNTER8-o093-2ZnM', '베트남', '하노이', '바이올렛 호텔', 21.0322884, 105.8535441, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJwyFZi6WrNTER76sqY7OcMjE', '베트남', '하노이', '꽌탄 도교 사원', 21.0430175, 105.8365462, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJgVc9sHWsNTERAob_PrJnpe8', '베트남', '하노이', '리엔파이 탑', 21.0053124, 105.8488212, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJg_8DoZWrNTERmA6DvuEUV8w', '베트남', '하노이', '화려한별부티크호텔', 21.0282612, 105.8481903, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJtWAqmJWrNTERrJatdhT9y-0', '베트남', '하노이', '하노이 럭키 II 호텔', 21.0295075, 105.8489029, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJTxF5HcGrNTERtUIBRve9iYw', '베트남', '하노이', '하노이 호아 두옹 호스텔', 21.0337446, 105.8551911, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ9Y3KR7-rNTERawQ7FeFv5gA', '베트남', '하노이', '박 마 템플', 21.0357826, 105.8510084, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJTZPSYL-rNTER-4vvj6C09yA', '베트남', '하노이', '하노이디스커버리호텔', 21.0347997, 105.8526365, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJfy-VVMerNTERfzjQOJoipXk', '베트남', '하노이', '하노이 구시가 문화교류원', 21.035588, 105.85279, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJfVZXRpGrNTERbkZTVxqHSD0', '베트남', '하노이', '꽌스 사원', 21.0244934, 105.8453387, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJwd9IoKarNTERT3C7BsMeOjU', '베트남', '하노이', '베트남 주석궁', 21.0393042, 105.834477, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJFaisupWrNTEREn9jW0dZ4rQ', '베트남', '하노이', '보데가 호텔', 21.0294608, 105.8457576, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJAdTtPMCrNTERaP33u40P8GY', '베트남', '하노이', '라 스토리아 루비 호텔', 21.032032, 105.848127, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJf-9qTJerNTERgnw2o6MIl5Y', '베트남', '하노이', '뫼벤픽 호텔 하노이', 21.0249157, 105.8441287, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJw1T5usCrNTERRwfjP-zO5Qg', '베트남', '하노이', '라 스위트 호텔 하노이', 21.0352089, 105.853292, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJEQB--OurNTERK41Q2gDyemQ', '베트남', '하노이', '하노이 오페라 하우스', 21.0242438, 105.8576254, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJp4s0qe6rNTER9xX9MObmmnM', '베트남', '하노이', '지질(地質)박물관', 21.0234969, 105.8588105, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJVXiaWFSqNTEReX_wnu3159s', '베트남', '하노이', '금련사', 21.0585474, 105.8330295, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJb-sdLqCrNTER0UkLBD-JnZQ', '베트남', '하노이', '호찌민 박물관', 21.0347407, 105.8320176, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJVc07kr-rNTERqKundK9YJT8', '베트남', '하노이', '하노이 로얄 뷰 호텔', 21.0320506, 105.8539876, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJuXD4lZWrNTERHg2A-7Nc_58', '베트남', '하노이', '메종 오리엔트 호텔', 21.029772, 105.8484703, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJE-Ncn-2rNTER_wtFj_EOg5A', '베트남', '하노이', '힐튼 가든 인 하노이', 21.0195143, 105.8551831, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJC-dYrMCrNTER3MK8LdoitfM', '베트남', '하노이', '럭셔리호텔', 21.0297701, 105.8481347, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJd8ABQryrNTERAPGKjEwJtLo', '베트남', '하노이', '세레니티 다이아몬드 호텔', 21.0343827, 105.8467964, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJce5xxpWrNTERRVXQmb9JNDA', '베트남', '하노이', '피닉스 팰리스 호텔 하노이', 21.0294257, 105.8478614, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJJYfMRE2qNTERgxTCc2zqhnU', '베트남', '하노이', '비엣클라임', 21.0549222, 105.8399222, '2025-05-13 12:43:00', '2025-05-13 12:43:00');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJC044E9kudTERi2Ozcof-Was', '베트남', '호치민', '베트남 전통 ​​의학 박물관 (피토박물관)', 10.7761823, 106.6718875, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJCdzLBRYvdTERpsMyNScNwPE', '베트남', '호치민', '부이비엔 워킹 스트리트', 10.7674231, 106.6939905, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJv3u21EkvdTERd8RlwzZlJMI', '베트남', '호치민', '노보텔 사이공 센터', 10.7843175, 106.6959611, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJdRwXXUcvdTER_epqc3PGm_s', '베트남', '호치민', '세도나 스위트 호치민 시티', 10.772939, 106.7004885, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJuWO_kD4vdTERsrPgrKR1aY0', '베트남', '호치민', '더 화이트 호텔', 10.7792651, 106.704826, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJc_9VekYvdTERtvfHUbJKWBA', '베트남', '호치민', '카라벨 사이공', 10.7762617, 106.7036128, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJe09mlz4vdTER5314yHjYGpo', '베트남', '호치민', '송 안 3 호텔', 10.7715385, 106.6973073, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJAZR6vj8vdTERcXOPOeBVrc0', '베트남', '호치민', '홍 비나 럭셔리', 10.7679462, 106.6975123, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJpV-7MUovdTERS3tmu3Rt9kw', '베트남', '호치민', '소피텔 사이공 플라자', 10.7840772, 106.7025694, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJVZKCP0EvdTERfHvs6AfGjok', '베트남', '호치민', '사이공 스카이덱', 10.7715673, 106.7042465, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJez6Gw30OQjERUYh6VwTcFj4', '베트남', '호치민', '리틀 사이공 부티크 호텔', 10.7747239, 106.7001988, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJf1gziDwvdTERWyvojyS-heg', '베트남', '호치민', '그랜드 호텔 사이공', 10.7742233, 106.7053451, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJA7OD2cYodTERwE2NcHbRMfc', '베트남', '호치민', '탄 투 호텔', 10.7719423, 106.6968268, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJA0FSQqEvdTERuUNes8gZ6-I', '베트남', '호치민', '비엣토피아', 10.7415542, 106.6950039, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJFffW-kYvdTER43H2mD8lla4', '베트남', '호치민', '오스카 사이공 호텔', 10.7748014, 106.7033222, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJA0evAkgvdTERLNUql8b4ipU', '베트남', '호치민', '쉐라톤 사이공 호텔 앤드 타워', 10.7754461, 106.7038779, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJTyQPti8pdTERC3TahLdyYzQ', '베트남', '호치민', '남동부 국군 박물관', 10.8000121, 106.6661806, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ9aHU7UUvdTERwvaHOXtRzVI', '베트남', '호치민', '똔득탕 박물관', 10.7772882, 106.7066269, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJWwkxBUwvdTERHxWYqmRizUk', '베트남', '호치민', '비엔동 호텔', 10.7680419, 106.6919951, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJGyPlSPEudTEREq2OnKfg380', '베트남', '호치민', '꽌암사원', 10.7541333, 106.6596253, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJTeYpMT8vdTERMH8sUnkta40', '베트남', '호치민', '벤탄시장', 10.7725168, 106.6980208, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJx7wwM0svdTERjuH2a9dkuU0', '베트남', '호치민', '사이공 동식물원', 10.7873344, 106.7050566, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ964TI0QvdTERZk66I7cQohI', '베트남', '호치민', '리버티 센트럴 사이공 리버사이드 호텔', 10.774102, 106.706214, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJXe4pK8EodTERg6bFGi62V8Y', '베트남', '호치민', '안 탐 호텔', 10.7719668, 106.6970106, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJHRaM2EgvdTER34mcDwqQCP8', '베트남', '호치민', '티엔 슈안 호텔', 10.773983, 106.698598, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ8SVEkT4vdTERHSfhcCRjPUY', '베트남', '호치민', '파라다이스 사이공 부티크 호텔 & 스파', 10.771538, 106.694927, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJT8VzzzAvdTERyVactXSsuCI', '베트남', '호치민', '빅토리 사이공 호텔', 10.7803537, 106.6936032, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJhVoKJiQvdTERgTDgHl_sSUs', '베트남', '호치민', '르네상스 리버사이드 호텔 사이공', 10.7744, 106.70618, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJhXqqh0gvdTER59zPgW4l-ec', '베트남', '호치민', '골든 스타 호텔', 10.7787611, 106.702936, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJhZAdDkAvdTERfvVb-VhHhzE', '베트남', '호치민', '보스 3 호텔', 10.7685254, 106.7006007, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ65FlABYvdTERbt7ftIwNQ5Q', '베트남', '호치민', '뉴 서니 호텔', 10.7681578, 106.6936759, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJRxtlp0gvdTERGg6rVLBCqXU', '베트남', '호치민', '실버랜드 졸리에 호텔 & 스파', 10.777352, 106.705919, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ4RqUkJkudTER-QHI35eZcWI', '베트남', '호치민', '담센 워터파크', 10.7688947, 106.6359939, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJRe283D4vdTERxDphUTZfOSE', '베트남', '호치민', '발리 부티크 벤 탄 호텔', 10.7719731, 106.6962072, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJjzdozUUvdTERBJygjfRvnhQ', '베트남', '호치민', '쩐흥다오 동상', 10.7753042, 106.7064721, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJk56RuTgvdTERnadZWYFYbVQ', '베트남', '호치민', '리버티 센트럴 사이공 센터 호텔', 10.7736473, 106.698682, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ3zvE-0gvdTERITTyMFslbwE', '베트남', '호치민', '실버랜드 실 호텔 & 스파', 10.780106, 106.703879, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ38jv2cYodTERKEwTzF1p1zQ', '베트남', '호치민', '코친 상 호텔', 10.7719236, 106.6969637, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJqxN4kkgvdTERZpkl-Nqzcik', '베트남', '호치민', '사이공 스타 호텔', 10.7751522, 106.6905212, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJKcrnSUYvdTERO64MErYx9VU', '베트남', '호치민', '호치민 오페라 하우스', 10.7762182, 106.7028061, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJL0dwVTgvdTERao3t8B1Jhxc', '베트남', '호치민', '베트남 통일궁', 10.7769942, 106.6953021, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJn_6CMc4ldTERfau3dKJESPI', '베트남', '호치민', '스노우타운 사이공', 10.7737495, 106.7627439, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJN6yML0YvdTERu3qIwePETD0', '베트남', '호치민', '파크 하얏트 사이공', 10.7777514, 106.7033802, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ25VPnkcvdTERSLUZtdUn4co', '베트남', '호치민', '렉스 호텔', 10.7758454, 106.7012646, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJOQYLJDwvdTERagMkn6pCb0E', '베트남', '호치민', '사누바 사이공 호텔', 10.7732098, 106.6963194, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJ1dwSWjwvdTERF9s4Fu42zYw', '베트남', '호치민', '시나몬 호텔 사이공', 10.7714646, 106.6914749, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJZfXdjj4vdTER1-XCkv7ltio', '베트남', '호치민', '뉴월드 사이공 호텔', 10.7708719, 106.6951897, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJq6tuBUQvdTERPrUo2ili-N4', '베트남', '호치민', '롯데호텔 사이공', 10.7786426, 106.7067745, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJzQQRKykvdTERjImQkK3Lw68', '베트남', '호치민', '응우옌 후에 광장', 10.7744176, 106.7032447, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJzwg3ojAvdTERqnQUK99K2Xw', '베트남', '호치민', '호치민 전쟁박물관', 10.7795106, 106.6920916, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJow2MCUgvdTERLmE-ZvwKvXE', '베트남', '호치민', '호텔 콘티넨탈 사이공', 10.7768949, 106.7025025, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJZx2IA0YvdTERlS25i6FeG0Q', '베트남', '호치민', '아구아리 호텔', 10.7774032, 106.7052435, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJUSTY5jcvdTERRVvtbJNZT-g', '베트남', '호치민', '호치민 노트르담 대성당', 10.7797855, 106.6990189, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJjTF8ikcvdTERFs5iXqfrm-I', '베트남', '호치민', '골든 센트럴 호텔 사이공', 10.7736721, 106.6963424, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
+INSERT INTO planner.place (place_id, country, city, place_name, latitude, longitude, created_at, updated_at) VALUES ('ChIJjwCBP5EvdTERISvBTuu7QhM', '베트남', '호치민', '비엔동 호텔', 10.7302793, 106.7070286, '2025-05-13 12:43:31', '2025-05-13 12:43:31');
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
new file mode 100644
index 0000000..d1ccaf4
--- /dev/null
+++ b/src/main/resources/schema.sql
@@ -0,0 +1,19 @@
+create table if not exists city (
+   id int not null auto_increment comment 'id',
+    city_name varchar(40) not null comment '도시이름',
+    latitude decimal(10,6) not null comment '위도',
+    longitude decimal(10,6) not null comment '경도',
+    city_range int not null comment '도시 범위',
+   primary key (id)
+);
+
+CREATE TABLE IF NOT EXISTS place (
+    place_id VARCHAR(255) NOT NULL PRIMARY KEY COMMENT 'Place ID from Google Places API',
+    country VARCHAR(100) NOT NULL COMMENT 'Country Name',
+    city VARCHAR(100) NOT NULL COMMENT 'City Name',
+    place_name VARCHAR(255) NOT NULL COMMENT 'Place Name',
+    latitude DECIMAL(10, 6) NOT NULL COMMENT 'Latitude',
+    longitude DECIMAL(10, 6) NOT NULL COMMENT 'Longitude',
+    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP COMMENT 'Creation Timestamp',
+    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'Last Updated Timestamp'
+);
\ No newline at end of file
diff --git a/src/main/resources/translate.json b/src/main/resources/translate.json
new file mode 100644
index 0000000..65c6ca9
--- /dev/null
+++ b/src/main/resources/translate.json
@@ -0,0 +1,16 @@
+{
+  "Japan": "일본",
+  "Vietnam": "베트남",
+  "Tokyo": "도쿄",
+  "오사카부": "오사카",
+  "Osaka": "오사카",
+  "Kyoto": "교토",
+  "교토부": "교토",
+  "Hà Nội": "하노이",
+  "Hồ Chí Minh": "호치민",
+  "Ho Chi Minh City" : "호치민",
+  "Đà Nẵng": "다낭",
+  "Da Nang": "다낭",
+  "Quảng Nam": "다낭",
+  "京都府": "교토"
+}
\ No newline at end of file
diff --git a/src/test/java/grepp/NBE5_6_2_Team03/domain/admin/place/PlaceServiceTest.java b/src/test/java/grepp/NBE5_6_2_Team03/domain/admin/place/PlaceServiceTest.java
new file mode 100644
index 0000000..25d6b16
--- /dev/null
+++ b/src/test/java/grepp/NBE5_6_2_Team03/domain/admin/place/PlaceServiceTest.java
@@ -0,0 +1,43 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class PlaceServiceTest {
+
+    @Autowired
+    private GooglePlaceService placeService;
+
+    @Test
+    @DisplayName(value = "")
+    void getPlaceIds() throws IOException {
+        List<String> attraction = placeService.searchPlaceIds(34.6937,135.5023, 7000, "tourist_attraction", 1);
+        List<String> restaurant = placeService.searchPlaceIds(34.6937,135.5023, 7000, "restaurant", 1);
+        System.out.println("attraction : "+attraction.toString());
+        System.out.println("restaurant : "+restaurant.toString());
+    }
+
+    @Test
+    void getDetailsByPlaceIdTest() throws IOException {
+        Place results = placeService.getDetailsByPlaceId("ChIJI_--Eg3nAGARcvVi6kRKyKM");
+        System.out.println(results);
+    }
+
+    @Test
+    void getDetailsByPlaceIds() throws IOException {
+        List<String> results = placeService.searchPlaceIds(34.6937, 135.5023, 7000, "tourist_attraction", 1);
+        Set<String> placeIdSet = new HashSet<>(results);
+        Map<String, Place> detailsByPlaceIds = placeService.getDetailsByPlaceIds(placeIdSet);
+        System.out.println("wyatt: " + detailsByPlaceIds);
+    }
+}
+


Reviews:
user: login: doyun-a
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-05-13T05:04:53Z
user: login: Tokwasp
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T05:17:58Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T05:21:22Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T05:26:02Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T05:26:58Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T05:29:15Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T05:34:31Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T05:37:19Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T05:37:25Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T05:40:04Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T06:10:17Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T06:11:12Z
user: login: Tokwasp
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T06:38:41Z
user: login: Tokwasp
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T06:51:43Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T07:29:59Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T07:37:28Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T07:38:38Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T07:39:00Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T07:41:06Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T07:41:19Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T07:42:48Z
user: login: Tokwasp
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T07:44:39Z
user: login: Tokwasp
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T07:45:26Z
user: login: NoviceWyatt19
state: COMMENTED
author_association: COLLABORATOR
submitted_at: 2025-05-13T08:06:24Z
user: login: Tokwasp
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-05-13T08:14:34Z
user: login: hyeunS-P
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-05-13T08:17:15Z

Review comments:
diff_hunk: @@ -0,0 +1,23 @@
+package grepp.NBE5_6_2_Team03.api.controller.admin.place.dto;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter @Setter @ToString
+@NoArgsConstructor
path: src/main/java/grepp/NBE5_6_2_Team03/api/controller/admin/place/dto/CityDto.java
user: login: Tokwasp
body: 해당 어노테이션이 모두 필요한가요?
created_at: 2025-05-13T05:04:35Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,41 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityDto;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.CityRepository;
+import java.util.List;
+import java.util.stream.Collectors;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class CityService {
+    private final CityRepository cityRepository;
+
+    public City getCityEntity(String cityName) {
+        return cityRepository.findByCityName(cityName)
+            .orElseThrow(() -> new IllegalArgumentException("City not found"));
+    }
+
+    public CityDto toDto(String cityName) {
+        City city = getCityEntity(cityName);
+        return new CityDto(
+            city.getCityName(),
+            city.getLatitude(),
+            city.getLongitude(),
+            city.getCityRange()
+        );
+    }
+
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/CityService.java
user: login: Tokwasp
body: 찾은 값을 Dto로 만들어서 반환한다는 의미인것 같아요 맞을까요?
1. Dto라는 이름이 모호 하다고 생각합니다. 요청인지 응답인지 이름을 명확히 하는게 좋다고 생각 합니다.
2. 서비스 코드에서 response를 만드는 것이 아니라 response에게 entity를 넘겨서
 내부에서 만들면 서비스 코드가 줄어들지 않을까요?
created_at: 2025-05-13T05:08:24Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,41 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityDto;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.CityRepository;
+import java.util.List;
+import java.util.stream.Collectors;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class CityService {
+    private final CityRepository cityRepository;
+
+    public City getCityEntity(String cityName) {
+        return cityRepository.findByCityName(cityName)
+            .orElseThrow(() -> new IllegalArgumentException("City not found"));
+    }
+
+    public CityDto toDto(String cityName) {
+        City city = getCityEntity(cityName);
+        return new CityDto(
+            city.getCityName(),
+            city.getLatitude(),
+            city.getLongitude(),
+            city.getCityRange()
+        );
+    }
+
+    public List<CityDto> getAllCities() {
+        return cityRepository.findAll().stream()
+            .map(city -> new CityDto(
+                city.getCityName(),
+                city.getLatitude(),
+                city.getLongitude(),
+                city.getCityRange()
+            ))
+            .collect(Collectors.toList());
+    }
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/CityService.java
user: login: Tokwasp
body: 스트림 돌리는 로직을 추상화여 따로 빼는게 서비스 코드 가독성이 더 좋지 않을까요?
ex) List<City> cities = findAll();
cities.convertToResponse();
created_at: 2025-05-13T05:10:14Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,155 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.PlaceRepository;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+@Service
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class GooglePlaceService {
+
+    private final PlaceRepository placeRepository;
+
+    @Value("${google.maps.api.key}")
+    private String apiKey;
+
+    private final RestTemplate restTemplate;
+    private final List<String> fields = List.of("name", "geometry/location",
+    "address_components", "formatted_address", "photos");
+
+    /**
+     * limit은 최대 3번까지 가능, next_page_token 이 있는 경우 한정
+     */
+    public List<String> searchPlaceIds(double lat, double lng, int radius, String type, int limit) {
+        List<String> placeIds = new ArrayList<>();
+        String nextPageToken = null;
+        int attempt = 0;
+
+        do {
+            URI uri = UriComponentsBuilder
+                .fromHttpUrl("https://maps.googleapis.com/maps/api/place/nearbysearch/json")
+                .queryParam("location", lat + "," + lng)
+                .queryParam("radius", radius)
+                .queryParam("type", type)
+                .queryParam("key", apiKey)
+                .queryParamIfPresent("pagetoken", nextPageToken == null ? java.util.Optional.empty() : java.util.Optional.of(nextPageToken))
+                .build()
+                .encode()
+                .toUri();
+
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/GooglePlaceService.java
user: login: Tokwasp
body: uri 만드는 부분을 추상화 해서 createUri 정도로 빼면 가독성이 좋지 않을까요?
created_at: 2025-05-13T05:10:53Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,155 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.PlaceRepository;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+@Service
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class GooglePlaceService {
+
+    private final PlaceRepository placeRepository;
+
+    @Value("${google.maps.api.key}")
+    private String apiKey;
+
+    private final RestTemplate restTemplate;
+    private final List<String> fields = List.of("name", "geometry/location",
+    "address_components", "formatted_address", "photos");
+
+    /**
+     * limit은 최대 3번까지 가능, next_page_token 이 있는 경우 한정
+     */
+    public List<String> searchPlaceIds(double lat, double lng, int radius, String type, int limit) {
+        List<String> placeIds = new ArrayList<>();
+        String nextPageToken = null;
+        int attempt = 0;
+
+        do {
+            URI uri = UriComponentsBuilder
+                .fromHttpUrl("https://maps.googleapis.com/maps/api/place/nearbysearch/json")
+                .queryParam("location", lat + "," + lng)
+                .queryParam("radius", radius)
+                .queryParam("type", type)
+                .queryParam("key", apiKey)
+                .queryParamIfPresent("pagetoken", nextPageToken == null ? java.util.Optional.empty() : java.util.Optional.of(nextPageToken))
+                .build()
+                .encode()
+                .toUri();
+
+            JsonNode root = restTemplate.getForObject(uri, JsonNode.class);
+            JsonNode results = root.path("results");
+
+            extractPlaceId(results, placeIds);
+
+            nextPageToken = root.path("next_page_token").asText(null);
+            attempt++;
+
+            // next_page_token 를 포함한 요청은 2-5초후 요청해야 INVALID Request 가 안뜸
+            if (nextPageToken != null) {
+                try {
+                    Thread.sleep(3000);
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    break;
+                }
+            }
+        } while (nextPageToken != null && attempt < limit);
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/GooglePlaceService.java
user: login: Tokwasp
body: do while을 꼭 사용해야 하는 이유가 있을까요?
created_at: 2025-05-13T05:11:35Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,155 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.PlaceRepository;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+@Service
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class GooglePlaceService {
+
+    private final PlaceRepository placeRepository;
+
+    @Value("${google.maps.api.key}")
+    private String apiKey;
+
+    private final RestTemplate restTemplate;
+    private final List<String> fields = List.of("name", "geometry/location",
+    "address_components", "formatted_address", "photos");
+
+    /**
+     * limit은 최대 3번까지 가능, next_page_token 이 있는 경우 한정
+     */
+    public List<String> searchPlaceIds(double lat, double lng, int radius, String type, int limit) {
+        List<String> placeIds = new ArrayList<>();
+        String nextPageToken = null;
+        int attempt = 0;
+
+        do {
+            URI uri = UriComponentsBuilder
+                .fromHttpUrl("https://maps.googleapis.com/maps/api/place/nearbysearch/json")
+                .queryParam("location", lat + "," + lng)
+                .queryParam("radius", radius)
+                .queryParam("type", type)
+                .queryParam("key", apiKey)
+                .queryParamIfPresent("pagetoken", nextPageToken == null ? java.util.Optional.empty() : java.util.Optional.of(nextPageToken))
+                .build()
+                .encode()
+                .toUri();
+
+            JsonNode root = restTemplate.getForObject(uri, JsonNode.class);
+            JsonNode results = root.path("results");
+
+            extractPlaceId(results, placeIds);
+
+            nextPageToken = root.path("next_page_token").asText(null);
+            attempt++;
+
+            // next_page_token 를 포함한 요청은 2-5초후 요청해야 INVALID Request 가 안뜸
+            if (nextPageToken != null) {
+                try {
+                    Thread.sleep(3000);
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    break;
+                }
+            }
+        } while (nextPageToken != null && attempt < limit);
+
+        return placeIds;
+    }
+
+    /**
+     * 구글 주변 검색 결과 중 placeId만 추출
+     */
+    private static void extractPlaceId(JsonNode results, List<String> placeIds) {
+        if (results.isArray()) {
+            for (JsonNode result : results) {
+                String status = result.path("business_status").asText();
+                if ("OPERATIONAL".equals(status)) {
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/GooglePlaceService.java
user: login: Tokwasp
body: OPERATIONAL 값은 의미 있는 상수로 빼는게 좋지 않을까요?
created_at: 2025-05-13T05:12:32Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,155 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.PlaceRepository;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+@Service
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class GooglePlaceService {
+
+    private final PlaceRepository placeRepository;
+
+    @Value("${google.maps.api.key}")
+    private String apiKey;
+
+    private final RestTemplate restTemplate;
+    private final List<String> fields = List.of("name", "geometry/location",
+    "address_components", "formatted_address", "photos");
+
+    /**
+     * limit은 최대 3번까지 가능, next_page_token 이 있는 경우 한정
+     */
+    public List<String> searchPlaceIds(double lat, double lng, int radius, String type, int limit) {
+        List<String> placeIds = new ArrayList<>();
+        String nextPageToken = null;
+        int attempt = 0;
+
+        do {
+            URI uri = UriComponentsBuilder
+                .fromHttpUrl("https://maps.googleapis.com/maps/api/place/nearbysearch/json")
+                .queryParam("location", lat + "," + lng)
+                .queryParam("radius", radius)
+                .queryParam("type", type)
+                .queryParam("key", apiKey)
+                .queryParamIfPresent("pagetoken", nextPageToken == null ? java.util.Optional.empty() : java.util.Optional.of(nextPageToken))
+                .build()
+                .encode()
+                .toUri();
+
+            JsonNode root = restTemplate.getForObject(uri, JsonNode.class);
+            JsonNode results = root.path("results");
+
+            extractPlaceId(results, placeIds);
+
+            nextPageToken = root.path("next_page_token").asText(null);
+            attempt++;
+
+            // next_page_token 를 포함한 요청은 2-5초후 요청해야 INVALID Request 가 안뜸
+            if (nextPageToken != null) {
+                try {
+                    Thread.sleep(3000);
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    break;
+                }
+            }
+        } while (nextPageToken != null && attempt < limit);
+
+        return placeIds;
+    }
+
+    /**
+     * 구글 주변 검색 결과 중 placeId만 추출
+     */
+    private static void extractPlaceId(JsonNode results, List<String> placeIds) {
+        if (results.isArray()) {
+            for (JsonNode result : results) {
+                String status = result.path("business_status").asText();
+                if ("OPERATIONAL".equals(status)) {
+                    String placeId = result.path("place_id").asText();
+                    placeIds.add(placeId);
+                }
+            }
+        }
+    }
+
+    public Map<String, Place> getDetailsByPlaceIds(Set<String> placeIds) {
+        Map<String, Place> resultMap = new HashMap<>();
+
+        for (String id : placeIds) {
+            Place place = getDetailsByPlaceId(id);
+            place.setPlaceId(id);
+            resultMap.put(id, place);
+        }
+
+        return resultMap;
+    }
+
+    public Place getDetailsByPlaceId(String placeId) {
+
+        String fieldsString = String.join(",", fields);
+        URI uri = UriComponentsBuilder
+            .fromHttpUrl("https://maps.googleapis.com/maps/api/place/details/json")
+            .queryParam("place_id", placeId)
+            .queryParam("language", "ko")
+            .queryParam("key", apiKey)
+            .build()
+            .encode()
+            .toUri();
+
+        JsonNode root = restTemplate.getForObject(uri, JsonNode.class);
+        JsonNode result = root.path("result");
+
+        String name = result.path("name").asText();
+        JsonNode geometry = result.path("geometry").path("location");
+        double lat = geometry.path("lat").asDouble();
+        double lng = geometry.path("lng").asDouble();
+        String address = result.path("formatted_address").asText();
+        String country = null;
+        String city = null;
+
+        for (JsonNode component : result.path("address_components")) {
+            JsonNode types = component.path("types");
+            for (JsonNode type : types) {
+                String typeText = type.asText();
+                if (typeText.equals("country")) {
+                    country = component.path("long_name").asText();
+                } else if (typeText.equals("administrative_area_level_1")) {
+                    city = component.path("long_name").asText();
+                }
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/GooglePlaceService.java
user: login: Tokwasp
body: 이부분은 스트림으로 변경하지 못하는 부분일까요?
created_at: 2025-05-13T05:13:17Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,155 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.PlaceRepository;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+@Service
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class GooglePlaceService {
+
+    private final PlaceRepository placeRepository;
+
+    @Value("${google.maps.api.key}")
+    private String apiKey;
+
+    private final RestTemplate restTemplate;
+    private final List<String> fields = List.of("name", "geometry/location",
+    "address_components", "formatted_address", "photos");
+
+    /**
+     * limit은 최대 3번까지 가능, next_page_token 이 있는 경우 한정
+     */
+    public List<String> searchPlaceIds(double lat, double lng, int radius, String type, int limit) {
+        List<String> placeIds = new ArrayList<>();
+        String nextPageToken = null;
+        int attempt = 0;
+
+        do {
+            URI uri = UriComponentsBuilder
+                .fromHttpUrl("https://maps.googleapis.com/maps/api/place/nearbysearch/json")
+                .queryParam("location", lat + "," + lng)
+                .queryParam("radius", radius)
+                .queryParam("type", type)
+                .queryParam("key", apiKey)
+                .queryParamIfPresent("pagetoken", nextPageToken == null ? java.util.Optional.empty() : java.util.Optional.of(nextPageToken))
+                .build()
+                .encode()
+                .toUri();
+
+            JsonNode root = restTemplate.getForObject(uri, JsonNode.class);
+            JsonNode results = root.path("results");
+
+            extractPlaceId(results, placeIds);
+
+            nextPageToken = root.path("next_page_token").asText(null);
+            attempt++;
+
+            // next_page_token 를 포함한 요청은 2-5초후 요청해야 INVALID Request 가 안뜸
+            if (nextPageToken != null) {
+                try {
+                    Thread.sleep(3000);
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    break;
+                }
+            }
+        } while (nextPageToken != null && attempt < limit);
+
+        return placeIds;
+    }
+
+    /**
+     * 구글 주변 검색 결과 중 placeId만 추출
+     */
+    private static void extractPlaceId(JsonNode results, List<String> placeIds) {
+        if (results.isArray()) {
+            for (JsonNode result : results) {
+                String status = result.path("business_status").asText();
+                if ("OPERATIONAL".equals(status)) {
+                    String placeId = result.path("place_id").asText();
+                    placeIds.add(placeId);
+                }
+            }
+        }
+    }
+
+    public Map<String, Place> getDetailsByPlaceIds(Set<String> placeIds) {
+        Map<String, Place> resultMap = new HashMap<>();
+
+        for (String id : placeIds) {
+            Place place = getDetailsByPlaceId(id);
+            place.setPlaceId(id);
+            resultMap.put(id, place);
+        }
+
+        return resultMap;
+    }
+
+    public Place getDetailsByPlaceId(String placeId) {
+
+        String fieldsString = String.join(",", fields);
+        URI uri = UriComponentsBuilder
+            .fromHttpUrl("https://maps.googleapis.com/maps/api/place/details/json")
+            .queryParam("place_id", placeId)
+            .queryParam("language", "ko")
+            .queryParam("key", apiKey)
+            .build()
+            .encode()
+            .toUri();
+
+        JsonNode root = restTemplate.getForObject(uri, JsonNode.class);
+        JsonNode result = root.path("result");
+
+        String name = result.path("name").asText();
+        JsonNode geometry = result.path("geometry").path("location");
+        double lat = geometry.path("lat").asDouble();
+        double lng = geometry.path("lng").asDouble();
+        String address = result.path("formatted_address").asText();
+        String country = null;
+        String city = null;
+
+        for (JsonNode component : result.path("address_components")) {
+            JsonNode types = component.path("types");
+            for (JsonNode type : types) {
+                String typeText = type.asText();
+                if (typeText.equals("country")) {
+                    country = component.path("long_name").asText();
+                } else if (typeText.equals("administrative_area_level_1")) {
+                    city = component.path("long_name").asText();
+                }
+            }
+        }
+
+        return new Place(country, city, name, address, lat, lng);
+    }
+
+    @Transactional
+    public void saveAll(Collection<Place> values) {
+        placeRepository.saveAll(values);
+    }
+
+    @Transactional
+    public void save(Place place) {
+        placeRepository.save(place);
+    }
+
+    public boolean isDataInitialized() {
+        return placeRepository.count() > 0;
+    }
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/GooglePlaceService.java
user: login: Tokwasp
body: count 쿼리를 사용 하게 되면 테이블을 풀스캔 하는게 맞을까요?
created_at: 2025-05-13T05:14:13Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,48 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.PrePersist;
+import jakarta.persistence.PreUpdate;
+import jakarta.persistence.Table;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@Entity
+@Table(name = "place")
+@Getter @Setter @ToString
+@NoArgsConstructor
+public class Place {
+
+    @Id
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/Place.java
user: login: Tokwasp
body: 키 생성 전략이 빠져있습니다.
created_at: 2025-05-13T05:14:46Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,48 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.PrePersist;
+import jakarta.persistence.PreUpdate;
+import jakarta.persistence.Table;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@Entity
+@Table(name = "place")
+@Getter @Setter @ToString
+@NoArgsConstructor
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/Place.java
user: login: Tokwasp
body: 모두 사용하는 어노테이션 인가요?
created_at: 2025-05-13T05:15:10Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,48 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.PrePersist;
+import jakarta.persistence.PreUpdate;
+import jakarta.persistence.Table;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@Entity
+@Table(name = "place")
+@Getter @Setter @ToString
+@NoArgsConstructor
+public class Place {
+
+    @Id
+    private String placeId;
+    private String country;
+    private String city;
+    private String placeName;
+    private Double latitude;
+    private Double longitude;
+    private LocalDateTime createdAt = LocalDateTime.now();
+    private LocalDateTime updatedAt = LocalDateTime.now();
+
+
+    public Place(String country, String city, String placeName, String address, Double latitude, Double longitude) {
+        this.country = country;
+        this.city = city;
+        this.placeName = placeName;
+        this.latitude = latitude;
+        this.longitude = longitude;
+    }
+
+    @PrePersist
+    public void prePersist() {
+        createdAt = LocalDateTime.now();  // 객체가 처음 저장될 때 생성 시간설정
+        updatedAt = LocalDateTime.now();  // 처음 저장될 때 업데이트 시간도 설정
+    }
+    @PreUpdate
+    public void preUpdate() {
+        updatedAt = LocalDateTime.now();  // 업데이트 시 업데이트 시간설정
+    }
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/Place.java
user: login: Tokwasp
body: Jpa Auditing을 사용 하여 BaseEntity에 생성일자, 수정일자를 바꾸면 되서 따로 안넣어주셔도 될것 같아요
created_at: 2025-05-13T05:16:10Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,16 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.repository;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import java.util.Optional;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/repository/CityRepository.java
user: login: Tokwasp
body: spring data jpa를 사용하시면 @Repository 어노테이션이 없어도 됩니다.
created_at: 2025-05-13T05:16:30Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,11 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.repository;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import java.util.Collection;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/repository/PlaceRepository.java
user: login: Tokwasp
body: 마찬가지 입니다.
created_at: 2025-05-13T05:16:38Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,23 @@
+package grepp.NBE5_6_2_Team03.api.controller.admin.place.dto;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter @Setter @ToString
+@NoArgsConstructor
path: src/main/java/grepp/NBE5_6_2_Team03/api/controller/admin/place/dto/CityDto.java
user: login: NoviceWyatt19
body: 현재 Getter 말고는 사용할 일이 없네요 Getter 이외에 모두 지우겠습니다
created_at: 2025-05-13T05:21:22Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,155 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.PlaceRepository;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+@Service
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class GooglePlaceService {
+
+    private final PlaceRepository placeRepository;
+
+    @Value("${google.maps.api.key}")
+    private String apiKey;
+
+    private final RestTemplate restTemplate;
+    private final List<String> fields = List.of("name", "geometry/location",
+    "address_components", "formatted_address", "photos");
+
+    /**
+     * limit은 최대 3번까지 가능, next_page_token 이 있는 경우 한정
+     */
+    public List<String> searchPlaceIds(double lat, double lng, int radius, String type, int limit) {
+        List<String> placeIds = new ArrayList<>();
+        String nextPageToken = null;
+        int attempt = 0;
+
+        do {
+            URI uri = UriComponentsBuilder
+                .fromHttpUrl("https://maps.googleapis.com/maps/api/place/nearbysearch/json")
+                .queryParam("location", lat + "," + lng)
+                .queryParam("radius", radius)
+                .queryParam("type", type)
+                .queryParam("key", apiKey)
+                .queryParamIfPresent("pagetoken", nextPageToken == null ? java.util.Optional.empty() : java.util.Optional.of(nextPageToken))
+                .build()
+                .encode()
+                .toUri();
+
+            JsonNode root = restTemplate.getForObject(uri, JsonNode.class);
+            JsonNode results = root.path("results");
+
+            extractPlaceId(results, placeIds);
+
+            nextPageToken = root.path("next_page_token").asText(null);
+            attempt++;
+
+            // next_page_token 를 포함한 요청은 2-5초후 요청해야 INVALID Request 가 안뜸
+            if (nextPageToken != null) {
+                try {
+                    Thread.sleep(3000);
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    break;
+                }
+            }
+        } while (nextPageToken != null && attempt < limit);
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/GooglePlaceService.java
user: login: NoviceWyatt19
body: while도 상관은 없지만 내부 코드가 길어서 do while이 더 읽기 좋지않을까 생각했습니다
created_at: 2025-05-13T05:26:02Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,155 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.PlaceRepository;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+@Service
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class GooglePlaceService {
+
+    private final PlaceRepository placeRepository;
+
+    @Value("${google.maps.api.key}")
+    private String apiKey;
+
+    private final RestTemplate restTemplate;
+    private final List<String> fields = List.of("name", "geometry/location",
+    "address_components", "formatted_address", "photos");
+
+    /**
+     * limit은 최대 3번까지 가능, next_page_token 이 있는 경우 한정
+     */
+    public List<String> searchPlaceIds(double lat, double lng, int radius, String type, int limit) {
+        List<String> placeIds = new ArrayList<>();
+        String nextPageToken = null;
+        int attempt = 0;
+
+        do {
+            URI uri = UriComponentsBuilder
+                .fromHttpUrl("https://maps.googleapis.com/maps/api/place/nearbysearch/json")
+                .queryParam("location", lat + "," + lng)
+                .queryParam("radius", radius)
+                .queryParam("type", type)
+                .queryParam("key", apiKey)
+                .queryParamIfPresent("pagetoken", nextPageToken == null ? java.util.Optional.empty() : java.util.Optional.of(nextPageToken))
+                .build()
+                .encode()
+                .toUri();
+
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/GooglePlaceService.java
user: login: NoviceWyatt19
body: 네 어차피 uri를 바꿀일이 없으니 따로 빼두는게 가독성이 좋겠습니다 이것도 바꾸겠습니다
created_at: 2025-05-13T05:26:58Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,41 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityDto;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.CityRepository;
+import java.util.List;
+import java.util.stream.Collectors;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class CityService {
+    private final CityRepository cityRepository;
+
+    public City getCityEntity(String cityName) {
+        return cityRepository.findByCityName(cityName)
+            .orElseThrow(() -> new IllegalArgumentException("City not found"));
+    }
+
+    public CityDto toDto(String cityName) {
+        City city = getCityEntity(cityName);
+        return new CityDto(
+            city.getCityName(),
+            city.getLatitude(),
+            city.getLongitude(),
+            city.getCityRange()
+        );
+    }
+
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/CityService.java
user: login: NoviceWyatt19
body: 네 말씀하신 의미가 같습니다. 해당 코드는 수업코드를 참조하며 만들었는데 말씀하신대로 response에게 entity를 넘겨서 내부에서 만들어 서비스에 보내도록 해보겠습니다. 이거는 구글 주변 검색을 위한 파라메터값들을 받아 오는 것이니 cityParamResponse같은 네이밍으로 하겠습니다
created_at: 2025-05-13T05:29:15Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,48 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.PrePersist;
+import jakarta.persistence.PreUpdate;
+import jakarta.persistence.Table;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@Entity
+@Table(name = "place")
+@Getter @Setter @ToString
+@NoArgsConstructor
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/Place.java
user: login: NoviceWyatt19
body: ToString은 필요없겠네요 지우겠습니다.
created_at: 2025-05-13T05:34:30Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,16 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.repository;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import java.util.Optional;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+@Repository
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/repository/CityRepository.java
user: login: NoviceWyatt19
body: 고치겠습니다
created_at: 2025-05-13T05:37:19Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,11 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.repository;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import java.util.Collection;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/repository/PlaceRepository.java
user: login: NoviceWyatt19
body: 넵!
created_at: 2025-05-13T05:37:25Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,48 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.PrePersist;
+import jakarta.persistence.PreUpdate;
+import jakarta.persistence.Table;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@Entity
+@Table(name = "place")
+@Getter @Setter @ToString
+@NoArgsConstructor
+public class Place {
+
+    @Id
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/Place.java
user: login: NoviceWyatt19
body: 해당 엔티티의 id는 구글 placeId를 그대로 넣을 목적으로 만든것이라 별도의 키 생성 전략을 넣지 않았습니다
created_at: 2025-05-13T05:40:04Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,41 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityDto;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.CityRepository;
+import java.util.List;
+import java.util.stream.Collectors;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class CityService {
+    private final CityRepository cityRepository;
+
+    public City getCityEntity(String cityName) {
+        return cityRepository.findByCityName(cityName)
+            .orElseThrow(() -> new IllegalArgumentException("City not found"));
+    }
+
+    public CityDto toDto(String cityName) {
+        City city = getCityEntity(cityName);
+        return new CityDto(
+            city.getCityName(),
+            city.getLatitude(),
+            city.getLongitude(),
+            city.getCityRange()
+        );
+    }
+
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/CityService.java
user: login: NoviceWyatt19
body: 현재 CityDto를 CityResponse로 만들고 해당 과정들을 Response에 옮긴 뒤 service단에서는 fromLista만 호출하도록 해두었습니다
created_at: 2025-05-13T06:10:17Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,41 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityDto;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.CityRepository;
+import java.util.List;
+import java.util.stream.Collectors;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class CityService {
+    private final CityRepository cityRepository;
+
+    public City getCityEntity(String cityName) {
+        return cityRepository.findByCityName(cityName)
+            .orElseThrow(() -> new IllegalArgumentException("City not found"));
+    }
+
+    public CityDto toDto(String cityName) {
+        City city = getCityEntity(cityName);
+        return new CityDto(
+            city.getCityName(),
+            city.getLatitude(),
+            city.getLongitude(),
+            city.getCityRange()
+        );
+    }
+
+    public List<CityDto> getAllCities() {
+        return cityRepository.findAll().stream()
+            .map(city -> new CityDto(
+                city.getCityName(),
+                city.getLatitude(),
+                city.getLongitude(),
+                city.getCityRange()
+            ))
+            .collect(Collectors.toList());
+    }
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/CityService.java
user: login: NoviceWyatt19
body: 해당 문제도 위의 toDto를 처리하면서 고쳤습니다
created_at: 2025-05-13T06:11:12Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,40 @@
+package grepp.NBE5_6_2_Team03.api.controller.admin.place.dto;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import java.util.List;
+import java.util.stream.Collectors;
+import lombok.Getter;
+
+@Getter
+public class CityResponse {
+    private String city;
+    private Double latitude;
+    private Double longitude;
+    private int radius;
+
+    public CityResponse(String city, Double latitude, Double longitude, int radius) {
+        this.city = city;
+        this.latitude = latitude;
+        this.longitude = longitude;
+        this.radius = radius;
+    }
+
+    public static CityResponse from(City city) {
+        return new CityResponse(
+            city.getCityName(),
+            city.getLatitude(),
+            city.getLongitude(),
+            city.getCityRange()
+        );
+    }
+
+    /**
+     * cities 를 받아 LIST<Response> 를 반환
+     */
path: src/main/java/grepp/NBE5_6_2_Team03/api/controller/admin/place/dto/CityResponse.java
user: login: Tokwasp
body: 주석을 지워도 알수 있어서 주석 지워도 될것 같습니다.!
created_at: 2025-05-13T06:17:02Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,166 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.PlaceRepository;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.util.UriComponentsBuilder;
+
+@Service
+@RequiredArgsConstructor
+@Transactional(readOnly = true)
+public class GooglePlaceService {
+
+    private final PlaceRepository placeRepository;
+
+    @Value("${google.maps.api.key}")
+    private String apiKey;
+
+    private final RestTemplate restTemplate;
+    private final List<String> fields = List.of("name", "geometry/location",
+    "address_components", "formatted_address", "photos");
+
+    /**
+     * limit은 최대 3번까지 가능, next_page_token 이 있는 경우 한정
+     */
+    public List<String> searchPlaceIds(double lat, double lng, int radius, String type, int limit) {
+        List<String> placeIds = new ArrayList<>();
+        String nextPageToken = null;
+        int attempt = 0;
+
+        while (nextPageToken != null && attempt < limit){
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/GooglePlaceService.java
user: login: Tokwasp
body: nextPageToken != null 을 hasNextPage()로 추상화 하면 읽기 좋을것 같아요
created_at: 2025-05-13T06:25:46Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,37 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityResponse;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.CityRepository;
+import java.util.List;
+import java.util.stream.Collectors;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class CityService {
+    private final CityRepository cityRepository;
+
+    public City getCityEntity(String cityName) {
+        return cityRepository.findByCityName(cityName)
+            .orElseThrow(() -> new IllegalArgumentException("City not found"));
+    }
+
+    public CityResponse toDto(String cityName) {
+        City city = getCityEntity(cityName);
+        return new CityResponse(
+            city.getCityName(),
+            city.getLatitude(),
+            city.getLongitude(),
+            city.getCityRange()
+        );
+    }
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/CityService.java
user: login: Tokwasp
body: 이부분도 Dto 내부에서 변환하는게 가독성이 좋지 않을까요?
created_at: 2025-05-13T06:35:14Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,25 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter @Setter
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/City.java
user: login: Tokwasp
body: 혹시 Setter 어디에 쓰셨을까요?
created_at: 2025-05-13T06:36:04Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,36 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.PrePersist;
+import jakarta.persistence.PreUpdate;
+import jakarta.persistence.Table;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Entity
+@Table(name = "place")
+@Getter @Setter
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/Place.java
user: login: Tokwasp
body: @Setter 어디에 쓰셨을까요?
created_at: 2025-05-13T06:36:23Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,61 @@
+package grepp.NBE5_6_2_Team03.global.placeinitializer;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityResponse;
+import grepp.NBE5_6_2_Team03.domain.admin.place.CityService;
+import grepp.NBE5_6_2_Team03.domain.admin.place.GooglePlaceService;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.util.TranslationService;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class PlaceDataInitializer implements CommandLineRunner {
+
+    private final GooglePlaceService googlePlaceService;
+    private final CityService cityService;
+    private final TranslationService translationService;
+
+    @Value("${app.data-initialized}")
+    private boolean dataInitialized;
+
+    @Override
+    public void run(String[] args) {
+        // 이미 DB에 데이터가 있는지 확인
+        boolean isDataInitialized = googlePlaceService.isDataInitialized();
+        if (isDataInitialized) {
+            return;
+        }
+        // 초기화되지 않았다면
path: src/main/java/grepp/NBE5_6_2_Team03/global/placeinitializer/PlaceDataInitializer.java
user: login: Tokwasp
body: 주석 지우셔도 될것 같아요
created_at: 2025-05-13T06:37:07Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,61 @@
+package grepp.NBE5_6_2_Team03.global.placeinitializer;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityResponse;
+import grepp.NBE5_6_2_Team03.domain.admin.place.CityService;
+import grepp.NBE5_6_2_Team03.domain.admin.place.GooglePlaceService;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.util.TranslationService;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class PlaceDataInitializer implements CommandLineRunner {
+
+    private final GooglePlaceService googlePlaceService;
+    private final CityService cityService;
+    private final TranslationService translationService;
+
+    @Value("${app.data-initialized}")
+    private boolean dataInitialized;
+
+    @Override
+    public void run(String[] args) {
+        // 이미 DB에 데이터가 있는지 확인
path: src/main/java/grepp/NBE5_6_2_Team03/global/placeinitializer/PlaceDataInitializer.java
user: login: Tokwasp
body: 주석 지워도 될것 같습니다.
created_at: 2025-05-13T06:37:17Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,61 @@
+package grepp.NBE5_6_2_Team03.global.placeinitializer;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityResponse;
+import grepp.NBE5_6_2_Team03.domain.admin.place.CityService;
+import grepp.NBE5_6_2_Team03.domain.admin.place.GooglePlaceService;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.util.TranslationService;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class PlaceDataInitializer implements CommandLineRunner {
+
+    private final GooglePlaceService googlePlaceService;
+    private final CityService cityService;
+    private final TranslationService translationService;
+
+    @Value("${app.data-initialized}")
+    private boolean dataInitialized;
+
+    @Override
+    public void run(String[] args) {
+        // 이미 DB에 데이터가 있는지 확인
+        boolean isDataInitialized = googlePlaceService.isDataInitialized();
+        if (isDataInitialized) {
+            return;
+        }
+        // 초기화되지 않았다면
+        List<CityResponse> cities = cityService.getAllCities(); // 모든 도시 조회
+
+        for (CityResponse cityResponse : cities) {
+            Set<String> placeIds = new HashSet<>();
+            placeIds.addAll(googlePlaceService.searchPlaceIds(cityResponse.getLatitude(), cityResponse.getLongitude(), cityResponse.getRadius(), "tourist_attraction", 3));
+            placeIds.addAll(googlePlaceService.searchPlaceIds(cityResponse.getLatitude(), cityResponse.getLongitude(), cityResponse.getRadius(), "point_of_interest", 3));
+
+            Map<String, Place> details = googlePlaceService.getDetailsByPlaceIds(placeIds);
+
+            // Place 객체에 placeId 설정 후 DB에 저장
+            for (Place place : details.values()) {
+                // 번역된 도시 이름 설정
+//                String translatedCountryName = translationService.getTranslatedName(place.getCountry());
path: src/main/java/grepp/NBE5_6_2_Team03/global/placeinitializer/PlaceDataInitializer.java
user: login: Tokwasp
body: 안쓰시는 부분이라면 주석을 지워 주세요!
created_at: 2025-05-13T06:37:38Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,61 @@
+package grepp.NBE5_6_2_Team03.global.placeinitializer;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityResponse;
+import grepp.NBE5_6_2_Team03.domain.admin.place.CityService;
+import grepp.NBE5_6_2_Team03.domain.admin.place.GooglePlaceService;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.util.TranslationService;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class PlaceDataInitializer implements CommandLineRunner {
+
+    private final GooglePlaceService googlePlaceService;
+    private final CityService cityService;
+    private final TranslationService translationService;
+
+    @Value("${app.data-initialized}")
+    private boolean dataInitialized;
+
+    @Override
+    public void run(String[] args) {
+        // 이미 DB에 데이터가 있는지 확인
+        boolean isDataInitialized = googlePlaceService.isDataInitialized();
+        if (isDataInitialized) {
+            return;
+        }
+        // 초기화되지 않았다면
+        List<CityResponse> cities = cityService.getAllCities(); // 모든 도시 조회
+
+        for (CityResponse cityResponse : cities) {
+            Set<String> placeIds = new HashSet<>();
+            placeIds.addAll(googlePlaceService.searchPlaceIds(cityResponse.getLatitude(), cityResponse.getLongitude(), cityResponse.getRadius(), "tourist_attraction", 3));
+            placeIds.addAll(googlePlaceService.searchPlaceIds(cityResponse.getLatitude(), cityResponse.getLongitude(), cityResponse.getRadius(), "point_of_interest", 3));
+
+            Map<String, Place> details = googlePlaceService.getDetailsByPlaceIds(placeIds);
+
+            // Place 객체에 placeId 설정 후 DB에 저장
+            for (Place place : details.values()) {
+                // 번역된 도시 이름 설정
+//                String translatedCountryName = translationService.getTranslatedName(place.getCountry());
+                String translatedCityName = translationService.getTranslatedName(place.getCity());
+                place.setPlaceId(place.getPlaceId());
+//                place.setCountry(translatedCountryName);
path: src/main/java/grepp/NBE5_6_2_Team03/global/placeinitializer/PlaceDataInitializer.java
user: login: Tokwasp
body: ㅠㅠ
created_at: 2025-05-13T06:37:46Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,50 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class PlaceServiceTest {
+
+    @Autowired
+    private GooglePlaceService placeService;
+
+    @Test
+    @DisplayName(value = "")
+    void getPlaceIds() throws IOException {
+        List<String> attraction = placeService.searchPlaceIds(34.6937,135.5023, 7000, "tourist_attraction", 1);
+        List<String> restaurant = placeService.searchPlaceIds(34.6937,135.5023, 7000, "restaurant", 1);
+        System.out.println("attraction : "+attraction.toString());
+        System.out.println("restaurant : "+restaurant.toString());
+    }
+
+    @Test
+    void getDetailsByPlaceIdTest() throws IOException {
+        Place results = placeService.getDetailsByPlaceId("ChIJI_--Eg3nAGARcvVi6kRKyKM");
+        System.out.println(results);
+    }
+
+//    @Test
+//    void getDetailsByPlaceIds() throws IOException {
+//        List<String> results = placeService.searchPlaceIds(34.6937,135.5023, 7000, "tourist_attraction", 1);
+//        Map<String, Place> detailsByPlaceIds = placeService.getDetailsByPlaceIds(results);
+//        System.out.println("wyatt: " + detailsByPlaceIds);
+//    }
path: src/test/java/grepp/NBE5_6_2_Team03/domain/admin/place/PlaceServiceTest.java
user: login: Tokwasp
body: 안쓰시는 테스트라면 @Disabled 표시 해주시고 주석을 해제 해주시면 될것같습니다.
또한 테스트시에 데이터를 매번 롤백 해줘야 하기때문에 테스트 클래스에 트랜잭셔널 있으면 좋을듯 합니다.
created_at: 2025-05-13T06:38:37Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,48 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.PrePersist;
+import jakarta.persistence.PreUpdate;
+import jakarta.persistence.Table;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@Entity
+@Table(name = "place")
+@Getter @Setter @ToString
+@NoArgsConstructor
+public class Place {
+
+    @Id
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/Place.java
user: login: Tokwasp
body: 아하! 확인했습니다.
created_at: 2025-05-13T06:51:43Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,40 @@
+package grepp.NBE5_6_2_Team03.api.controller.admin.place.dto;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import java.util.List;
+import java.util.stream.Collectors;
+import lombok.Getter;
+
+@Getter
+public class CityResponse {
+    private String city;
+    private Double latitude;
+    private Double longitude;
+    private int radius;
+
+    public CityResponse(String city, Double latitude, Double longitude, int radius) {
+        this.city = city;
+        this.latitude = latitude;
+        this.longitude = longitude;
+        this.radius = radius;
+    }
+
+    public static CityResponse from(City city) {
+        return new CityResponse(
+            city.getCityName(),
+            city.getLatitude(),
+            city.getLongitude(),
+            city.getCityRange()
+        );
+    }
+
+    /**
+     * cities 를 받아 LIST<Response> 를 반환
+     */
path: src/main/java/grepp/NBE5_6_2_Team03/api/controller/admin/place/dto/CityResponse.java
user: login: NoviceWyatt19
body: 넵! Document 주석이 처음에 뭔지 몰랐는데 커서 호버링 시에 주석 내용이 나온다는게 신기해서 쓸데 없는 것까지 붙였던것같습니다
created_at: 2025-05-13T07:29:59Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,37 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityResponse;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.City;
+import grepp.NBE5_6_2_Team03.domain.admin.place.repository.CityRepository;
+import java.util.List;
+import java.util.stream.Collectors;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+@Service
+@RequiredArgsConstructor
+public class CityService {
+    private final CityRepository cityRepository;
+
+    public City getCityEntity(String cityName) {
+        return cityRepository.findByCityName(cityName)
+            .orElseThrow(() -> new IllegalArgumentException("City not found"));
+    }
+
+    public CityResponse toDto(String cityName) {
+        City city = getCityEntity(cityName);
+        return new CityResponse(
+            city.getCityName(),
+            city.getLatitude(),
+            city.getLongitude(),
+            city.getCityRange()
+        );
+    }
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/CityService.java
user: login: NoviceWyatt19
body: 아 이걸 그대로 남겨뒀네요. toDto는 getCityResponse로 이름을 바꾸고 CityResponse의 from메서드를 통해 만들도록하겠습니다.
created_at: 2025-05-13T07:37:28Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,36 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.PrePersist;
+import jakarta.persistence.PreUpdate;
+import jakarta.persistence.Table;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Entity
+@Table(name = "place")
+@Getter @Setter
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/Place.java
user: login: NoviceWyatt19
body: GooglePlaceService에서 placeId 넣을때 setPlaceId로 넣었습니다.
created_at: 2025-05-13T07:38:38Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,61 @@
+package grepp.NBE5_6_2_Team03.global.placeinitializer;
+
+import grepp.NBE5_6_2_Team03.api.controller.admin.place.dto.CityResponse;
+import grepp.NBE5_6_2_Team03.domain.admin.place.CityService;
+import grepp.NBE5_6_2_Team03.domain.admin.place.GooglePlaceService;
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import grepp.NBE5_6_2_Team03.domain.admin.place.util.TranslationService;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+
+@Component
+@RequiredArgsConstructor
+public class PlaceDataInitializer implements CommandLineRunner {
+
+    private final GooglePlaceService googlePlaceService;
+    private final CityService cityService;
+    private final TranslationService translationService;
+
+    @Value("${app.data-initialized}")
+    private boolean dataInitialized;
+
+    @Override
+    public void run(String[] args) {
+        // 이미 DB에 데이터가 있는지 확인
+        boolean isDataInitialized = googlePlaceService.isDataInitialized();
+        if (isDataInitialized) {
+            return;
+        }
+        // 초기화되지 않았다면
path: src/main/java/grepp/NBE5_6_2_Team03/global/placeinitializer/PlaceDataInitializer.java
user: login: NoviceWyatt19
body: 넵

created_at: 2025-05-13T07:39:00Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,25 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Column;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+import jakarta.persistence.Table;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter @Setter
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/City.java
user: login: NoviceWyatt19
body: 이건 Setter 안 썼네요. 지우겠습니다
created_at: 2025-05-13T07:41:05Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,50 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class PlaceServiceTest {
+
+    @Autowired
+    private GooglePlaceService placeService;
+
+    @Test
+    @DisplayName(value = "")
+    void getPlaceIds() throws IOException {
+        List<String> attraction = placeService.searchPlaceIds(34.6937,135.5023, 7000, "tourist_attraction", 1);
+        List<String> restaurant = placeService.searchPlaceIds(34.6937,135.5023, 7000, "restaurant", 1);
+        System.out.println("attraction : "+attraction.toString());
+        System.out.println("restaurant : "+restaurant.toString());
+    }
+
+    @Test
+    void getDetailsByPlaceIdTest() throws IOException {
+        Place results = placeService.getDetailsByPlaceId("ChIJI_--Eg3nAGARcvVi6kRKyKM");
+        System.out.println(results);
+    }
+
+//    @Test
+//    void getDetailsByPlaceIds() throws IOException {
+//        List<String> results = placeService.searchPlaceIds(34.6937,135.5023, 7000, "tourist_attraction", 1);
+//        Map<String, Place> detailsByPlaceIds = placeService.getDetailsByPlaceIds(results);
+//        System.out.println("wyatt: " + detailsByPlaceIds);
+//    }
path: src/test/java/grepp/NBE5_6_2_Team03/domain/admin/place/PlaceServiceTest.java
user: login: NoviceWyatt19
body: 넵!
created_at: 2025-05-13T07:41:19Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,50 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class PlaceServiceTest {
+
+    @Autowired
+    private GooglePlaceService placeService;
+
+    @Test
+    @DisplayName(value = "")
+    void getPlaceIds() throws IOException {
+        List<String> attraction = placeService.searchPlaceIds(34.6937,135.5023, 7000, "tourist_attraction", 1);
+        List<String> restaurant = placeService.searchPlaceIds(34.6937,135.5023, 7000, "restaurant", 1);
+        System.out.println("attraction : "+attraction.toString());
+        System.out.println("restaurant : "+restaurant.toString());
+    }
+
+    @Test
+    void getDetailsByPlaceIdTest() throws IOException {
+        Place results = placeService.getDetailsByPlaceId("ChIJI_--Eg3nAGARcvVi6kRKyKM");
+        System.out.println(results);
+    }
+
+//    @Test
+//    void getDetailsByPlaceIds() throws IOException {
+//        List<String> results = placeService.searchPlaceIds(34.6937,135.5023, 7000, "tourist_attraction", 1);
+//        Map<String, Place> detailsByPlaceIds = placeService.getDetailsByPlaceIds(results);
+//        System.out.println("wyatt: " + detailsByPlaceIds);
+//    }
path: src/test/java/grepp/NBE5_6_2_Team03/domain/admin/place/PlaceServiceTest.java
user: login: NoviceWyatt19
body: 그런데 테스트 코드 중에는 db에 올리는 활동이 없습니다.
created_at: 2025-05-13T07:42:48Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,36 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place.entity;
+
+import jakarta.persistence.Entity;
+import jakarta.persistence.Id;
+import jakarta.persistence.PrePersist;
+import jakarta.persistence.PreUpdate;
+import jakarta.persistence.Table;
+import java.time.LocalDateTime;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Entity
+@Table(name = "place")
+@Getter @Setter
path: src/main/java/grepp/NBE5_6_2_Team03/domain/admin/place/entity/Place.java
user: login: Tokwasp
body: 그러면 @Setter 어노테이션을 지우고 updatePlaceId로 하나 만들면 될것 같아요
created_at: 2025-05-13T07:44:39Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,50 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class PlaceServiceTest {
+
+    @Autowired
+    private GooglePlaceService placeService;
+
+    @Test
+    @DisplayName(value = "")
+    void getPlaceIds() throws IOException {
+        List<String> attraction = placeService.searchPlaceIds(34.6937,135.5023, 7000, "tourist_attraction", 1);
+        List<String> restaurant = placeService.searchPlaceIds(34.6937,135.5023, 7000, "restaurant", 1);
+        System.out.println("attraction : "+attraction.toString());
+        System.out.println("restaurant : "+restaurant.toString());
+    }
+
+    @Test
+    void getDetailsByPlaceIdTest() throws IOException {
+        Place results = placeService.getDetailsByPlaceId("ChIJI_--Eg3nAGARcvVi6kRKyKM");
+        System.out.println(results);
+    }
+
+//    @Test
+//    void getDetailsByPlaceIds() throws IOException {
+//        List<String> results = placeService.searchPlaceIds(34.6937,135.5023, 7000, "tourist_attraction", 1);
+//        Map<String, Place> detailsByPlaceIds = placeService.getDetailsByPlaceIds(results);
+//        System.out.println("wyatt: " + detailsByPlaceIds);
+//    }
path: src/test/java/grepp/NBE5_6_2_Team03/domain/admin/place/PlaceServiceTest.java
user: login: Tokwasp
body: 넵 확인했습니다. 그러면 주석 제거하고 @Disabled 해서 테스트 안돌리게 하면 될것같아요
중요한게 아니라면 지우셔도 될것 같습니다.
created_at: 2025-05-13T07:45:26Z
author_association: COLLABORATOR
diff_hunk: @@ -0,0 +1,50 @@
+package grepp.NBE5_6_2_Team03.domain.admin.place;
+
+import grepp.NBE5_6_2_Team03.domain.admin.place.entity.Place;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+public class PlaceServiceTest {
+
+    @Autowired
+    private GooglePlaceService placeService;
+
+    @Test
+    @DisplayName(value = "")
+    void getPlaceIds() throws IOException {
+        List<String> attraction = placeService.searchPlaceIds(34.6937,135.5023, 7000, "tourist_attraction", 1);
+        List<String> restaurant = placeService.searchPlaceIds(34.6937,135.5023, 7000, "restaurant", 1);
+        System.out.println("attraction : "+attraction.toString());
+        System.out.println("restaurant : "+restaurant.toString());
+    }
+
+    @Test
+    void getDetailsByPlaceIdTest() throws IOException {
+        Place results = placeService.getDetailsByPlaceId("ChIJI_--Eg3nAGARcvVi6kRKyKM");
+        System.out.println(results);
+    }
+
+//    @Test
+//    void getDetailsByPlaceIds() throws IOException {
+//        List<String> results = placeService.searchPlaceIds(34.6937,135.5023, 7000, "tourist_attraction", 1);
+//        Map<String, Place> detailsByPlaceIds = placeService.getDetailsByPlaceIds(results);
+//        System.out.println("wyatt: " + detailsByPlaceIds);
+//    }
path: src/test/java/grepp/NBE5_6_2_Team03/domain/admin/place/PlaceServiceTest.java
user: login: NoviceWyatt19
body: 지우고올리겠습니다
created_at: 2025-05-13T08:06:24Z
author_association: COLLABORATOR

PR comments:
user: login: NoviceWyatt19
created_at: 2025-05-13T04:12:23Z
body: 그리고 노션에 application.properties 변경사항에도 올려두었는데 jpa ddl-auto 설정이랑 app.data-initialized=true해주시면 됩니다. false로 하면 프로젝트 실행시 placeinitializer가 작동하니 데이터는 place.sql로 올리시고 해당 설정은 true로 해주세요!
author_association: COLLABORATOR
user: login: hyeunS-P
created_at: 2025-05-13T05:12:08Z
body: 좋습니다
author_association: COLLABORATOR
user: login: NoviceWyatt19
created_at: 2025-05-13T06:13:54Z
body: 현재 요청하신 사항들을 모두 적용했습니다!
author_association: COLLABORATOR
user: login: hyeunS-P
created_at: 2025-05-13T08:15:43Z
body: 확인했습니다
author_association: COLLABORATOR