Streamlit으로 정비소 탐색 지도 만들기

Streamlit은 프로토타입용으로만 쓰는 거 아닌가요?

Do not index
Do not index
안녕하세요 오토피디아 리서치팀에서 데이터 엔지니어로 일하고 있는 김건우입니다 :)
 

들어가며

닥터차는 1:1 상담, 커뮤니티 답변 등 여러 방법으로 운전자들의 차량 문제를 해결하는데 몰두하고 있습니다. 그 중에서 가장 핵심이 되는 방법은 바로 커뮤니티를 통한 Q&A인데요. 운전자들이 현재 자신의 차량에서 겪고 있는 문제를 닥터차 커뮤니티에 질문해주시면 오토피디아 내부의 메카닉 분들이 그에 맞는 진단과 정비소 추천까지 해드리고 있습니다. 차에는 정말 다양한 문제가 발생할 수 있기 때문에 해당 기능을 통해 운전자들은 각자의 궁금증을 해소하고 정비소 추천을 통해 문제해결까지 한 번에 할 수 있습니다.
notion image
질문과 답변 사례
질문과 답변 사례
특히 정비소 추천은 겪고 있는 문제를 가장 효율적이고 저렴하게 해결할 수 있는 정비소를 닥터차 내부 메카닉이 업체 카드를 통해 추천해주는 유용한 서비스입니다. 업체 추천은 상호명과 전문 분야, 주소, 연락처 등이 포함된 메카닉이 사용하는 업체 검색 콘솔 상에서 이루어지고 있었습니다. 이러한 업체 검색 콘솔은 일전에 구축해두었던 닥터차만의 정비소 데이터베이스를 이용하였습니다.
업체 검색 콘솔
업체 검색 콘솔
하지만 메카닉들이 정비소 추천을 하는 과정에는 크게 두 가지 문제가 있었는데요.
  • SQL LIKE 구문을 통한 검색 지원
  • 고객이 정비 받기를 원하는 희망 정비 지역으로부터 추천 정비소 사이의 거리 파악이 어려움
업체 목록 콘솔에서는 업체 종류, 전문분야에 대한 필터링과 업체명, 주소에 대한 검색 기능을 제공하고 있습니다. 하지만 검색은 SQL LIKE 기반으로 작동되다보니 정확한 업체명을 알아야 검색이 가능했습니다.
또한 검색 콘솔 상의 주소만으로는 대략적인 위치 파악 정도만 가능하여 고객이 정비를 받기 원하는 위치와 해당 정비소까지의 거리가 어느정도 되는지 확인하기 위해서는 메카닉분들이 직접 네이버에 다시 해당 정비소를 검색하는 수고로움이 존재했습니다.
이러한 비효율성을 해결하기 위해 검색과 위치 파악이 모두 가능한 업체 지도를 만드는 것이 필수적이라고 느꼈고, 어떻게 하면 빠르게 이를 만들 수 있을까 고민하기 시작합니다.

도구 탐색

문제 해결에 대한 니즈는 발견했고 이제 무얼 사용하여 업체 지도를 만들지를 결정해야 했습니다. 이를 케빈과 함께 논의하였고 아래와 같은 장점들로 결과적으로 UI 단에는 Streamlit, 검색 쪽은 Elasticsearch(이하 ES)를 이용하기로 했습니다. 여기에는 여러가지 이유가 있는데요.
1. 빠르게 프로토타입을 만들기 좋음.
  • 빠르게 결과물을 내서 메카닉분들이 직접 사용하고 피드백을 받는 것이 중요했음
  • 낮은 러닝커브와 다양한 elements 보유
2. 검색 결과 고도화 작업으로 인한 ES 숙련도가 높은 상태
  • 이전에 검색 결과 고도화 작업으로 ES를 사용한 경험이 있었기 때문에 정비소 검색에도 이를 사용하는데 큰 어려움이 없었던 상황
  • ES Cloud 이전으로 좋아진 사용성
3. 실사용앱으로도 사용성 나쁘지 않음
  • 프로젝트에서 필요로 하였던 기능(필터, 검색, 데이터프레임)들을 가지고 있음
  • 다른 라이브러리와 호환가능(Folium, Aggrid)
위와 같은 이유로 Streamlit과 ES를 사용하기로 하였고, 단 하루라는 기간을 잡고 정말 빠르게 프로토타입을 만들기로 하였습니다.
notion image

본격 정비소 지도 개발

레이아웃

본격적으로 업체 지도 프로토타입을 만들어보죠. 그 전에 어느정도의 청사진은 필요하다고 생각하여 아주 미천한 그림 솜씨로 간단한 레이아웃을 잡아보았습니다.
시작은 미약하나 그 끝은 창대하리라…
시작은 미약하나 그 끝은 창대하리라…
간단하게 살펴보면 좌측 사이드바에는 기본적인 필터와 검색어 입력 필드를 넣어놓았고, 아래는 검색된 정비소들을 볼 수 있는 데이터프레임을 거리순으로 정렬하여 표시합니다. 그리고 오른쪽에는 희망 정비 지역에서부터 검색 결과에 부합하는 정비소들을 표시하는 지도를 매핑시켜 메카닉분들이 쉽게 정비소 위치를 파악할 수 있도록 만들었습니다.

정비소 데이터베이스 구축

본격적인 개발에 앞서 가장 중요한 작업을 먼저 해야했습니다. 정비소가 검색되려면 기본적으로 정비소 데이터베이스가 있어야 되겠죠? 그래서 우선 정비소를 먼저 ES에 저장하는 시간을 가졌습니다. 사실 처음에는 ES가 아니라 CSV 형태로 데이터를 저장하여 운영을 했습니다. 이번 글에서는 작업 순서를 조금 각색하여 ES에 데이터를 저장하는 것부터 소개를 하였는데, 극초기 프로토타입에서는 정적인 형태인 CSV로 운영되었다는 점…
이전에 마케팅팀의 도혁님께서 정비소 DB 구축에 아주 힘써주셔서 깔끔한 형태의 정비소 DB가 이미 사내에 구축되어 있는 상황이었습니다. 그래서 해당 DB를 그대로 카피하여 ES에 upsert를 하는 과정은 그리 어렵지 않았습니다😀
그리고 이제 잘 구축되어 있는 정비소 DB를 바탕으로 본격적으로 Streamlit을 이용하여 서비스 제작을 시작하였습니다. Streamlit은 공식문서도 잘 나와있고, 실제 유즈 케이스들도 여러 블로그에 많이 나와있어서 그리 어렵지 않게 개발을 하였던 것 같습니다.
정비소 데이터베이스로 만든 업체 검색 콘솔 한번 더 자랑
정비소 데이터베이스로 만든 업체 검색 콘솔 한번 더 자랑

Streamlit으로 어플 만들기

위의 허접한 레이아웃을 바탕으로 본격적인 작업을 시작하였는데요. 먼저 가장 쉬운 작업인 사이드바 만들기를 시작하였습니다. streamlit에서는 사이드바를 쉽게 만들 수 있도록 sidebar 위젯을 제공합니다. 아래와 같이 with문과 함께 쉽게 사용할 수 있습니다.
with st.sidebar:
    st.[element_name]
이 사이드바에 검색, 필터, 데이터프레임 등 다양한 기능들이 들어가게 됩니다. 각각의 기능들도 streamlit에서 아주 간편하게 사용할 수 있습니다. 위의 사이드바에 각각의 위젯들을 넣어주면 되는데요. 검색은 text_input , 필터는 multiselect 를 사용해주면 됩니다. 해당 부분은 어렵지 않으니 별도의 설명없이 넘어가도록 하겠습니다.
데이터프레임도 dataframe 위젯을 사용하면 간단하게 만들 수 있습니다. 여기에는 위에서 말씀드린 정비소 DB가 필요한데요. 여기서 Elasticsearch가 쓰이게 됩니다!

ES로 거리 검색하기

사실 이번 프로젝트에서는 ES까지는 사용할 필요가 없기는 했습니다. 어떻게 보면 약간의 오버 엔지니어링이 될 수도 있었는데, 위에서 말씀드렸듯이 이번에 ES cloud로 이전한 점과 바로 직전에 ES를 이용하여 검색엔진을 구축하였기 때문에 거리 조회에도 ES를 사용해보면 나름 빠르고 좋은 정비소 검색엔진을 구축할 수 있겠다는 생각이었습니다.(그리고 ES로 거리 조회 기능을 한 번 사용해보고 싶기도 했습니다 ㅎㅎ)
ES 검색을 위해 우선 가장 기본이 되는 쿼리를 작성하는 것이 우선이었습니다. 이전 검색엔진 고도화 프로젝트에서 쿼리에 대한 공부를 나름 열심히 하여서 그런지 작성에 그리 어렵지는 않았습니다. 바로 쿼리부터 살펴볼까요?
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "companyName": company_name
          }
        }
      ],
      "filter": [
        {
          "geo_distance": {
            "distance": distance,
            "location": {
              "lat": lat,
              "lon": lon
            }
          }
        },
        {
          "terms": {
            "tagName": company_tag
          }
        },
        {
          "terms": {
            "type": company_type
          }
        }
      ]
    }
  },
  "size": 10000,
  "sort": [
    {
      "_score": {
        "order": "desc"
      }
    },
    {
      "_geo_distance": {
        "distance_type": "plane",
        "location": {
          "lat": lat,
          "lon": lon
        },
        "order" : "asc",
        "unit" : "km"
      }
    }
  ]
}
그렇게 어려운 쿼리는 아닙니다. 먼저 필터 부분부터 살펴보도록 하죠. 총 3개의 필터가 있는데, 먼저 terms 부분은 업체종류와 세부분야에 대한 필터링을 위한 부분입니다. 여기서 ES가 list에 대해서 어떤 식으로 필터링을 지원하는지 알 수 있었습니다. 기존에는 list에 대한 필터링을 AND 조건으로 지원한다고 생각하였습니다. 예를 들어 전문 분야를 [’중정비’, ‘실내 복원’] 로 필터링 한다면 중정비와 실내 복원이 모두 들어있는 항목을 리턴한다고 생각하였는데, 이러한 AND가 아닌 중정비나 실내 복원 중 하나라도 있는 항목을 리턴하는 OR 조건으로 필터링한다는 사실을 알게되었습니다(근데 생각해보면 이게 더 합리적이긴 합니다)
중요한 파트는 거리 조회인데요. ES에서는 좌표를 이용하여 아주 간단하게 원하는 반경 내의 데이터를 검색할 수 있습니다. geo_distance 쿼리를 사용하면 되는데 아래에서 살펴보면, distance 로 원하는 반경을 지정할 수 있고, location 으로 좌표를 설정할 수 있습니다. 저는 명시적으로 위도와 경도를 나타낼 수 있는 json 형태로 넘겨주었지만, 간단하게 [lon, lat] array로도 넘길 수 있다는 점도 알아두면 좋을 거 같습니다.
{
  "geo_distance": {
    "distance": distance,
    "location": {
      "lat": lat,
      "lon": lon
    }
  }
}
그리고 필터 위에 must 구문도 보이실텐데요. 해당 파트는 메카닉 분들이 정비소 이름을 직접 검색하실 수 있는 기능을 요구해주셔서 넣은 부분으로 정비소 이름을 n-gram으로 인덱싱하여 일부분만 일치해도 검색이 되게끔 하였고, 이를 match 구문으로 검색하도록 하였습니다.
이렇게 위에서 마지막으로 반환받은 값을 두 가지 기준으로 정렬을 하는데요. 정비소 이름 검색 정확도로 먼저 정렬을 한 후에 이를 다시 거리순으로 정렬하도록 하였습니다. 거리 정렬은 아래와 같이 사용하면 되고, 정렬 계산 방식(distance_type)이나 거리 단위(unit) 등을 지정할 수 있습니다.
"sort": [
  {
    "_geo_distance": {
      "distance_type": "plane",
      "location": {
        "lat": lat,
        "lon": lon
      },
      "order" : "asc",
      "unit" : "km"
    }
  }
]

데이터프레임 구축(streamlit-aggrid 사용하기)

정비소 검색을 할 수 있는 ES 쿼리를 모두 구축하였습니다. 이제 검색된 정비소 데이터들을 보기 좋은 형태로 시각화하는 작업이 남았는데요. 말씀 드렸다시피 시각화에는 크게 아래의 두 가지 방법을 사용했습니다.
  1. 데이터프레임: 정비소 기본 정보를 표로 한눈에 볼 수 있도록 함
  1. 지도: 정비소 위치를 시각적으로 표현
가장 먼저 데이터프레임 구축을 어떻게 하였는지 소개해드리도록 하겠습니다. 없는게 없는 streamlit에서는 dataframe도 위젯으로 지원하고 있습니다. 사용법도 아주 간단하고 공식문서에 잘 나와있는데요. 저희도 기존에는 streamlit에서 제공하는 dataframe 위젯만 이용하려고 하였으나 시각화 도구로 지도를 함께 사용하다보니 정비소 지도와 함께 동적으로 상호작용했으면 좋겠다는 니즈가 있었습니다.
데이터프레임 내에 체크박스 같은 것이 있어서 메카닉 분들이 검색을 한 후 나온 결과들이 데이터프레임에 나오고, 여기 중 추천할만한 업체를 체크하면 해당 정비소만 지도에 반영되면 좋겠다는 니즈였습니다. 이러한 니즈가 나온 이유는 아무래도 특정 좌표의 반경내에 위치한 정비소들이 꽤나 많다보니 지도 상에서 보여지는 업체가 너무 많아 보기도 어렵고, 굉장히 지저분해져서 원하는 정비소를 찾기가 어렵다는 것이었습니다.
하지만 이를 streamlit에서 제공하는 기본 dataframe 위젯으로는 해결할 수가 없는 상태였고, 절망에 빠져있을때쯤 깃허브에서 한줄기의 빛과 같은 streamlit-aggrid 라이브러리를 발견하게 됩니다. 마치 우리가 가지고 있던 문제를 해결하기 위해 나온 라이브러리인 마냥 데이터프레임 행마다 체크를 할 수 있는 체크박스 기능을 제공하였고, 체크를 하면 동적으로 데이터가 변하게 되는 것이었습니다. (해당 기능이 궁금하시다면 깃허브에서 Demo를 구경해보시면 좋습니다)
사용방법도 굉장히 간단한데요. 우선 grid_table을 위한 옵션을 설정할 수 있도록 데이터프레임을 받아서 GridOptionsBuilder 객체를 생성해줍니다. 여기에서 다양한 기능을 추가할 수 있는데요. 저는 가장 중요한 체크박스 기능을 사용하기 위해 configure_selection 를 통해 이를 활성화해주었습니다.
gd = GridOptionsBuilder.from_dataframe(df)
gd.configure_selection(selection_mode='multiple', use_checkbox=True)
옵션을 설정한 뒤에는 해당 기능을 빌드해주고, 본격적으로 AgGrid 객체로 테이블을 생성해줍니다. 여기까지만 설정해주면 aggrid를 사용할 수 있습니다. 아주 쉽죠? 그런데 저는 예상치 못한 난관을 만났는데요. 해당 라이브러리의 라이센스가 무료가 아니라는 사실을 케빈을 통해 알게 되었습니다(이래서 괜찮은 라이브러리를 사용할 때는 라이센스 확인이 중요합니다 흑흑).
하지만 아주 다행히도 다른 프로젝트에서 이미 라이센스를 구매했던 상황이었습니다. 이를 AgGrid 옵션으로 추가해주기까지 한다면 본격적으로 aggrid를 사용할 준비가 끝났습니다.
gridoptions = gd.build()
grid_table = AgGrid(df, height=600, gridOptions=gridoptions, fit_columns_on_grid_load=True,
                      update_mode=GridUpdateMode.SELECTION_CHANGED, license_key=aggrid_license_key, enable_enterprise_modules=True)
바로 aggrid를 이용해 Streamlit에 데이터프레임을 나타내볼까요? 아래의 그림처럼 일반적인 데이터프레임에 각 행마다 체크박스가 추가된 것을 확인하실 수 있습니다. 이 체크박스는 뒤에서 만들 지도와 인터렉티브하게 호환되어 체크박스를 누른 업체만 지도에 표시될 수 있도록 할 것입니다.
notion image

정비소를 지도에 표시해보자

Aggrid를 이용하여 데이터프레임까지 깔끔하게 만들었습니다. 이제 드디어 이 프로젝트의 핵심이자 존재 이유인 지도를 개발할 차례입니다. 지도를 무엇으로 개발할지는 프로젝트 구상단계에서 이미 논의가 되었던지라 쉽게 시작을 할 수 있었습니다. 저희는 folium 이라는 라이브러리를 이용하기로 하였는데요. folium은 leaflet.js 기반으로 만들어진 파이썬 지도 라이브러리로 좌표값만 있다면 Marker, Popup 등 다양한 기능을 사용할 수 있습니다. 샘플을 사용해보니 생각보다 좋은 사용성을 가지고 있고 개발 또한 아주 간단해서 저희 프로젝트에 사용되기에 제격이었습니다.
그럼 바로 folium을 어떤 식으로 사용했는지 살펴보도록 하죠. folium의 지도 기능을 사용하기 위해서는 먼저 folium.Map 객체를 불러옵니다. 해당 객체에는 다양한 지도 기능을 initialize 할 수 있습니다. 지도가 처음 로드될 때 위치하게 될 중심 좌표가 대표적인데요. location 을 통해 좌표를 넘겨주면 해당 좌표를 중심으로 지도가 나타납니다. zoom_start 는 처음 지도가 로드될 때 얼마나 확대되어 보일지 결정하는 요소로 숫자가 클수록 더 확대되어 보이게 됩니다.
map = folium.Map(location=[user_lat, user_lon], zoom_start=13, control_scale=True)
대략적인 초기 설정이 끝났다면 이제 정비소들을 지도에 나타내볼까요? 정비소들은 세가지 중요한 피처가 필요했는데요. 먼저 위치를 가리킬 수 있는 Marker와 해당 Marker를 클릭했을 때 업체명, 전문분야, 영업 시간 등 정비소의 간단한 정보를 알 수 있는 Popup 그리고 Popup과 똑같은 정보를 표시하지만 클릭이 아닌 마우스를 호버했을 때 나타나는 Tooltip 입니다. 이들의 간단한 사용법은 아주 간단합니다. 먼저 Marker는 생성 후에 이를 아까 만든 map에 add 해주기만 하면 됩니다. 아주 쉽죠? Popup과 Tooltip은 일종의 Marker 안에 부가기능 같은 개념인데 원하는 Marker에 인자로 넣어주기만 하면 됩니다. 이때 저는 Popup을 조금 더 쉽게 사용하기 위해 IFrame을 사용하였는데 여기서 Popup의 여러 속성을 정의할 수 있습니다.
# 나타내고 싶은 html
html = """
 업체명: OOO <br>
 전문분야: 판금/도색 <br>
 ...
"""

# Popup 속성 지정
iframe = folium.IFrame(html,
                       width=350,
                       height=400)

popup = folium.Popup(iframe)

# Marker를 지도에 추가
folium.Marker(location=coords,
              popup=popup,
              tooltip=html).add_to(map)
정비소를 지도에 표시할 수 있는 방법을 알아보았습니다. 굉장히 쉽게 나타낼 수가 있지만 한 가지 문제가 있습니다. 저희가 나타내야 하는 정비소가 꽤나 많았기 때문에 위 방법을 이용하면 코드에 너무나 많은 Marker를 정의해야하죠. Folium에서는 이를 해결하기 위해 FeatureGroup이라는 기능을 제공하고 있습니다. 수 많은 Marker들을 하나의 그룹으로 묶어서 컴팩트하게 지도에 표시할 수 있도록 합니다. FeatureGroup과 그 이름을 지정하여 객체를 생성하고, 아까 생성한 Marker를 그룹에 넣어주면 됩니다. 이러면 여러 개의 Marker를 하나씩 map에 add 해줄 필요 없이 그룹으로 묶어 지도에 나타낼 수 있습니다.
feature_group = folium.FeatureGroup("Locations")
feature_group.add_child(folium.Marker(
                          location=coords,
			  popup=popup,
		       	  tooltip=html
			 )
		       )
map.add_child(feature_group)
notion image
Marker를 이용해서 지도를 나타냈는데 뭔가 아쉬운 느낌이 들었습니다. 정비소들은 모두 사용자 위치에서 지정한 반경 내에만 위치하면 나타나는데, 그 반경을 표시한 경계선이 있으면 조금 더 깔끔해보일거 같다는 생각이 들었는데요. 이는 Circle 을 이용하여 아주 쉽게 나타낼 수 있었습니다. 중심이 되는 좌표를 지정하고, 색깔과 반경까지 표시한 뒤 map에 추가하면 반경을 가르키는 경계선이 추가되면서 조금 더 깔끔한 지도가 완성이 되었네요.
folium.Circle([user_lat, user_lon],
                color='tomato',
                radius=radius*1000
              ).add_to(map)
notion image

완성된 정비소 지도

정비소 지도 구현을 마친 뒤, 마지막으로 해당 기능을 상담 콘솔에 추가하였습니다. 그리고 이를 메카닉 분들이 편리하게 사용하실 수 있도록 상담 콘솔에 좌표 아이콘을 추가하였는데요. Streamlit의 쿼리 파라미터 기능을 활용하면 주요 정보(좌표, 희망 정비 거리)를 넘길 수 있어 좌표 아이콘 클릭 한번만으로도 희망 정비 지역 내 업체를 지도 상에서 바로 확인할 수 있도록 하였습니다.
이를 통해 사용자가 희망 정비 지역과 거리를 선택하여 커뮤니티에 글을 남기면 커뮤니티 관리 콘솔에서 아래 그림의 좌표 아이콘으로 바로 정비소 지도로 이동할 수 있는 원클릭 플로우를 만들 수 있었습니다.
빨간 박스 안의 버튼을 누르면
빨간 박스 안의 버튼을 누르면
정비소 지도 페이지로 이동
정비소 지도 페이지로 이동

사용 후기

이제 배포된 서비스는 피드백을 위해 일정 기간 동안 메카닉 분들이 사용해보는 시간을 가졌습니다. 사용을 통해 느끼셨던 효과와 보완점에 대한 피드백을 정리해보면 아래와 같습니다. 보완점은 해결방안과 함께 정리하였습니다.

효과

  • 지도와 필터 기능을 동시에 이용할 수 있어 거리와 특징을 종합하여 문의를 안내하기 용이
  • Tooltip 기능을 통해 업체 정보를 빠르게 파악 가능
  • 업체명 일부만 알아도 검색이 가능

보완점

1. 업체를 추가하면 실시간으로 지도에 반영되지 않음
=> 카프카를 이용한 실시간 업데이트 반영 예정 → 해결!
2. 업체명 뿐 아니라 메모도 검색 지원이 되었으면 좋겠음
=> 메모에 대한 검색 지원 필요
3. 희망 정비 지역 주소가 표시되었으면 좋겠음
=> 희망 정비 지역 주소명 query_param으로 추가 예정 → 해결!
4. 수입차/국산차에 대한 필터
=> 정비소 데이터베이스에 해당 필터에 대한 필드 추가 예정 → 해결!

마치며

이렇게 숨차게 달렸던 정비소 지도 프로젝트가 마무리 되었습니다. 하루 만에 닥터차 메카닉 분들이 실무에서 사용 가능할 정도로 서비스를 개발하는 것이 목표였기 때문에 정말 휘몰아 치듯이 개발을 하였는데요. 그 과정에서 많은 것을 깨닫고, 적용해보려고 노력했던 것 같습니다. 특히 제목에서도 보이듯이 Streamlit을 단지 간단한 프로토타입 어플리케이션을 만드는 용도로만 알고 있었는데 잘만 활용하면 실제 사용할 수 있는 서비스까지도 낼 수 있는 좋은 기능들과 사용성을 가지고 있는 강력한 라이브러리라는 것을 알게 되었던 것 같습니다. 그리고 이를 Elasticsearch와 함께 사용한 것은 또 다른 새로운 경험이었습니다.
또한 이번 기회를 통해 메카닉 분들이 하는 업무를 조금이나마 더 잘 알수 있었고, 메카닉 분들이 느끼고 있는 비효율성을 개선하는 작업을 해보면서 사용자를 위한 서비스 자체의 개선도 중요하지만 그 서비스를 만들어나가는 내부 인원들의 업무 프로세스를 개선하는 것도 굉장히 중요한 과업이라는 것을 느끼게 되었던 것 같습니다. 앞으로도 사내의 개선할만한 여지가 있는 부분들을 발견하여 하나씩 고쳐나가 결국 닥터차 서비스 전체에 좋은 영향을 줄 수 있는 프로젝트를 많이 탐구하고 개선해야겠다라고 생각하게 되었습니다.
끝으로 오토피디아는 좋은 서비스를 만들고 싶은 욕심과 프로세스를 개선하는 효율화를 끊임없이 고민하는 메이커 분들을 찾고 있습니다. 더 나은 방법을 찾기 위해 치열하게 고민하는 오토피디아가 궁금하시다면 공식 채용 페이지를 통해 다양한 정보를 확인해보세요.
글 읽어주셔서 감사하고, 혹시나 궁금한 점이 있으시다면 댓글 남겨주시면 최대한 답변 해드리도록 하겠습니다. 다음에 더 좋은 글로 찾아뵙겠습니다!

Reference

오토피디아 채용에 관한 모든 것을 준비했어요

첨단기술을 통한 모빌리티 혁신, 함께 하고 싶다면?

채용 둘러보기

글쓴이

김건우
김건우

Data Engineer

    0 comments