KERBE.io

LIFE / retrospective

마켓컬리 해커톤 회고

#해커톤#회고#마켓컬리#WebSocket#Redis

마켓컬리 해커톤 회고

github: https://github.com/Team-MAIC/MAIC_Server

결론부터 말하면 팀명 "물아일체"로 기획 1명, 안드로이드 1명, 백엔드 2명(팀장 포함)이 참여해 총 156팀 중 12팀 이내 결선 진출로 마무리했다.

1. 해커톤을 왜 참여했나?

처음 해커톤에 참여한다는 소식을 주변에 알렸을 때, 회사에서 개발을 하고 있으면서 왜 굳이 해커톤에 나가냐는 질문을 가장 많이 받았다.

개발에 대한 흥미는 원래 높은 편이다. 다만 단순히 즐거운 것보다는 잘 만들고 싶은 욕심이 더 컸다. 참여를 결심한 이유는 크게 세 가지였다.

  • 회사에서 개발하면서 나는 지금 잘하고 있는 걸까?
  • 지금 담당하는 도메인이 아닌 새로운 도메인에서는 어떻게 접근해야 할까?
  • 회사 밖에서 나는 어느 정도 평가받을 수 있을까?

이런 의문을 품고 있던 차에 우연히 마켓컬리에서 주관하는 해커톤 소식을 보게 됐다. 현업자가 참여할 수 있는 해커톤 자체가 그리 많지 않았다.

2. 주제 선정

주제 선정

마켓컬리가 제시한 미션은 네 가지였다. 그중 두 가지는 머신러닝이 필요해 보였고, 한 가지는 너무 추상적으로 느껴져서 남은 한 가지를 선택했다.

물류 처리에 있어 사람이 개입되면서 발생하게 되는 다양한 오류에 대한 해결 방안을 제안해주세요.

물류를 전혀 모르는 상태였기 때문에 잘 해낼 수 있을지 시작부터 막막했다. 하지만 접해보지 못한 도메인에서 오히려 빛날 수 있지 않을까 하는 기대감도 컸다.

3. 휴먼 에러를 잡아라!

우리는 실시간 통신을 이용해 피킹과 DAS 과정에서 발생할 수 있는 휴먼 에러를 잡는 것을 목표로 삼았다.

마켓컬리의 물류 처리 과정을 조사해보니 피킹 → DAS → 패킹 → 배송, 이렇게 네 단계를 거쳐 상품이 배송된다는 걸 알 수 있었다. 마켓컬리 작업자들을 대상으로 설문조사를 진행한 결과, 실수가 가장 많이 발생하는 구간은 피킹과 DAS였다.

4. 실시간 통신에 대한 개발적 고민

우리가 실시간 통신을 어떤 방식으로 구현했고, 그 과정에서 어떤 고민을 했는지 남겨본다.

실시간 통신에는 어떤 방법이 있을까?

실시간 통신을 구현하는 방법은 크게 두 가지다.

  • 지속적으로 Request를 보내는 Polling 방식
  • 양방향 연결 채널을 구성하는 WebSocket 방식

같은 구역에서 일하는 여러 작업자가 서로 실시간으로 통신할 수 있어야 했기 때문에, 계속 Request를 날리는 Polling보다는 서버 부하가 낮고 양방향 통신이 가능한 WebSocket이 적합하다고 판단했다.

또한 특정 구역의 작업자들이 모두 같은 데이터를 받아 처리한다는 특성상, pub/sub 구조로 되어 있는 STOMP를 활용했다.

서버가 늘어나면 어쩌지?

동일 업무 시간대에 많은 작업자가 몰릴 수밖에 없어서, 서버 한 대로 모든 요청을 처리하기에는 무리가 있다고 판단했다.

그런데 서버가 여러 대로 늘어나면 문제가 생긴다. 소켓이 연결된 서버는 양방향 통신이 가능하지만, 다른 서버로 들어온 메시지는 전달받지 못한다. 서버 간 데이터 공유가 필요했고, 그래서 Redis Pub/Sub를 활용했다.

Redis Pub/Sub 구조도

5. 마치며

처음에는 단순히 참여하는 것에 의미를 두었다. 그런데 예선 통과, 본선 통과를 거치면서 점점 욕심이 생겨 우승까지 노려봤지만, 아쉽게도 결선 진출에서 마무리됐다.

156팀 중 12팀 이내 결선 진출

5일이라는 기간이 다른 해커톤에 비해 길게 느껴질 수도 있지만, 막상 하나의 서비스를 만들기에는 짧은 시간이었다. 그 짧은 시간 동안 최대한 많은 걸 구현하면서도 매 순간 최선의 선택을 하고 싶어 고민을 거듭하며 개발했지만, 돌아보니 부족한 부분이 많은 코드였다.

아쉬움도 많이 남았지만, 그만큼 한층 더 성장할 수 있는 기회였다.