일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 회고
- CJ UNIT
- 백준알고리즘
- SQL
- 프로그래머스
- softeer
- SW봉사
- 코딩교육봉사
- 파이썬
- python
- 백준
- 알고리즘
- programmers
- 코틀린
- 소프티어
- 정보처리산업기사
- java
- 1과목
- C++
- kotlin
- 자바
- 스프링
- 백준 알고리즘
- MYSQL
- 공부일지
- 코딩봉사
- 문제풀이
- 시나공
- BFS
- 데이터베이스
- Today
- Total
JIE0025
[API] 장소 등록에서, KAKAO-MAPS와 매핑한 API 설계 본문
✅ 개요
지도 API 를 사용하기로 결정되면서 장소에 대한 데이터를 우리 서비스에 저장해둘 필요가 생겼다.
프론트 분과 상의 후 KAKAO MAPS API를 사용하기로 되었고,
KAKAO MAPS API의 데이터에서 어떤 데이터를 저장하고, 어떻게 데이터를 저장할지 설계가 필요했다.
✅ KAKAO MAPS (response)
먼저 카카오 맵이 특정 장소에 대해 어떻게 응답을 주는지 살펴보았다.
✅마이버디 데이터베이스에는 어떤 데이터를 저장해야할까?
서비스의 기능과 연결해 필요한 데이터만을 저장하도록 해야했다.
<장소> 와 관련된 요구사항은 다음과 같다.
📣 요구사항
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을 호출할때 무슨 정보가 필요한가?
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
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 로 접근할 때 사용되기 때문에 좀더 직관적으로 사용하기 위함이었다.
- 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 설계를 마치게 되었다.
'개발 > API, 설계, 데이터 전처리' 카테고리의 다른 글
[ERP/경영지원] 지원금 신청 & 승인 : 유저플로우(userflow) (0) | 2024.07.28 |
---|---|
[설계] Office Reservation System (Architecture, API Flow, Database) (0) | 2024.04.02 |
[csv → json] 지도 기능을 위한 법정동 데이터 전처리 (with Jupyter notebook) (0) | 2023.04.16 |