관리 메뉴

JIE0025

[API] 장소 등록에서, KAKAO-MAPS와 매핑한 API 설계 본문

백엔드/API, 설계, 데이터 전처리

[API] 장소 등록에서, KAKAO-MAPS와 매핑한 API 설계

Kangjieun11 2023. 4. 18. 20:12
728x90

 
 

✅  개요

 
지도 API 를 사용하기로 결정되면서 장소에 대한 데이터를 우리 서비스에 저장해둘 필요가 생겼다.
 
프론트 분과 상의 후 KAKAO MAPS API를 사용하기로 되었고,
KAKAO MAPS API의 데이터에서 어떤 데이터를 저장하고, 어떻게 데이터를 저장할지  설계가 필요했다.
 
 
 

✅  KAKAO MAPS (response)

 
먼저 카카오 맵이 특정 장소에 대해 어떻게 응답을 주는지 살펴보았다.

 

https://velog.io/@st_hwang/리액트에서-카카오-지도-API를-써보았습니다.-근데-이제-타입스크립트를-곁들인

 

 
 
 
 

✅마이버디 데이터베이스에는 어떤 데이터를 저장해야할까?

 
서비스의 기능과 연결해 필요한 데이터만을 저장하도록 해야했다.
 
 
<장소> 와 관련된 요구사항은 다음과 같다.
 

📣 요구사항

1. 마이페이지에서 좋아하는 장소 리스트가 나와야한다.
1) 해당 장소를 클릭시 -> 장소가 태그된 게시글들이 나온다.
 
 
2. 검색페이지에서 서울-광진구와 같은 필터링시 추천 장소가 나온다.
1) 추천장소의 정보가 지도에 보여져야한다. (장소와 관련되어 노출시킬 정보는 무엇일까?)
2) 핀을 찍어야한다.  (위도 경도 정보가 필요하다)
3) 해당 장소를 클릭하면, KAKAO URL로 링크된다. (url을 호출할때 무슨 정보가 필요한지 알아야한다)
 
 
 
이 요구사항을 보았을 때 저장될 수 있는 데이터는 다음과 같았다. 
왜 이 정보들이 필요한지는 차근차근 아래에 적겠다

- 장소 식별자 (PK)
- KAKAO MAPS -  address_name
- KAKAO MAPS -  id 
- KAKAO MAPS -  place_name
- KAKAO MAPS -  x
- KAKAO MAPS -  y

 
 
 
 

📣  요구사항 2-3

해당 장소를 클릭하면, KAKAO URL로 링크된다. 
url을 호출할때 무슨 정보가 필요한가?

https://velog.io/@st_hwang/리액트에서-카카오-지도-API를-써보았습니다.-근데-이제-타입스크립트를-곁들인

 
place_url은  http://place.map.kako.com/   +   id 값이다.
 
따라서 KAKAO MAPS 의 고유 id값을 DB에 저장해야한다.
 
 
 

📣  요구사항 1-1

마이페이지에서 좋아하는 장소 리스트가 나와야한다.
해당 장소를 클릭시 -> 장소가 태그된 게시글들이 나온다.
 

 
마이페이지에서 좋아하는 장소 리스트가 나와야하고, 해당 장소를 클릭했을 때 관련 게시글이 나오는, 추가 요청이 들어올 수 있다. 
이 추가 요청에 따라 유니크한 값을 PK 삼아 새로운 요청을 보내게 될텐데
 
 
여기에서 어떤 값을 PK로 만들지 고민하게 된다.
 
이미 kakao maps의 id값을 데이터베이스에 저장하기로 결정된 상황이다.
kakao-maps  id값이 unique한 값이기 때문에 pk로 적용해도 되지만,,,
 
장소 식별자용 컬럼을 새로 생성하기로 결정했다.


✏️ WHY? 

이유는 JPA를 공부하면서 배운 식별자 전략에 의해서이다.
 
https://jie0025.tistory.com/371

[JPA] 4장 엔티티 매핑

자바 ORM 표준 JPA 프로그래밍 김영한 엔티티 매핑 목차 @Entity @Table 다양한 매핑 사용 데이터베이스 스키마 자동 생성 DDL 생성 기능 기본키 매핑 필드와 컬럼 매핑 : 레퍼런스 정리 실전 예제 요구

jie0025.tistory.com

 
 
KAKAO_ MAPS 에 존재하는 id는 결국 외부 비즈니스의 키값이다. 
KAKAO_MAPS 의 키값 전략이 변경되거나, 데이터가 삭제되면,,? 
KAKAO_MAPS에 존재하는 pk 값이 없어졌을때  우리 서비스에 영향이 갈수도 있다.
 
서비스는 다른 서비스에 종속되면 안된다. 
 
또 JPA에서는 모든 엔티티에 대리키 사용이 권장된다. 
 
이런 이유로 대리키를 적용하기로 결정했다.
 
 

📣  요구사항 2-2

핀을 찍어야한다.   →    (위도 경도 정보가 필요하다)

 
 
핀을 찍기 위해서 당연히 위도 경도 정보가 필요하고 이는
kakao maps 의 x, y를 데이터베이스에 저장하게 된다.
 
 

📣  요구사항 2-1

추천장소의 정보가 지도에 보여져야한다. (장소와 관련되어 노출시킬 정보는 무엇일까?)

 
화면 기획이 뚜렷하지 않은 상태에서 어떤 정보가 의미있을까 고민하게 되었다.
 
장소의 이름, 주소만 추가적으로 저장하면 되었다.
(태그된 게시물에 대한 것들은 Entity 상에서 연관관계 매핑을 통해 가져올 것이어서 굳이 DB에 저장할 이유가 없었다.)
 
 
 
결국 다음과 같은 데이터를 저장하기로 확정되었다.

- 장소 식별자 (PK)
- KAKAO MAPS  address_name
- KAKAO MAPS  id
- KAKAO MAPS  place_name
- KAKAO MAPS  x
- KAKAO MAPS  y

 

 

✅ DB ERD 설계

 

⏺ 컬럼명 정하기

KAKAO MAPS의 컬럼명을 그대로 따라가지 않고, 우리가 사용하기에 직관적인 컬럼명을 결정했다.
 
 
테이블명이 Amenity이기 때문에,
pk로 들어갈 컬럼은 amenity_id
 
그리고 kakao-maps의 id는 address_id로 매핑했다.
address_id인 이유는, 이후 카카오 URL 로 접근할 때 사용되기 때문에 좀더 직관적으로 사용하기 위함이었다.
 

Amenity

 
 

  • address_id
    • 카카오맵 api - id
  • amenity_name : 장소 이름
    • 카카오맵 api - place_name
  • address : 도로명 주소
    • 카카오맵 api - road_address_name
  • longitude : 경도
    • 카카오맵 api - x
  • latitude : 위도
    • 카카오맵 api - y

 
 

✅  데이터의 추가 상황

 
가장 크게 고민했던 부분이다.

 

게시글 작성 요청 API가 존재하는 상황에서
장소 추가 요청API를
분리할지 vs   말지

 
장소 데이터는 게시글 작성시, 장소를 추가할 경우에만 추가된다.
 
굳이 요청을 분리해서 2번이나 보내야하는 이유가 있을까?
 
 

멘토님께 요청을 한번에 넘기는게 더 깔끔하다는 피드백을 받았다.
게시글 작성시 장소 데이터가 존재한다면, 장소와 관련된 데이터를 body에 담아서 보내주도록 설계를 완료했다.

 
 
 

✔️ Request

Method : POST
EndPoint : /api/v1/bulletin-posts

Body 
{
		"postContent": "카",
		"addressId": 12344532,
		"amenityName": "강아지카페",
		"address": "서울시 광진구 어디쯤",
		"longitude": 126.57647863723106,
		"latitude": 33.45140418216076
}

 
 
 
이렇게 장소에 대한 DB설계 및 데이터 추가 상황에 대한 API 설계를 마치게 되었다.