개발자
안녕하세요! 백엔드 취준생입니다 현재 지도 기반으로 사진 장소를 기록하고 추천하는 프로젝트를 만들고 있는데 질문 좀 받아주시면 감사하겠습니다 ㅠㅠ (프론트는 Flutter, 백엔드는 스프링 부트와 Mysql을 사용중입니다) 현재 사용자가 사진을 올리면 사진의 좌표 정보를 지도 서비스 제공자(카카오, 네이버 등)를 통해 특정 장소의 좌표, 주소로 변환하고 있습니다 같은 장소라도 사진의 좌표가 조금씩 다르기 때문에 대표 좌표로 사진들을 모아서 보여주기 위해 이렇게 했습니다 그런데 이렇게 하면 사진을 업로드 할때마다 외부 API를 호출해야 하고 의존성이 너무 높은 것 같아서 다른 방법을 생각하고 있습니다..! 제가 생각한 방법은 사진 좌표에 가장 인접한 좌표의 장소를 DB에서 1차적으로 조회해서 사용자에게 해당 장소에 등록할지 물어본 후 외부 API를 호출하는 방법이 있습니다 혹시 다른 좋은 방법이나 조언 좀 해주시면 정말 감사하겠습니다!
답변 4
인기 답변
설계가 좀 애매합니다. 일단 이미지를 올리는데 좌표정보를 어떻게 가져온다는 것이지요? 혹시 이미지와 함께 좌표정보를 request로 올려준다는 얘기인가요? ex) request { "image" : "myImage1.png", lat : '37.000292', lng : '203.9999' } lat lng가 맞나.. 헷갈리네요 암튼 이런식으로 좌표정보를 따로 올려준다면 네이버나 카카오 api중에 주소정보 api라는게 있습니다. 좌표를 request로 쏴주면 response로 detail한 정보를 줍니다. api가 좌표 하나당 정보를 주게 되어있으니 어쩔수 없습니다. 제가 알기론 그렇고, 여러개 좌표를 던질수 있는 api가 추후에 추가되었을 수도 있겠지만 한번 찾아보세요. 이렇게 하면 업로드 할때마다 의존성이 너무 높다고 하셨는데, 좋은 생각입니다. 근데 이것도 상황을 봐야 됩니다. 현재는 간단한 토이 프로젝이라면 그렇게 하셔도 상관없을 수 있습니다. 서비스를 돌아가게 만들어놓고, 돌려보면서 개선방향을 강구해보시죠. 돌아가는 서비스를 만드시는게 효과가 있습니다. 화이팅하세요.
익명
작성자
2024년 03월 21일
네 좌표 정보를 request로 받아서 카카오맵 좌표 주소 변환 API를 사용하고 있습니다 상황에 맞게 고려하는 것이 좋겠군요..! 답변 감사합니다!
인기 답변
안녕하세요! 저도 최근에 지도를 기반으로 프로젝트를 진행했던 경험이 있어서 공유드리고 싶습니다. 말씀하신대로 사진을 업로드 할때마다 지도 API 요청을 통해 좌표 정보를 얻어오는 것은 의존성이 강하다고 볼 수 있을 것 같습니다. 왜냐하면, 의존하고 있는 외부 API 서버가 고장날 경우 해당 비즈니스 로직은 결국 수행할 수 없을테니까요. 하지만 좌표를 변환 하는 작업을 수행하는 기능을 직접 만들 수 없으니, 의존성이 강하더라도 해당 비즈니스 로직을 구현하기 위해서 꼭 필요하다면 해당 방식을 이용해야된다고 생각합니다. 그래서 이러한 어쩔 수 없는 의존성을 사용한다면, 의존성을 탈피하기 위해 외부 API를 이용하지 못했을 때, 다른 로직으로 돌리는 예외 처리를 한다든지, 다른 외부 API를 미리 설정해둔다던지 여러가지가 있을 것 같은데요. 말씀하신 방법처럼 사진 좌표에 가장 인접한 좌표의 장소를 DB에서 1차적으로 조회해서 하는 방법도 좋은 것 같아요. 저의 경우 좌표에 가장 인접한 좌표를 불러오기 위해서 MySQL의 Spatial Data Types를 이용했는데요. 만약, 현재 Double 또는 BigDecimal을 이용하여 좌표를 받고 계신 경우 위의 말씀하신 로직을 하버사인 공식이나 다른 공식을 통해 해당 좌표로부터 가까운 장소를 찾으셔야합니다. 하지만 이럴 경우 모든 테이블의 레코드를 스캔해서 처리해야하기 때문에 성능상 이점을 가질 수 없는데요. 제가 말씀드린 MySQL의 Spatial Data Types과 Spatial Index를 활용하면 가장 가까운 거리를 내장 함수로 쉽게 불러올 수 있게 됩니다. 또한, 인덱스 적용을 통해 풀 테이블 스캔이 아닌 일부 레코드만 읽어올 수 있어 성능 향상을 이뤄낼 수 있습니다. 하지만, 인덱스의 특성상 Create/Update/Delete가 많고, Read가 적은 경우 또는 레코드가 중복되는 값이 많은 경우 인덱스로 인한 성능 향상을 이뤄낼 수 없을 수도 있으니 잘 고려해보시고 적용해보시면 좋을 것 같습니다. 관련된 기능을 처리하신다면 이러한 방법도 있다고 말씀드리고 싶어서 댓글 답니다! [MySQL Spatial Data Types] https://dev.mysql.com/doc/refman/8.3/en/spatial-type-overview.html
익명
작성자
2024년 03월 28일
말씀해주신 것처럼 spatial 타입과 인덱스를 사용하고 있는데 외부 API를 사용할 수 없는 상황에서 예외 처리 등이 중요한 것 같네요 ㅠㅠ 더 공부하고 적용해봐야겠습니다 답변 감사합니다!!
박정환
HecatonAI Lab Leader • 2024년 03월 28일
저도 이 글을 보고 예전 서비스의 구현 부분이 좀더 생각이 났습니다. lat, lng를 일부 가지고 있었습니다. spatial type을 사용했던 것 같고 공간쿼리를 활용하긴 했었지요. 다만 당시 개발 구성원들 간의 이해력 차이나 가독성 문제 및 DB의 용량 증가 (이건 건축물대장을 활용해서일 가능성이 높았습니다.) 등등의 사유로 많이 활용하지 못했습니다. 제가 다루던 서비스는 전국의 아파트 대상이어서, 서비스 안정성 문제로 결국 사용을 축소했던 것 같습니다. (왜 같습니다 같습니다 하냐면, 저는 서비스 개발 초기에는 구성원으로서 몇몇 책임님들이 이끌었습니다. 그후 상황이 여러모로 복잡해지고 구성원이 바뀌는 와중, 실질적 리드 역할을 하던 분까지 퇴사하여 그때부터 책임을 맡게 됐었습니다.) 조금이라도 기억나게 해주셔서 감사합니다.
안녕하세요, 저도 비슷한 맥락의 서비스르 기획했었는데요. 복잡하긴 하겠지만 사진에서 받은 좌표를 주소로 변환하고 다시 주소를 api에서 제공하는 좌표로 바꾸는 지오코딩을 사용하시는 것도 괜찮을 거라고 생각합니다! 좌표는 한 장소에 대해 여러 개가 찍히지만 주소는 한 장소에 대해 하나가 찍혀서요. 물론 poi가 이미 등록이 된 장소만 해당될 거지만요! 여러 서비스 사의 API나 SDK 문서를 다양하게 읽어보시면 해답을 구하시지 않을까 싶습니다. 각 사마다 제공하는 기능이 조금씩 다르더라고요 😔
익명
작성자
2024년 03월 21일
지오코딩 방법을 사용하고 있는데 다른 서비스사도 더 찾아봐야겠네요..ㅎㅎ 답변 감사합니다!
안녕하세요, 저도 비슷한 고민을 했어서 말씀드려요. 아래에서 도로명주소별 혹은 지번주소별 좌표값 데이터 신청해서 다운받을 수 있습니다. https://business.juso.go.kr/addrlink/adresInfoProvd/guidance/othbcAdresInfo.do 따로 클렌징해서 개인 DB에 보관해 사용하면 될거같아요 근데 이건 단순 주소별 좌표고, 상호명이라든지 이런 정보는 어쩔수없이외부 api 사용해야합니다.
익명
작성자
2024년 03월 25일
도로명주소별 좌표는 제공이 안 되는 줄 알았는데 좋은 정보 감사합니다!!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 03월 21일
솔루션을 생각해보았습니다. 사진의 메타데이터에 저장된 GPS 좌표를 사용하여 시작하는 것은 좋은 접근 방식입니다. 1) **나중에 API 사용 줄이기:** 사용자가 사진을 업로드하면 GPS 좌표를 캡처하고 이를 DB에 저장하세요. 그러나 이 시점에서 외부 API를 호출하지 마세요. 대신, 사용자가 사진 위치 정보를 요청할 때 만 외부 API를 호출하도록 로직을 변경합니다. 이렇게 하면 사진 업로드 당 API 호출이 아닌 필요한 경우에만 API 호출이 발생함으로써 API 사용량을 크게 줄일 수 있습니다. 2) **Caching:** API 호출 결과를 캐싱하는 것도 고려해 볼 만 합니다. 즉, 이미 요청된 장소 정보는 데이터베이스에 저장되며, 동일한 장소의 추가 요청은 데이터베이스에서 가져와 (API 외부 요청 없이) 제공됩니다. 3) **배치 처리:** 사용자가 사진을 업로드 한 후 해당 정보는 일시적인 저장 공간에 보관합니다. 그런 다음 일정 간격으로 배치 작업을 실행하여 이 일시적인 저장 공간의 데이터들을 처리(위치 정보 변환 등)하고 본 DB에 업데이트합니다. 이렇게 하면 API 호출을 일정량으로 제한하고 시스템 부하를 조절할 수 있습니다. 4) **Clustering(클러스터링):** 사진 좌표의 클러스터링 알고리즘 사용을 고려해보세요. 사진은 클러스터에 할당되고 각 클러스터는 대표 좌표를 가집니다. 이 방법으로 비슷한 위치의 사진들을 그룹화하여 처리할 수 있습니다. 이들 중에서 적합한 솔루션을 선택해 적용하시면 됩니다. 아마도 여러가지 방법을 조합해서 최적의 결과를 얻을 수 있을 것입니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!