해커톤 네트워킹 앱 HackMate 매치, 코드로 완성하는 최고의 네트워킹 방법

해커톤 네트워킹 앱 HackMate 매치, 코드로 완성하는 최고의 네트워킹 방법
Cozy CodingPosted On Jun 23, 20247 min read

틴더에서 완벽한 매치를 찾지 못하고 좌우로 스크롤하는 것에 지쳤나요? 만약 다가오는 해커톤을 위한 완벽한 팀 멤버를 찾을 수 있는 틴더의 매칭 기능을 사용할 수 있다면 어떨까요? 많은 해커톤 참가자들이 상호 보완적인 기술과 공유된 관심사를 가진 팀 멤버를 찾는 데 어려움을 겪고 있고, 검색과 네트워킹에 많은 시간을 투자하면서 종종 좌절감을 느끼곤 합니다.

해커톤 네트워킹 솔루션

해커톤 네트워킹을 위한 해크메이트 소개

마이 솔루션인 해크메이트는 해커톤 참가자들을 공통된 관심사와 목표를 가진 유사 마인드의 개인들과 매칭시키는 앱을 구축하는 것입니다. 두 사용자가 서로 우측으로 스와이프하면, 앱 내에서 서로의 프로젝트 아이디어와 목표에 대해 토론할 수 있습니다.

주최자들은 해커톤 소통을 위해 별도의 디스코드 서버를 설정하는 수고를 덜게 됩니다. 내 앱은 내장된 그룹 생성 기능을 제공하여 이 과정을 간단하게 만듭니다. 해커톤에 등록하는 즉시 참가자들은 앱 내 전용 그룹에 자동으로 추가됩니다. 이 그룹은 해커톤 관련 모든 소통을 위한 중앙 허브로 작용하여 참가자들이 외부 플랫폼에 가입할 필요가 없게 합니다. 게다가, 해커톤이 끝나면 그룹이 자동으로 삭제되어 수동 정리 작업이 필요 없게 되며 앱 내에서 효율적으로 해커톤 관련 소통을 관리할 수 있습니다.

문제 해결: 팀원 구성과 효과적인 소통 보장

팀원 구성

기대하는 많은 참가자들이 해커톤에서 적합한 팀원을 찾는 데 상당한 어려움을 겪습니다. 해커톤 등록을 지원하는 다양한 웹사이트들이 있지만, 이러한 플랫폼들은 종종 개인들을 효과적으로 연결하고 통합된 팀을 형성하지 못합니다. 결과적으로 많은 재능 있는 개인들은 호환되는 팀원이 없어 해커톤에 참여할 수 없게 됩니다. LinkedIn과 같은 인기 있는 네트워킹 플랫폼조차도 이 문제를 해결하지 못했습니다. LinkedIn은 다양한 산업 분야에서 전문 네트워킹에 초점을 맞추고 있으며 거대한 사용자 기반을 제공하지만, 해커톤 협업을 찾는 구체적인 개인들을 특별히 유인하지 못할 수 있습니다. LinkedIn의 검색 및 필터링 옵션은 해커톤에 특화된 기준에 맞춰 최적화되어 있지 않습니다.

효과적인 소통

해커톤 소통을 위해 별도의 Discord 서버를 만드는 것은 도전과 비효율성을 초래할 수 있습니다. 참가자들이 다른 플랫폼에 가입하고 탐색하는 데 추가적인 노력이 필요하고 이는 혼란과 조각난 소통 경험을 초래할 수 있습니다. 또한 업데이트를 놓치고 참여도가 감소할 수 있습니다. 별도의 Discord 서버를 관리하면 참가자들이 모두 서버에 가입하고 관련 채널에 접근할 수 있도록 보장해야 하는 주최자들에게 복잡함이 추가됩니다. 해커톤 후 그룹을 수동으로 삭제하는 데 추가적인 노력이 필요합니다. 저의 앱은 이러한 장애물을 제거하여 내장된 그룹 기능을 제공하고 참가자의 가입과 그룹 삭제를 자동화하여 소통을 간소화하고 해커톤 주최자와 참가자들에게 협업을 강화합니다.

HackMate 작동 방식

  • Preferences: 내 앱은 사용자가 팀원 위치와 기술을 지정할 수 있도록 합니다.
  • 매칭: 스와이프 기능을 사용하여 앱은 사용자들을 선호도에 기반하여 매칭하고 연결을 설정합니다.
  • 앱 내 채팅: 매칭이 이루어지면 사용자들은 앱 내에서 프로젝트 아이디어와 목표에 대해 토론할 수 있는 채팅을 시작할 수 있습니다.
  • 팀 생성: 사용자들이 협업을 결정하면 앱 내에서 팀을 만들 수 있습니다.
  • 조직: 팀 리더는 팀원들에게 태그와 역할을 할당하여 조직을 더 잘 유지할 수 있습니다.
  • 통합된 커뮤니케이션: 별도의 디스코드 서버에 가입할 필요가 없습니다. 내 앱은 주관자의 그룹과 통신을 관리하기 위해 통합되어 있습니다.
  • 자동화된 그룹 관리: 해커톤에 등록하자마자 사용자는 앱에 생성된 그룹에 자동으로 포함됩니다. 해커톤 통신을 위해 생성된 그룹은 해커톤이 종료되면 자동으로 삭제되어 깔끔하고 조직적인 경험을 제공합니다.

이미지1

이미지2

이미지3

Image 1

Image 2

Tech Stack

  • Backend: Appwrite Cloud
  • 인증
  • 데이터베이스
  • 저장 공간
  • 기능
  • 실시간 API

프론트엔드: 플러터

  • flutter_bloc 상태 관리
  • 캐싱 전략을 위한 Hydrated Bloc
  • 고급 라우팅 기능을 위한 Auto Routes
  • build_runner를 사용한 자동 코드 생성

프로젝트 아키텍처

프로젝트는 청결 아키텍처에서 제시된 원칙에 깊게 의존합니다. 이 아키텍처는 관심사 분리를 쉽게 위해 기능을 서브모듈로 나누는 데 크게 의존합니다. 각 기능은 데이터 및 프레젠테이션 레이어로 구분되며, cubits/blocs은 데이터와 프레젠테이션 사이의 미들웨어 역할을 합니다.

이미지

원칙과 패턴

  • DRY (Don’t Repeat Yourself): 이 패턴은 프로젝트 전체에 재사용 가능한 구성 요소를 생성하는 데 따르며, 시간이 흘러도 개발 속도를 높입니다.
  • 다중 환경: 앱이 아직 제작 중이며 공개 출시를 하지 않을 예정이므로 샌드박스 환경을 사용하고 있습니다. 로그인 화면에서 앱 이름을 길게 누르면 환경을 변경할 수 있습니다.
  • Dart Linting 규칙: 이 앱은 프로젝트 전반에 걸쳐 Dart Linting 규칙을 사용하며, analysis_options.yaml을 통해 일반적인 규칙을 따릅니다. dart_code_metrics 패키지를 사용하여 고급 Linting 규칙을 적용합니다.
  • 예외 처리: 앱에는 모든 예외를 잡는 Appwrite 예외 처리도 포함되어 있습니다. 앱 예외를 위한 중앙 위치는 Sentry, Firebase Crashlytics 등의 에러 보고 플러그인과 간편한 구성을 제공합니다.

오픈 소스 라이브러리들

프로젝트는 여러 가지 오픈 소스 라이브러리에 의존하며, 이러한 라이브러리들은 실전에서 검증되었으며 보일러플레이트를 제거하는 데 도움이 됩니다:

  • djangoflow_app by Apexive.com
  • djangoflow_app_links by Apexive.com
  • progress_builder by Apexive.com
  • pin_code_fields by Saiful Islam Adar
  • smooth_page_indicator by codeness.ly

인증 및 데이터베이스

인증

  • 구글, 전화 인증
  • 사용자 설문 조사를 위한 환경 설정 관리

데이터베이스

저는 dev라는 데이터베이스를 생성하고 ID를 hackmate-dev로 지정했습니다. 이 구조는 name-env 규칙을 따르기 때문에 앱 상태에서 사전 정의된 앱 이름과 환경을 가져와 앱에서 쉽게 구성할 수 있습니다.

컬렉션

  • user: 사용자 데이터, 매치, 싫어요, 좋아요, 매치 요청, teamId를 저장하는 데 사용됩니다.
  • hackathons: 해커톤 관련 데이터를 저장하는 데 사용됩니다. upcoming_date 필드를 통해 예정된 해커톤을 지원합니다.
  • chat: 이벤트 기반 기능을 통해 두 사용자 간의 채팅 컬렉션을 만드는 데 사용됩니다.
  • banners: 상단에있는 앱 배너를 사용자 정의하는 데 사용됩니다. active 필드를 false로 설정하여 배너를 비활성화 할 수 있습니다.
  • teams: 사용자가 만든 앱의 팀 및 팀 구성원 (ID 및 역할 데이터)을 저장합니다.
  • team_vacancy: 앱에서 관리자가 생성할 수있는 팀 공석 게시물과 관련된 데이터를 저장합니다.

보안

나는 보안에 큰 중점을 두었으며 그래서 모든 컬렉션에 적절한 데이터 액세스 규칙이 있습니다. 두 사용자 간의 채팅을 위해 Appwrite의 문서 보안 규칙을 사용하여 채팅하는 두 사용자에게만 액세스 권한을 부여했습니다.

저장소 및 기능

저장소

팀 및 사용자 이미지를 저장하기 위해 저장소를 사용했어요. dev라는 버킷을 만들고 ID를 hackmate-dev로 지정했어요. 이 구조는 위에서 언급한 장점을 위해 데이터베이스 구조와 유사했어요.

기능

클라우드 함수는 두 사용자 간에 동적 채팅 컬렉션을 생성하는 데 내 응용 프로그램에서 유용했습니다. GitHub의 functions/appwrite/chat/functions/createChatCollection 디렉토리에서 해당 코드를 찾을 수 있습니다. 이를 위해 Dart 런타임과 Appwrite 관리자 SDK를 사용했습니다. 이벤트 databases..collections.chat.documents..create는 채팅 컬렉션에 만들어지는 문서를 청취하고 두 사용자 간의 메시지를 저장하기 위한 지정된 스키마로 새 컬렉션을 만드는 함수를 트리거하는 데 사용되었습니다.

버전 관리

로컬 및 원격 저장소 관리를 위해 Git과 GitHub를 사용했습니다. 개발 라이프사이클 전체에서 Git의 다양한 기능인 add, stash, commit, 브랜치, 풀, 푸시 등을 사용했습니다. 또한 커밋 전에 코드 품질과 형식을 확인하기 위해 사용자 지정 Git 후크를 설계했습니다. 해당 후크는 scripts/git/ 디렉토리 아래에서 찾을 수 있습니다.

직면한 도전들

프론트엔드에서 컬렉션을 생성할 수 없는 문제로 채팅 컬렉션을 동적으로 생성해야 하는 상황에서 꽤 난처했어요. Appwrite의 함수 문서를 차분히 살펴본 후, 이벤트 기반 함수를 사용하기로 결정했어요. 또 다른 어려운 측면은 채팅 기능을 실시간으로 만드는 것이었지만, Appwrite Cloud의 실시간 기능으로 쉽게 처리했어요.

해결 방법

이 프로젝트에서 대부분의 기능을 위해 Appwrite를 사용한 후, 실시간 기능에 중요한 단점을 발견했어요. 구체적으로, 클라우드 콘솔을 통해 실시간 구독을 설정하면 종종 연결이 끊기며 기능이 가끔 작동하지 않는 문제가 있어요. 자세한 내용은 Appwrite 공식 저장소의 이 문제를 참조해주세요: 이슈 #8037. 따라서, 직접 Appwrite 도로플릿을 배포하거나 다른 BaaS 솔루션으로 전환해야 할 것 같아요.

Github 저장소: https://github.com/Photon3009/Hackmate 앱 다운로드 링크: https://github.com/Photon3009/Hackmate/releases/tag/v1.0.0

질문이나 제안이 있으시면 언제든지 연락해주세요! LinkedIn에서 저와 연결하거나 Twitter에서 팔로우해주세요.

좋은 코딩 하세요:)