{"id":18318666,"url":"https://github.com/connect-foundation/2019-21","last_synced_at":"2025-04-05T21:32:59.897Z","repository":{"id":35968182,"uuid":"218952641","full_name":"connect-foundation/2019-21","owner":"connect-foundation","description":"🙋‍♀️ 🙋‍♂️  바글바글(Vaagle): 실시간 질의응답 및 투표 공유 서비스","archived":false,"fork":false,"pushed_at":"2023-07-18T22:35:03.000Z","size":7059,"stargazers_count":39,"open_issues_count":98,"forks_count":7,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-03-21T12:13:40.253Z","etag":null,"topics":["docker","express","graphql","mysql","nodejs","oauth","react","redis","sequelize-orm","socket-io"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/connect-foundation.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-01T09:13:36.000Z","updated_at":"2023-12-05T08:22:32.000Z","dependencies_parsed_at":"2024-11-05T18:11:26.679Z","dependency_job_id":"9781da26-90d3-4821-8f7e-b315e4fc7413","html_url":"https://github.com/connect-foundation/2019-21","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connect-foundation%2F2019-21","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connect-foundation%2F2019-21/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connect-foundation%2F2019-21/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connect-foundation%2F2019-21/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/connect-foundation","download_url":"https://codeload.github.com/connect-foundation/2019-21/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247406077,"owners_count":20933803,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","express","graphql","mysql","nodejs","oauth","react","redis","sequelize-orm","socket-io"],"created_at":"2024-11-05T18:11:12.156Z","updated_at":"2025-04-05T21:32:58.872Z","avatar_url":"https://github.com/connect-foundation.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 바글바글\r\n\r\n[sli.do](https://www.sli.do/)에서 아이디어를 영감 받은 실시간 질의응답 및 투표 공유 웹 서비스\r\n\r\n![GitHub release (latest by date)](https://img.shields.io/github/v/release/connect-foundation/2019-21)\r\n\r\n\u003cp\u003e\r\n  \u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://camo.githubusercontent.com/9568ddd91a2785f55e0947fb55ac1adb87810b8f/68747470733a2f2f696d672e736869656c64732e696f2f6e6f64652f762f7265616374\"\u003e\u003cimg alt=\"Version\" src=\"https://camo.githubusercontent.com/9568ddd91a2785f55e0947fb55ac1adb87810b8f/68747470733a2f2f696d672e736869656c64732e696f2f6e6f64652f762f7265616374\" data-canonical-src=\"https://img.shields.io/node/v/react\" style=\"max-width:100%;\"\u003e\u003c/a\u003e\r\n  \u003cbr\u003e\r\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://camo.githubusercontent.com/3fc8384246adb849bdc8a39fc7cc95164f9cb090/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6f64652e6a732d677261793f6c6f676f3d4e6f64652e6a73266c6f676f436f6c6f723d677265656e\"\u003e\u003cimg alt=\"Node.js\" src=\"https://camo.githubusercontent.com/3fc8384246adb849bdc8a39fc7cc95164f9cb090/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4e6f64652e6a732d677261793f6c6f676f3d4e6f64652e6a73266c6f676f436f6c6f723d677265656e\" data-canonical-src=\"https://img.shields.io/badge/Node.js-gray?logo=Node.js\u0026amp;logoColor=green\" style=\"max-width:100%;\"\u003e\u003c/a\u003e\r\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://camo.githubusercontent.com/260026eff932ac17205eb2caffb4af919abae4a9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4772617068514c2d677261793f6c6f676f3d4772617068514c266c6f676f436f6c6f723d453130303938\"\u003e\u003cimg alt=\"GraphQ:\" src=\"https://camo.githubusercontent.com/260026eff932ac17205eb2caffb4af919abae4a9/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4772617068514c2d677261793f6c6f676f3d4772617068514c266c6f676f436f6c6f723d453130303938\" data-canonical-src=\"https://img.shields.io/badge/GraphQL-gray?logo=GraphQL\u0026amp;logoColor=E10098\" style=\"max-width:100%;\"\u003e\u003c/a\u003e\r\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://camo.githubusercontent.com/1a43bf3f61dcfb33888aefc1e77c44f54f1f5e53/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f636b65722d677261793f6c6f676f3d446f636b6572266c6f676f436f6c6f723d313438384336\"\u003e\u003cimg alt=\"Docker\" src=\"https://camo.githubusercontent.com/1a43bf3f61dcfb33888aefc1e77c44f54f1f5e53/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f446f636b65722d677261793f6c6f676f3d446f636b6572266c6f676f436f6c6f723d313438384336\" data-canonical-src=\"https://img.shields.io/badge/Docker-gray?logo=Docker\u0026amp;logoColor=1488C6\" style=\"max-width:100%;\"\u003e\u003c/a\u003e\r\n\u003ca target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://camo.githubusercontent.com/193d7edd8b658e1976fbb35056b057bb05f80b3f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742e6a732d677261793f6c6f676f3d5265616374266c6f676f436f6c6f723d363144414642\"\u003e\u003cimg alt=\"React\" src=\"https://camo.githubusercontent.com/193d7edd8b658e1976fbb35056b057bb05f80b3f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f52656163742e6a732d677261793f6c6f676f3d5265616374266c6f676f436f6c6f723d363144414642\" data-canonical-src=\"https://img.shields.io/badge/React.js-gray?logo=React\u0026amp;logoColor=61DAFB\" style=\"max-width:100%;\"\u003e\u003c/a\u003e\r\n\u003c/a\u003e\r\n\r\n\u003c/p\u003e\r\n\r\n## 배포 링크\r\n\r\n* [www.vaagle.com](http://www.vaagle.com)\r\n\r\n## 데모 영상\r\n- [데모영상](https://www.youtube.com/watch?v=jErevbCtdF0\u0026feature=youtu.be)\r\n\r\n## 주요 기능\r\n\r\n- 2가지 사용자 모드 제공 (Host: 이벤트를 주관하는 사용자, Guest: 이벤트에 참가하여 질문하는 사용자)\r\n- 실시간 질의응답(Guest 모드)\r\n   - 실시간 질문할 수 있음\r\n   - 질문에 좋아요를 누를 수 있음 (좋아요가 많으면 인기질문 Tab 상단쪽에 노출됨)\r\n   - 질문에 이모지를 추가할 수 있음\r\n   - 질문에 댓글을 달 수 있음\r\n- 실시간 질의응답 (Host 모드)\r\n   - 실시간 질문을 검열하여 특정 질문은 삭제할 수 있음\r\n   - 특정 질문을 상단에 고정시킬 수 있음\r\n   - 답변한 질문은 실시간질문 Tab에서 질문저장소로 이동시킬 수 있음\r\n- 실시간 투표\r\n   - 투표 종류: N지선다(복수선택 지원), 별점주기\r\n   - Host는 투표를 생성하여 Guest들에게 실시간 투표 참여를 요청할 수 있음\r\n   - Guest들은 투표를 할 수 있고, 투표 상황은 실시간 공유됨\r\n\r\n## 위키 링크\r\n\r\n[wiki](https://github.com/connect-foundation/2019-21/wiki)\r\n\r\n## 팀원\r\n\r\n-   [권혁(hkwon)](https://github.com/hkwon)\r\n-   [김근영(nuguya)](https://github.com/nuguya)\r\n-   [김유준(demetoir)](https://github.com/demetoir)\r\n-   [홍태의(teihong93)](https://github.com/teihong93)\r\n\r\n## 기술 스택\r\n\r\n-   Front-end: React, Apollo\r\n-   Back-end: nodejs, MySQL2, Sequelize, GraphQL(Yoga), socket.io, Oauth, Docker\r\n-   Env \u0026 etc: Eslint, babel, webpack, prettier, yarn, github, slack\r\n\r\n## DataFlow\r\n![vaagleDataFlow](https://user-images.githubusercontent.com/52785648/70682492-6885b080-1ce2-11ea-9f46-609338d4e8d7.jpg)\r\n\r\n## 기술적 특징\r\n- Express, socket.io, grpahQL, MySQL 총 4가지 서버가 Docker 위에서 상호작용하며 동작\r\n- 각각의 서버는 서로 의존적으로 연결되어있지 않고 독립적인 성격을 띄기 때문에 유지보수 및 에러 상황 대처에 유연\r\n- 각 서버는 각각의 인증 로직을 가지고 있기 때문에 외부로부터의 개별접근을 차단\r\n- 호스트 앱과 게스트 앱이 나뉘어있지만 서로가 실시간으로 연동\r\n- 실시간 처리를 보장하며 채팅뿐 아니라 채팅검열 및 상단 고정 등이 즉각적으로 여러 클라이언트에 반영\r\n- 실시간 투표를 통해 여러 클라이언트에 투표 결과를 실시간으로 반영\r\n- 모바일 환경을 고려한 모바일 First\r\n- React 컴포넌트 최적화를 통한 클라이언트 반응성 최적화\r\n- Google OAuth 로그인\r\n\r\n## 사용자 집단\r\n\r\n-   컨퍼런스/세미나/수업 참가자 및 운영자\r\n\r\n## 기획 배경 및 필요성\r\n\r\n-   수업, 강연, 토론 중 실시간 질의응답 및 투표를 통한 청중의 능동적 참여를 유도함\r\n-   완벽한 한글화 지원 ⇒ 이용자 연령층 확대 (중장년/아동)\r\n-   Front-end, back-end가 적절하게 배분, 4명이 도전적으로 개발할 만한 분량\r\n\r\n## 도전적 기능\r\n\r\n-   질문에 댓글 기능을 추가함\r\n-   Realtime \u0026 Robust: 실시간 질문 공유, 실시간 투표 및 안정적 서버/클라이언트 동작\r\n-   Localization: 한국인에게 친숙한 UI 개발 (카톡의 투표 UI, 다양한 한글폰트 추가 등)\r\n-   Mobile first: Guest 모드는 스마트폰에 최적화된 UI 개발, 최적화 작업 진행\r\n-   Emoji 적용\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconnect-foundation%2F2019-21","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconnect-foundation%2F2019-21","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconnect-foundation%2F2019-21/lists"}