Skip to content

Dev-Race/DevRace-backend

Repository files navigation


Dev Race 🧑‍💻

실시간 코딩 경쟁 및 채팅 서비스
Explore the team »


 📖 목차
  1.   🔍 Introduction
  2.   📹 Demo
  3.   📄 Documents
  4.   💻 Architecture
  5.   💡 Tech Stack
  6.   🗂️ Database
  7.   🤝 Git Convention
  8.   📂 Package Convention
  9.   👨‍👩‍👧‍👧 Team

🔍 Introduction

Description

최근 개발자들 사이에서 알고리즘 스터디 모임이 활발히 이루어지고 있습니다.
이를 위해, 함께 알고리즘 문제를 풀고 토의하며 경쟁할 수 있는 실시간 코딩 플랫폼을 제공합니다.
이 플랫폼으로 스터디원들의 실력을 빠르게 향상시키고, 모임의 운영 효율성을 극대화하고자 합니다.

Main Feature

  • 소셜 로그인 :  Google, Github을 통한 간편한 로그인 제공
  • 알고리즘 문제 풀이 :  '백준 온라인 저지' 문제를 바탕으로 다양한 언어 및 에디터 지원
  • 입장 대기열 :  초대 링크로 스터디원들을 초대하고 동시에 문제 풀이 시작
  • 실시간 랭킹 :  문제 풀이 중 실시간 순위 확인을 통한 경쟁 유도
  • 실시간 채팅 :  문제 풀이 중 힌트 주고받기 및 의견 교환 가능
  • 코드 보관 :  소스코드 및 채팅 내역 저장을 통한 복습 및 재풀이 지원

📹 Demo

📀  Demo Video :  Play!

  • 로그인 페이지  -  소셜 로그인 / 회원가입

login_gif

  • 입장 페이지  -  초대링크 접속 & 실시간 입장 대기열 참가

waiting_gif

  • 문제풀이 페이지  -  코드 컴파일 & 예제 채점

marking_gif

  • 문제풀이 페이지  -  실시간 채팅

chatting_gif

  • 문제풀이 페이지  -  문제풀이 성공 & 실시간 랭킹 반영

ranking_gif

  • 내 코드 페이지  -  코드 정렬 / 검색

mycode_gif

📄 Documents


💻 Architecture

System

devrace_architecture drawio

Network

devrace_network_architecture drawio

Detail

 CI/CD flow : Open!

[ Github ]

  •  trigger CI/CD
1. PR close & Merge into develop branch

[ Github Actions ]

2. build gradle
3. Dockerfile : build docker image
4. push image to Docker Hub
5. deploy to AWS Elastic BeanStalk
6. notify CI/CD results to Slack

[ AWS EB - in deploy ]

7. set timezone & swap memory
8. set RabbitMQ
  - create docker network (if not exists)
  - docker run RabbitMQ image (if not run)
  - connect to docker network (if not connected)
  - enable RabbitMQ plugins (if not enabled)
9. pull image from Docker Hub
10. docker run Spring image

[ AWS EB - after deploy ]

11. connect Spring to docker network (if not connected)
12. logging Connect results & monitoring on AWS CloudWatch
==> deploy complete.

 Notification : Open!

slack collaboration_alarm

→  Slack Notifications sent by the GitHub Actions :
💡 PR Open  💬 PR Review  ❌ CI/CD Fail  ✅ CI/CD Success


💡 Tech Stack

Backend Security Database Deployment Other










- Frontend : React, JavaScript, Redux
- Backend : Spring Boot, Java | Security, JWT, OAuth2 | STOMP, RabbitMQ
- Database : MySQL, MongoDB
- Deployment : AWS Amplify, AWS Elastic Beanstalk, Docker, Github Actions
- Documentation : Notion, Swagger
- Notification : Slack

→  BE Version :  Java 17 · Spring Boot 3.1.11

🗂️ Database

devrace DB ERD

🤝 Git Convention

Branch

  • Github-Flow 전략
  • 반드시 "develop"에서 뻗어나와 develop으로 "merge" 되어야한다.
  • main : 출시 배포 CI/CD용 branch (미사용)
  • develop : 개발 개포 CI/CD용 branch
  • feature : 기능 구현용 branch
  • Issue_종류/#Issue_번호 : branch 생성

Issue

✨ Feat 🐛 Fix ♻️ Refactor ✅ Test
📁 File 📝 Docs 🔧 Chore ⚙️ Setting

종류 내용
✨ Feat 기능 구현
🐛 Fix 버그 수정
♻️ Refactor 코드 리팩토링
✅ Test 테스트 업무
📁 File 파일 이동 또는 삭제, 파일명 변경
📝 Docs md, yml 등의 문서 작업
🔧 Chore 이외의 애매하거나 자잘한 수정
⚙️ Setting 빌드 및 패키지 등 프로젝트 설정
< Issue Title >
[Issue_종류] 구현_주요내용
ex) [Feat] 소셜 로그인 및 회원가입 기능

Commit

< Commit Message >
[#Issue_번호] Issue_종류: 구현_내용
ex) [#32] Feat: Security 및 OAuth2 구현

Pull Request

  • Pull Request만 날리고, 중요 Approve는 reviewer가 한다.
  • PR Open & Review & Close(CI/CD) → Slack 알림
< PR Title >
[#Issue_번호] Issue_종류: 이슈내용
ex) [#32] Feat: 소셜 로그인 및 회원가입 기능

Template


📂 Package Convention

Structure

## DevOps ##
├── .ebextensions : AWS EB 환경 설정
├── .github
│   └── workflows : CI/CD 실행, Slack 알림
├── .gitmodules : Git 서브모듈 정의
├── .platform
│   └── hooks
│       └── postdeploy : EB 배포 이후 실행
├── Dockerfile : 도커 이미지 빌드 설정
├── Dockerrun.aws.json : 도커 컨테이너 EB 배포 설정
└── submodule-backend : 배포용 properties 관리

+

## Backend ##
├── config
├── controller
├── service
│   └── impl
├── repository
├── domain : Entity
│   ├── enums
│   ├── common : BaseEntity
│   └── mapping : 다대다 매핑
├── dto
├── response : API 응답, Exception 핸들러
│   ├── responseitem
│   └── exception
├── security
│   ├── jwt : 토큰 처리
│   │   └── handler
│   └── oauth2 : 소셜 로그인
│       ├── handler
│       └── userinfo
└── util
 Detailed Structure : Open!
├── .ebextensions
│   ├── 00-set-timezone.config
│   ├── 01-set-swapmemory.config
│   └── 02-rabbitmq.config
├── .github
│   ├── ISSUE_TEMPLATE
│   │   ├── custom.md
│   │   ├── feature.md
│   │   ├── fix.md
│   │   └── refactor.md
│   ├── PULL_REQUEST_TEMPLATE.md
│   └── workflows
│       ├── deploy.yml
│       ├── slack-pr-open.yml
│       └── slack-pr-review.yml
├── .gitmodules
├── .platform
│   └── hooks
│       └── postdeploy
│           └── connect_spring_to_network.sh
├── Dockerfile
├── Dockerrun.aws.json
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── sajang
│   │   │           └── devracebackend
│   │   │               ├── DevraceBackendApplication.java
│   │   │               ├── config
│   │   │               │   ├── AwsS3Config.java
│   │   │               │   ├── RabbitConfig.java
│   │   │               │   ├── SecurityConfig.java
│   │   │               │   ├── StompConfig.java
│   │   │               │   └── SwaggerConfig.java
│   │   │               ├── controller
│   │   │               │   ├── AuthController.java
│   │   │               │   ├── ChatController.java
│   │   │               │   ├── RoomController.java
│   │   │               │   ├── TestController.java
│   │   │               │   └── UserController.java
│   │   │               ├── domain
│   │   │               │   ├── Chat.java
│   │   │               │   ├── Problem.java
│   │   │               │   ├── Room.java
│   │   │               │   ├── User.java
│   │   │               │   ├── common
│   │   │               │   │   └── BaseEntity.java
│   │   │               │   ├── enums
│   │   │               │   │   ├── Language.java
│   │   │               │   │   ├── MessageType.java
│   │   │               │   │   ├── Role.java
│   │   │               │   │   ├── RoomState.java
│   │   │               │   │   └── SocialType.java
│   │   │               │   └── mapping
│   │   │               │       └── UserRoom.java
│   │   │               ├── dto
│   │   │               │   ├── AuthDto.java
│   │   │               │   ├── ChatDto.java
│   │   │               │   ├── ProblemDto.java
│   │   │               │   ├── RoomDto.java
│   │   │               │   ├── UserDto.java
│   │   │               │   └── UserRoomDto.java
│   │   │               ├── repository
│   │   │               │   ├── ChatRepository.java
│   │   │               │   ├── ProblemRepository.java
│   │   │               │   ├── RoomRepository.java
│   │   │               │   ├── UserRepository.java
│   │   │               │   ├── UserRoomRepository.java
│   │   │               │   └── UserRoomBatchRepository.java
│   │   │               ├── response
│   │   │               │   ├── GlobalExceptionHandler.java
│   │   │               │   ├── ResponseCode.java
│   │   │               │   ├── ResponseData.java
│   │   │               │   ├── exception
│   │   │               │   │   ├── CustomException.java
│   │   │               │   │   ├── Exception400.java
│   │   │               │   │   ├── Exception404.java
│   │   │               │   │   └── Exception500.java
│   │   │               │   └── responseitem
│   │   │               │       ├── MessageItem.java
│   │   │               │       └── StatusItem.java
│   │   │               ├── security
│   │   │               │   ├── jwt
│   │   │               │   │   ├── JwtChannelInterceptor.java
│   │   │               │   │   ├── JwtFilter.java
│   │   │               │   │   ├── TokenProvider.java
│   │   │               │   │   └── handler
│   │   │               │   │       ├── JwtAccessDeniedHandler.java
│   │   │               │   │       ├── JwtAuthenticationEntryPoint.java
│   │   │               │   │       ├── JwtExceptionFilter.java
│   │   │               │   │       └── JwtStompExceptionHandler.java
│   │   │               │   └── oauth2
│   │   │               │       ├── CustomOAuth2User.java
│   │   │               │       ├── CustomOAuth2UserService.java
│   │   │               │       ├── OAuthAttributes.java
│   │   │               │       ├── handler
│   │   │               │       │   ├── OAuth2LoginFailureHandler.java
│   │   │               │       │   └── OAuth2LoginSuccessHandler.java
│   │   │               │       └── userinfo
│   │   │               │           ├── GithubOAuth2UserInfo.java
│   │   │               │           ├── GoogleOAuth2UserInfo.java
│   │   │               │           └── OAuth2UserInfo.java
│   │   │               ├── service
│   │   │               │   ├── AuthService.java
│   │   │               │   ├── AwsS3Service.java
│   │   │               │   ├── ChatService.java
│   │   │               │   ├── ProblemService.java
│   │   │               │   ├── RoomService.java
│   │   │               │   ├── UserRoomService.java
│   │   │               │   ├── UserService.java
│   │   │               │   └── impl
│   │   │               │       ├── AuthServiceImpl.java
│   │   │               │       ├── AwsS3ServiceImpl.java
│   │   │               │       ├── ChatServiceImpl.java
│   │   │               │       ├── ProblemServiceImpl.java
│   │   │               │       ├── RoomServiceImpl.java
│   │   │               │       ├── UserRoomServiceImpl.java
│   │   │               │       └── UserServiceImpl.java
│   │   │               └── util
│   │   │                   ├── LongListConverter.java
│   │   │                   ├── MultipartJackson2HttpMessageConverter.java
│   │   │                   ├── SecurityUtil.java
│   │   │                   └── StringListConverter.java
│   │   └── resources
│   │       ├── application-local.properties
│   │       ├── application-secret.properties
│   │       └── application.properties
└── submodule-backend
    ├── application-prod.properties
    └── application-secret.properties

👨‍👩‍👧‍👧 Team

사현진 장준상 정연재 권인우 이정향

- Team Leader -
Project Manager,
DevOps Engineer,
BE Developer
Backend Developer Frontend Developer Frontend Developer Designer

About

DevRace-backend / Spring

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages