{"id":14969062,"url":"https://github.com/connect-foundation/2019-12","last_synced_at":"2025-07-05T05:32:44.330Z","repository":{"id":35838196,"uuid":"218952214","full_name":"connect-foundation/2019-12","owner":"connect-foundation","description":"🎟 급증하는 트래픽에도 안정적인 예약 서비스, Atomic Pattern을 적용한 재사용 가능한 컴포넌트, 실용적인 Testing을 주제로 하는 이벤트 서비스","archived":false,"fork":false,"pushed_at":"2023-07-18T20:10:59.000Z","size":19699,"stargazers_count":270,"open_issues_count":43,"forks_count":27,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-03-31T12:06:04.617Z","etag":null,"topics":["atomic","cypress","docker","enzyme","express","jest","kubernetes","mariadb","nodejs","react","redis","storybook","styled-components","supertest","travis-ci","typescript"],"latest_commit_sha":null,"homepage":"https://www.bookus.kr","language":"TypeScript","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:11:04.000Z","updated_at":"2025-01-08T13:03:36.000Z","dependencies_parsed_at":"2024-09-23T04:01:56.053Z","dependency_job_id":"fa024b0e-607a-4915-ae80-d78036261162","html_url":"https://github.com/connect-foundation/2019-12","commit_stats":{"total_commits":1438,"total_committers":7,"mean_commits":"205.42857142857142","dds":0.6891515994436718,"last_synced_commit":"aa43e4606ca1ad251e3ee8cf0c367cb296410ae1"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connect-foundation%2F2019-12","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connect-foundation%2F2019-12/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connect-foundation%2F2019-12/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/connect-foundation%2F2019-12/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/connect-foundation","download_url":"https://codeload.github.com/connect-foundation/2019-12/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247657282,"owners_count":20974345,"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":["atomic","cypress","docker","enzyme","express","jest","kubernetes","mariadb","nodejs","react","redis","storybook","styled-components","supertest","travis-ci","typescript"],"created_at":"2024-09-24T13:41:04.406Z","updated_at":"2025-04-07T13:10:44.310Z","avatar_url":"https://github.com/connect-foundation.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1\u003eBookUs!\u003c/h1\u003e\n\u003cp\u003e\n    \u003cimg alt=\"travis\" src=\"https://api.travis-ci.org/connect-foundation/2019-12.svg?branch=master\" /\u003e\n    \u003cimg alt=\"Release\" src=\"https://img.shields.io/github/v/release/connect-foundation/2019-12\" /\u003e\n    \u003cimg alt=\"Cypress.io tests\" src=\"https://img.shields.io/badge/cypress.io-tests-green.svg\" /\u003e\n    \u003cimg alt=\"Storybook\" src=\"https://github.com/storybookjs/brand/raw/master/badge/badge-storybook.svg?sanitize=true\" /\u003e\n    \u003cimg alt=\"Server Test Coverage\" src=\"https://img.shields.io/badge/backend_coverage-85%25-success.svg\" /\u003e\n    \u003cimg alt=\"License: MIT\" src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" /\u003e\n\u003c/p\u003e\n\n### 📕 [Storybook for Bookus](https://storybook.bookus.kr/)\n\n### 🌲 [Cypress for Bookus](https://dashboard.cypress.io/projects/wauqe2/runs)\n\n## ✍️ Writing\n\n#### [Atomic Design for React](https://medium.com/@inthewalter/atomic-design-for-react-514660f93ba?) by [@inthewalter](https://github.com/inthewalter)\n\n#### [실용적인 리액트 테스트 전략](https://velog.io/@sdong001/%EC%8B%A4%EC%9A%A9%EC%A0%81%EC%9D%B8-%EB%A6%AC%EC%95%A1%ED%8A%B8-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%A0%84%EB%9E%B5) by [@doong-jo](https://github.com/doong-jo)\n\n#### [주니어 개발자의 CI/CD 도입기](https://velog.io/@jdd04026/%EC%A3%BC%EB%8B%88%EC%96%B4-%EA%B0%9C%EB%B0%9C%EC%9E%90%EC%9D%98-CICD-%EB%8F%84%EC%9E%85%EA%B8%B0-n6k3mkug47) by [@FullOfOrange](https://github.com/FullOfOrange)\n\n#### [Express 기반 프로젝트에서 Typescript Typing에 대한 고민](https://medium.com/@dobest27/express-%EA%B8%B0%EB%B0%98-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%97%90%EC%84%9C-typescript-typing-%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EB%AF%BC-cf282770595f) by [@dobest27](https://github.com/dobest27)\n\n#### [React Hooks 로 전역스토어 만들기](https://velog.io/@jdd04026/React-Hooks-API로-Redux-따라해보기) by [@FullOfOrange](https://github.com/FullOfOrange)\n\n## 소개\n\n[Bookus!](https://www.bookus.kr/)는 이벤트 예약 서비스 [Festa!](https://festa.io/) 클론 프로젝트입니다. 순간적으로 많은 트래픽이 몰리더라도 중단되지 않는 **안정적인** 선착순 예약 서비스를 목표로 하고 있습니다. 따라서 다음과 같은 도전과제를 갖고 있습니다.\n\n## 재사용성이 높고 테스트로 검증된 UI Component\n\n#### Atomic Desgin Pattern\n\n\u003cimg width=\"800\" alt=\"AtomicDesign\" src=\"https://user-images.githubusercontent.com/10372359/71318965-3db60c00-24db-11ea-985f-ce8ea1168e9d.png\"\u003e\n\n가장 작은 단위의 컴포넌트를 만들어, 큰 단위로 쌓아나가며 각각의 UI 단위를 만들어 나가는 디자인 패턴입니다. 이번 프로젝트에서는 재사용성이 뛰어난 UI를 위해 아토믹 디자인 패턴을 적용했습니다.\n\n## 실용적인 프론트엔드 테스트\n\n**1. Custom Hooks Testing**\n\n  비동기로 API 요청에 대한 처리가 주가 되는 상태 관리에 대한 테스트\n\n**2. Playground for UI components of Storybook**\n\n  Storybook을 통한 독립된 환경에서의 컴포넌트 테스트\n\n**3. Cypress를 이용한 End-to-End Testing**\n\n  각 페이지와 컴포넌트 UI 테스트\n\n## 과중한 트래픽이 몰려도 안정적으로 예약이 가능한 시스템\n\n예약이 필요한 시점마다 늘어나는 트래픽을 감당하기 위한 Container Orchestration 툴로 Kubernetes를 선택했습니다.\n[설정파일](https://github.com/connect-foundation/2019-12/tree/master/build/k8s)\n\n![Kubernetes-infra](https://user-images.githubusercontent.com/10372359/70730811-ff855380-1d48-11ea-96c7-b7ee207cf926.png)\n\n\n## DevOps\n\n![CICD pipeline](https://user-images.githubusercontent.com/10372359/70730814-00b68080-1d49-11ea-9fcf-d0251da08d0b.png)\n\n**[Travis CI](https://travis-ci.org/connect-foundation/2019-12/)**\n\n**Docker hub**\n\n[Frontend image](https://hub.docker.com/repository/docker/jdd04026/bu-front)\n\n[Backend image](https://hub.docker.com/repository/docker/jdd04026/bu-back)\n\n[Reserve Server image](https://hub.docker.com/repository/docker/jdd04026/bu-reserve)\n\n## Test\n\n테스트 커버리지 80를 목표로 하는 검증된 코드를 통한 안정적인 서비스를 목표로 합니다.\n\n- Front-End : Jest + Enzyme + Stroybook + Cypress\n- Back-End : Jest + Supertest\n\n## Built With\n\n![Dependancy](https://user-images.githubusercontent.com/10372359/70730864-14fa7d80-1d49-11ea-959f-b981d8460d90.png)\n\n## Team\n\n- 문종현 [@dobest27](https://github.com/dobest27)\n- 육진혁 [@FullOfOrange](https://github.com/FullOfOrange)\n- 이용호 [@inthewalter](https://github.com/inthewalter)\n- 조성동 [@doong-jo](https://github.com/doong-jo)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconnect-foundation%2F2019-12","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fconnect-foundation%2F2019-12","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fconnect-foundation%2F2019-12/lists"}