{"id":25123195,"url":"https://github.com/f-lab-edu/ward-study-reservation","last_synced_at":"2026-03-03T16:36:20.794Z","repository":{"id":37905785,"uuid":"475047739","full_name":"f-lab-edu/ward-study-reservation","owner":"f-lab-edu","description":"스터디모임 룸 예약 서비스","archived":false,"fork":false,"pushed_at":"2024-01-03T16:50:07.000Z","size":725,"stargazers_count":29,"open_issues_count":2,"forks_count":5,"subscribers_count":1,"default_branch":"develop","last_synced_at":"2025-04-23T01:13:19.594Z","etag":null,"topics":["docker","docker-compose","gradle","java","jpa","mysql","querydsl","redis","spring-batch","spring-boot"],"latest_commit_sha":null,"homepage":"","language":"Java","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/f-lab-edu.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,"zenodo":null}},"created_at":"2022-03-28T14:49:01.000Z","updated_at":"2024-12-31T15:37:07.000Z","dependencies_parsed_at":"2024-01-03T10:38:08.091Z","dependency_job_id":"d34ea320-1c86-4c79-bee0-1c5868767766","html_url":"https://github.com/f-lab-edu/ward-study-reservation","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/f-lab-edu/ward-study-reservation","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f-lab-edu%2Fward-study-reservation","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f-lab-edu%2Fward-study-reservation/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f-lab-edu%2Fward-study-reservation/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f-lab-edu%2Fward-study-reservation/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/f-lab-edu","download_url":"https://codeload.github.com/f-lab-edu/ward-study-reservation/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/f-lab-edu%2Fward-study-reservation/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30051981,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-03T15:26:47.567Z","status":"ssl_error","status_checked_at":"2026-03-03T15:26:17.132Z","response_time":61,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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","docker-compose","gradle","java","jpa","mysql","querydsl","redis","spring-batch","spring-boot"],"created_at":"2025-02-08T07:16:12.302Z","updated_at":"2026-03-03T16:36:20.758Z","avatar_url":"https://github.com/f-lab-edu.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 👯‍♀️ ward-study-reservation\n스터디모임 룸 예약 서비스 \n![ward-study_image](https://user-images.githubusercontent.com/62453668/169026026-6278161e-781f-4f9c-86fd-1d7a0e8c821f.jpg)\n\n언제 어디서든 소규모로 사용자들이 스터디모임을 활성화하기 위한 서비스로 도안하였습니다.\n스터디를 형성하는 데 많은 갈증을 느끼는 사용자가 하나의 토픽을 중심으로 룸을 예약하여  “몰입의 경험”을 선사하는 것이 이 서비스의 취지입니다.\n\n\u003cbr\u003e\n\n## 🔍 서비스 `MVP(Minimum Valuable Product)`\n\n**1. 사용자(리더)가 StudyGroup 등록/참여**\n\n**2. 사용자(리더)가 Reservation 등록**\n\n**3. 사용자가 참가한 StudyGroup의 Reservation 조회**\n\n**4. 해당 Room의 Reservation 조회**\n\n**5. Reservation의 해당 사용자들에게 Notification 이메일 정기알람**\n\n\u003cbr\u003e\n\n## 💡 프로젝트 목표\n**1. 객체 지향 원리를 적용하여 `CleanCode`를 목표로 유지보수가 용이한 코드 구현**\n- 중복되는 코드들, 불필요하게 수정이 일어날 코드들을 최소화해 확장이 용이하게 노력합니다.\n- SOLID 원칙과 디자인패턴의 이해를 바탕을 하여 최대한 `도메인 주도 설계`를 하기 위해 노력합니다.\n\n**2. 단순 기능 구현만이 아닌 대용량 트래픽을 고려한 `scale-out`에 고려한 서버 구조 설계**\n- 서비스가 성장하여 대량의 TPS 수치의 접속자수가 있다고 가정, 그 정도의 트래픽에도 견딜 수 있는 `분산 데이터베이스 아키텍쳐`를 설계하기 위해 노력했습니다.  \n\n**3. `문서화`를 통한 협업**\n- 프론트엔드-백엔드 팀들이 협업하는 환경에서 API 문서를 통한 커퓨니케이션 호율성을 높이기 위해 노력합니다.\n- API 문서를 함께 작성하는 것은 비효율적이기 때문에 `Swagger`와 같은 툴을 활용하여 문서화와 테스트도 쉽게 처리할 수 있게 합니다.\n\n**4. `테스트코드`를 통해 코드품질 향상, `CI/CD`를 통한 자동화 구현**\n- 다수의 개발자가 하나의 서비스를 개발해나가는 환경에서는 각자의 코드가 쉽게 배포할 수 있도록 Jenkins를 활용해 배포 자동화하는 설계에도 많은 리소스를 소요하였습니다.  \n- CI/CD를 직접 구축하여 애자일한 개발 프로세스를 실현하기 위해 노력합니다.\n\n**5. `성능 모니터링`으로 프로젝트의 신뢰성을 높임**\n- `nGrinder`나 `JMeter` 같은 툴을 사용해 TPS 같은 성능지수를 체크, 트래픽이 많이 발생하는 부분을 모니터링하여 개선점을 찾아냅니다.\n- 그외 로그수집을 하여 개발 오류 파트를 빠르게 찾기 위해 `ELK` 시스템을 구축하여, 애플리케이션 오류 진단, 인프라 모니터링에 최적화시키기 위해 노력합니다.  \n\n\u003cbr\u003e\n\n## 🛒 사용 기술 스택\n- Java11\n- SpringBoot2.6\n- Gradle7.4\n- MySQL8.0 / Redis\n- JPA / QueryDsl\n- JUnit5\n- Spring Batch\n- Docker \n- Jenkins\n- JMeter \n\n\u003cbr\u003e\n\n## 🔗 CI/CD 구조도\n![image](https://user-images.githubusercontent.com/62453668/164407464-9df1d184-da84-4e4f-b533-2aad2a5b3757.png)\n\n\u003cbr\u003e\n\n## 🎡 서버 구조도\n![image](https://user-images.githubusercontent.com/62453668/204154448-c269d0bc-588c-4c4a-a646-88c9d54d9ba2.png)\n\n\u003cbr\u003e\n\n## 🗃 API 명세서\n✳ https://documenter.getpostman.com/view/14757100/2s8YzMY5fG\n\n\u003cbr\u003e\n\n## 👁‍🗨 이슈 정리\n[Wiki Issues \u0026 Trouble shooting](https://github.com/f-lab-edu/ward-study-reservation/wiki/4.-Issues-\u0026-Trouble-shooting)에서 확인할 수 있습니다!\n\n- [예약 시스템에서 동시성 제어와 더블부킹(중복요청)은 어떻게 막을까?](https://velog.io/@mooh2jj/예약-시스템에서-동시성-제어와-더블부킹중복요청은-어떻게-막을까)\n- [배치 시스템 Cursor 기반 vs Paging 기반 ItemReader 정하기](https://velog.io/@mooh2jj/Cursor-기반-vs-Paging-기반-ItemReader-정하기)\n- [Redis 캐싱적용해서 read 작업 성능 개선하기](https://velog.io/@mooh2jj/Redis-캐싱적용해서-read-작업-성능-개선하기)\n- [서버 분산 처리 환경에서 데이터의 불일치 문제- Redis에 session 저장하기](https://velog.io/@mooh2jj/서버-분산-처리-환경에서-데이터의-불일치-Redis에-session-저장하기)\n- [Spring ArgumentResolver 로 인증처리하기](https://velog.io/@mooh2jj/Spring-ArgumentResolver-로-인증처리하기)\n- [MySQL 실행계획으로 성능 측정하기(인덱스 설정 이후)](https://velog.io/@mooh2jj/MySQL-실행계획으로-성능-측정하기인덱스-설정-이후)\n- [JMeter로 성능 테스트](https://velog.io/@mooh2jj/JMeter로-성능-테스트)\n\n등등 ...\n\n\u003cbr\u003e\n\n## 🔖 Git-Flow 브랜치 및 PR 전략 \n\n✳ 참고문헌 :\n우아한 형제들 기술블로그 [우린 Git-flow를 사용하고 있어요](https://woowabros.github.io/experience/2017/10/30/baemin-mobile-git-branch-strategy.html)\n\n\n![image](https://user-images.githubusercontent.com/62453668/169458249-74e55a36-a631-4440-a52d-332fa78eb9f4.png)\n\n\n✅ `master` : 제품으로 출시될 수 있는 브랜치를 의미합니다. \n\n✅ `develop` : 다음 출시 버전을 개발하는 브랜치입니다. feature에서 리뷰완료한 브랜치를 Merge하고 있습니다.\n\n✅ `feature` : 기능을 개발하는 브랜치 \n\n✅ `release` : 이번 출시 버전을 준비하는 브랜치\n\n✅ `hotfix` : 출시 버전에서 발생한 버그를 수정하는 브랜치\n\n\n\n- `master`를 항상 최신 상태로 만들며, stable 상태로 Product에 배포되는 브랜치 (master = main) 로 삼습니다.\n- 신규개발 건은 `develop` 을 base로 `feature/#이슈번호` or `feature/작업명` 의 브랜치명으로 생성 후 작업한 다음 `PR`을 날립니다.\n- 아직 개발 진행 중이라면 `In Progress` 라벨을 달고, 코드리뷰가 필요한 경우 `Asking for Review` 라벨을 답니다. 리뷰 후 리팩토링이 필요하다면 추가로 `refactoring` 라벨을 달아 진행합니다.\n- 모든 `PR`은 반드시 지정한 `리뷰어`에게 코드리뷰를 받아야만 합니다.\n- 코드리뷰어의` Approve` 를 받아야 `Merge pull request` 를 할 수 있습니다.\n\n\n\n\u003cbr\u003e\n\n## 🎞 ER 다이어그램\n![image](https://user-images.githubusercontent.com/62453668/221393510-564ee139-48f6-4d2b-9a71-68fd8e5defb5.png)\n\n\u003cbr\u003e\n\n## 🎨 클라이언트 화면\n![image](https://user-images.githubusercontent.com/62453668/204130495-55216181-3106-4f9f-9af1-65c4a7ba8403.png)\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ff-lab-edu%2Fward-study-reservation","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ff-lab-edu%2Fward-study-reservation","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ff-lab-edu%2Fward-study-reservation/lists"}