📖 목차
최근 개발자들 사이에서 알고리즘 스터디 모임이 활발히 이루어지고 있습니다.
이를 위해, 함께 알고리즘 문제를 풀고 토의하며 경쟁할 수 있는 실시간 코딩 플랫폼을 제공합니다.
이 플랫폼으로 스터디원들의 실력을 빠르게 향상시키고, 모임의 운영 효율성을 극대화하고자 합니다.
- 소셜 로그인 : Google, Github을 통한 간편한 로그인 제공
- 알고리즘 문제 풀이 : '백준 온라인 저지' 문제를 바탕으로 다양한 언어 및 에디터 지원
- 입장 대기열 : 초대 링크로 스터디원들을 초대하고 동시에 문제 풀이 시작
- 실시간 랭킹 : 문제 풀이 중 실시간 순위 확인을 통한 경쟁 유도
- 실시간 채팅 : 문제 풀이 중 힌트 주고받기 및 의견 교환 가능
- 코드 보관 : 소스코드 및 채팅 내역 저장을 통한 복습 및 재풀이 지원
📀 Demo Video : Play!
-
기간 : 2024.04.29 ~ 06.16
-
-
CI/CD flow : Open!
- trigger CI/CD
1. PR close & Merge into develop branch
- .github/workflows/deploy.yml + Dockerfile : start CI/CD
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
- .ebextensions : set EB Environment
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)
- Dockerrun.aws.json : deploy Spring Container
9. pull image from Docker Hub
10. docker run Spring image
- .platform/hooks/postdeploy/connect_spring_to_network.sh : connect Spring Container
11. connect Spring to docker network (if not connected)
12. logging Connect results & monitoring on AWS CloudWatch
==> deploy complete.
Notification : Open!
→ Slack Notifications sent by the GitHub Actions :
💡 PR Open
💬 PR Review
❌ CI/CD Fail
✅ CI/CD Success
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
- Github-Flow 전략
- 반드시 "develop"에서 뻗어나와 develop으로 "merge" 되어야한다.
main
: 출시 배포 CI/CD용 branch (미사용)develop
: 개발 개포 CI/CD용 branchfeature
: 기능 구현용 branchIssue_종류/#Issue_번호
: branch 생성
✨ Feat
🐛 Fix
♻️ Refactor
✅ Test
📁 File
📝 Docs
🔧 Chore
⚙️ Setting
종류 | 내용 |
---|---|
✨ Feat | 기능 구현 |
🐛 Fix | 버그 수정 |
♻️ Refactor | 코드 리팩토링 |
✅ Test | 테스트 업무 |
📁 File | 파일 이동 또는 삭제, 파일명 변경 |
📝 Docs | md, yml 등의 문서 작업 |
🔧 Chore | 이외의 애매하거나 자잘한 수정 |
⚙️ Setting | 빌드 및 패키지 등 프로젝트 설정 |
< Issue Title >
[Issue_종류] 구현_주요내용
ex) [Feat] 소셜 로그인 및 회원가입 기능
< Commit Message >
[#Issue_번호] Issue_종류: 구현_내용
ex) [#32] Feat: Security 및 OAuth2 구현
- Pull Request만 날리고, 중요 Approve는 reviewer가 한다.
- PR Open & Review & Close(CI/CD) → Slack 알림
< PR Title >
[#Issue_번호] Issue_종류: 이슈내용
ex) [#32] Feat: 소셜 로그인 및 회원가입 기능
## 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 Leader - |
||||
Project Manager, DevOps Engineer, BE Developer |
Backend Developer | Frontend Developer | Frontend Developer | Designer |