Alfred Workflow - 네이버 검색 워크플로우 지도 검색 개선

 

Workflow 소개

macOS에서 가장 많이 사용하는 앱 중 하나가 Alfred이다.
그리고 이 앱에서도 가장 높은 빈도로 사용하는 워크플로우 중 하나가 바로 네이버 검색이다.
이 워크플로우는 Kuniz/alfnaversearch: Naver Search Workflow for Alfred (알프레드 네이버 검색/사전/지도 자동완성 워크플로우) 여기에서 살펴보고 다운로드할 수 있는데 정말 잘 만든 워크플로우다.

대략적인 기능은 다음과 같다.

  • 네이버 검색 : 네이버 웹페이지에서의 기본 검색창에 검색어 입력시 자동완성 목록이 아래로 나타나는데 그 데이터를 Alfred 호출창에서 그대로, 그리고 매우 빠른 속도로 보여준다.
  • 네이버 사전 검색 : 네이버 사전에 있는 거의 모든 언어에 대해 위와 같은 방식으로 보여준다.
  • 네이버 쇼핑 검색
  • 네이버 지도 검색

 

그런데 얼마전부터 갑자기 ‘네이버 지도’ 검색이 정상적으로 작동하지 않았다.
 

Safari 브라우저의 개발자 도구 중 웹 인스펙터를 열어 살펴봤다.

/images/SCR-20240317-onwz.png

위와 같은 화면을 볼 수 있는데 검색창에 검색값을 입력할 때마다 화면상 1번의 Instant-search가 추가됨을 볼 수 있다.

2번이 아마도 Naver map 검색에서의 자동완성 API 주소로 보인다.
그리고 자동완성시 입력어에 해당하는 3번의 query와 4번의 coords라는게 추가적으로 보이는데 이건 위치정보를 담고 있는 위도와 경도 정보이다.

변경내역 파악

우선 위 API로부터 json 파일을 받아 데이터를 살펴보고 기존과 바뀐 부분을 찾아봤더니,

  1. API 주소가 바뀌었다. (map.naver.com/p/api/search -> map.naver.com/p/api/search/instant-search)
  2. 위 API로부터 받은 자료의 배열 역시 기존의 코드와 비교해봤을 때 달라진 것으로 보인다.
  3. 화면에서 보이는 4번의 coords, 즉 사용자의 현재 위치(위도, 경도)가 필수 제공값이 된듯 하다.

문제 수정

오류 해결

이에 따라 해당 워크플로우의 git을 fork해서 수정하기 시작했다.
관련 기능의 스크립트는 파이썬으로 작성되어 있었고, 파이썬은 처음만져보는 언어였지만 조건문이나 반복문의 기본 개념이나 틀은 JS와 크게 다르지 않아 별다른 어려움은 없었다.

우선 변경내역을 차례로 고쳐나가며 코드를 수정하였다.

1
2
3
4
def get_data(word):  
     url = 'https://map.naver.com/v5/api/search/instant-search'     params = dict(query=word,                   type="all",                   coords= '37.1234,126.1234',                   lang="ko",  
                   caller="pcweb"                   )     def wrapper():         return get_data(args)  
     res_json = wf.cached_data(f"navmap_{args}", wrapper, max_age=30)     ...  

 

1번과 3번의 문제는 위와 같이 간단하게 수정함으로써 정상적으로 워크플로우가 작동함을 확인하였다.
그리고 2번 문제 역시 자료의 배열을 분석하여 그에 맞춰 다시 코드를 수정함으로써 일단 워크플로우는 정상적으로 결과를 내뱉게 되었다.

여기까지의 자세한 코드 수정 내역은 다음에서 확인할 수 있다.
https://github.com/inchanS/alfnaversearch/commit/79c441e282f679dd6630c1d93650fce327dded46

개선 1 - IP address로부터 위치정보 활용

여기서 하나의 고민이 생긴다.
사용자의 위치를 제공하는 coords값을 어떻게 유동적으로 만들 수 있을까? macOS의 위치정보를 가져와 활용하는 방법이 가장 먼저 떠올랐지만 이건 앱의 시스템 권한 부여 문제를 우선 해결해야하기에 다른 방법을 강구했다.

그래서 일단 간단하게 적용한 것이 IP address로부터 위치를 가져와 적용하는 것이었다.

1
2
3
4
5
6
7
8
9
기본 위치 정보: 서울 시청의 좌표  
 default_latitude = 37.5665 default_longitude = 126.9780  
 def get_ip_location():     try:         r = web.get('http://ip-api.com/json/')         r.raise_for_status()         data = r.json()         return data["lat"], data["lon"]     except Exception as e:         # 위치 정보를 가져오는 데 실패할 경우 기본값 반환  
         print(f"위치 정보를 가져오는 데 실패했습니다: {e}")  
         return default_latitude, default_longitude  
 # # 위치 정보를 가져오고, 실패할 경우 기본값 사용  
 latitude, longitude = get_ip_location()  
f get_data(word):  
     url = 'https://map.naver.com/v5/api/search/instant-search'     params = dict(query=word,                   type="all",                   coords= f'{latitude},{longitude}',                   lang="ko",                   caller="pcweb"                   )     headers = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 12_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.4 Safari/605.1.15"}     r = web.get(url, params, headers=headers)     r.raise_for_status()     return r.json()  

 

위와 같이 IP로부터 위치 정보를 가져오는 API 함수를 하나 더 추가하여 정보를 가져오고 그로부터 원래의 기능 함수를 작동시키는 방향으로 진행을 했다.
 

그런데… 뭔가 반응이 굼뜨고 느리다.
 

이유는 IP address로부터 위치정보를 가져오는 API의 속도가 즉각적이지 않다보니 조금씩 지연이 생기는데, 워크플로우의 자동완성 스크립트는 검색창에서 검색어를 입력할 때마다 즉, 자음과 모음 등 키 스트로크가 발생할 때마다 작동한다.
문제는 바로 이 때, IP주소를 가져오는 함수까지 빈번하게 실행되다 보니 지연이 누적되어 사용자 입장에서는 검색어 입력후 결과를 보기까지 꽤나 잦은 딜레이를 경험하게 되었다.

개선 2 - IP address API의 지연 체감 제거

어떻게 하면 좋을까 고민을 했다.
일단 IP address로부터 위치 정보를 가져오는 것은 검색어 입력시 계속해서 실행될 필요가 없었다.
그렇다면 최초의 검색창을 열었을 때 한번만 수행하고 이후 그 값을 계속해서 사용하는 방향으로 진행을 하면 될 것이다.

이에 IP address 관련 함수를 다른 스크립트로 분리하였다.
그리고 IP주소를 활용한 네이버 지도 검색시 방금 분리한 스크립트로부터 받아온 위치 정보를 활용하게끔 수정하였다.

이제 IP주소를 활용한 네이버 지도 검색시 최초의 호출 키워드를 입력할 때만 IP address API 함수가 작동하고 이후, 호출키워드 다음의 검색어를 입력하는동안 워크플로우는 충분히 느긋하게 위치정보를 가져와 사용하기에 사용자는 미처 API 지연을 체감하지 못한다.

꽤나 훌륭한 Fake 설계인듯 생각된다.

개선 3 - 기본 Naver Map 검색시 위치 정보값을 설정할 수 있도록 개선

지금까지의 코드에서 위치정보는 스크립트안에서 입력하여 사용하도록 하였는데,
기반 위치가 바뀔 때마다 스크립트를 수정한다는 것은 꽤나 피곤한 일이다.
때문에 Alfred의 Configure Workflow… 에서 간단하게 위도와 경도값을 넣을 수 있도록 변수를 따로이 빼놓았다.

개선 4 - 위치 정보를 가져오는 API 변경과 캐시 사용

IP address로부터 위치 정보를 가져오는 더 빠른 API를 찾았다.
답은 역시 네이버 지도 검색 화면의 개발자도구에 있었다.
이전에는 해외 사이트를 사용해서인지 모르겠지만 응답시간이 꽤 있어 나름 Fake 설계(?)까지 하며 그 지연시간을 줄이려 했었는데 이젠 그럴 필요가 없어졌다.
네이버 역시 자체적으로 IP를 통해 위치정보를 찾는 API를 사용하고 있었고 그 주소를 사용했더니 응답시간 뿐만 아니라 위치 정확도까지 더 향상되었다.
(하지만 역시 정확한 주소를 기대하기에는 직접 위치정보를 넣어 사용하는것만 못하다.)

때문에 이전의 이중 스크립트 실행(위치정보를 가져오는 스크립트와 검색 스크립트)이 아닌,
검색 스크립트에서 바로 위치정보를 가져오고 이를 캐싱하여 사용하도록 했다.
맥북을 가지고 초고속 열차를 타고 업무를 보는게 아닌 이상 위치 정보라는게 매순간 갱신할 필요가 없다. 그래서 캐싱 유효시간을 설정해두고 적절한 시간마다 갱신하도록 하면 사용자 경험상 지연체감은 더욱 더 최소화될 것이다.
그리고 캐싱 유효시간은 Configure Workflow에서 사용자가 따로이 설정가능하도록 외부에서도 조작가능하게 열어두었다.

최종 개선 워크플로우

Configure Workflow… 위치정보 설정

/images/SCR-20240319-dvzc.png

위 이미지와 같이 워크플로우의 Configure 화면에서 사용자 위치를 직접 입력할 수 있도록 개선 만약 미입력시에는 ‘서울 시청’ 위치를 기본값으로 사용하도록 세팅하였다.

Naver Map에서 주소 검색시 알고리즘은 사용자의 현재 위치를 기반으로 가까운 곳을 우선하여 보여주는데 이로 인해 사용자의 근처 주소 정보를 더 정확히 제공하기에 설정하고 사용하면 더욱 요긴하다.

위도 경도 정보는 https://www.findlatlng.org 사이트에서 쉽게 확인할 수 있다.

네이버 지도 검색 1 - 설정한 위치정보 이용

/images/searchNaverMap.gif

위 이미지는 워크플로우 설정에서 위치를 인천으로 입력하였을 때의 검색결과이다.

네이버 지도 검색 2 - IP address의 위치정보 이용

/images/searchNaverMapIP.gif

호출키워드인 nmi를 눌렀을 때 순간적으로 “IP address로부터 위치정보 받기” 라는 선택창이 스쳐지나감을 확인할 수 있는데 바로 이 과정에서 해당 API가 작동하고 사용자는 이후의 검색어를 입력하는 동안 아무런 지연 없이 검색정보를 확인할 수 있다.

update 2024.03.19
개선 4 - 위치 정보를 가져오는 API 변경과 캐시 사용 로 인해 이전의 ‘IP address로부터 위치정보 받기’ 라는 안내는 더이상 의미가 없을만큼 지연시간이 대폭 줄어들어 체감상 느끼기 힘들기에, 제거하였다.

IP address API로부터 받은 위치정보를 잘 반영하여 결과를 보여주고 있다.

워크플로우 다운로드

github-inchan code v0.0.5 | NEW
위 링크에서 본문과 관련된 alfredworkflow 파일을 다운로드 받아 사용할 수 있다.

버전 0.0.5의 코드는 원래 워크플로우 코드 개발자에게 PR을 넣었고 현재 merge 되어 반영되어있는 상태이다.(참고로 0.0.5는 원 코드개발자의 의사에 따라 Configure 설정과 그를 이용한 지도검색은 제외되어있고, 기본 지도검색시 IP주소를 기반으로 하게끔 되어있다.)
 

github-inchan code v0.0.6 | CHANGED
  • 지도검색시 ‘장소, 주소, 버스’ 3가지 타입의 결과가 사용자의 위치와 관련한 우선순위(naver 자체 score)에 따라 반환되도록 수정1 (이전버전은 한가지 타입의 결과만을 반환한다.)

 

github-inchan code v0.1.1 | NEW - 기능 추가

  • 검색어에 해당하는 장소, 주소, 버스의 검색결과가 있을 때만 해당 type의 Search only Place(or Address, Bus) 창이 뜨도록 변경
  • Search only Place 보기에서 다시 돌아가기 기능 추가
  • 네이버 주식 검색도 추가하였다.

 

github-inchan code latest | NEW - 최신 버전
그리고 다시 사용자가 더욱 세밀한 위치 지정을 할 수 있는 버전과 그 이후의 변경사항을 반영한 워크플로우는 일부 개인적인 설정 및 용도에 맞게 개발하였기에 개별적인 레포지토리인 위 링크에서 다운로드 받을 수 있다.


  1. 24.03.22 이 버전 역시 원래 코드개발자에게 PR을 넣었고, 현재 v0.3.2에서 반영되어 있다. ↩︎


Related Content

0%