Skip to content

UMC-ZIC/ZIC

Repository files navigation

image

💡 서비스 소개

'ZIC' 은 음악 연습실을 쉽고 빠르게 예약하고 효율적으로 관리할 수 있게 돕는 서비스입니다.

music의 sic을 어감을 더 찰지게 하기 위해 첫 글자를 Z로 바꾸면서 탄생했습니다.

ZIC 기획안

image

기술 스택

Backend

Java 17 Spring Boot Spring Data JPA Spring Security JUnit5 JWT Gradle QueryDSL Thymeleaf

DB / Infra

MySQL Redis AWS

문서/협업툴

Notion IntelliJ IDEA Swagger Discord

구조

전체 시스템 구조

image

패키지 구조
📦 
├─ .gitattributes
├─ .github
│  ├─ ISSUE_TEMPLATE
│  │  └─ 이슈-생성-템플릿.md
│  ├─ PULL_REQUEST_TEMPLATE.md
│  └─ workflows
│     └─ deploy.yml
├─ .gitignore
├─ build.gradle
├─ gradle
│  └─ wrapper
│     ├─ gradle-wrapper.jar
│     └─ gradle-wrapper.properties
├─ gradlew
├─ gradlew.bat
├─ settings.gradle
└─ src
   ├─ main
   │  ├─ java
   │  │  └─ com
   │  │     └─ umc7
   │  │        └─ ZIC
   │  │           ├─ ZicApplication.java
   │  │           ├─ apiPayload
   │  │           │  ├─ code
   │  │           │  │  ├─ BaseCode.java
   │  │           │  │  ├─ BaseErrorCode.java
   │  │           │  │  ├─ ErrorReasonDTO.java
   │  │           │  │  ├─ ReasonDTO.java
   │  │           │  │  └─ status
   │  │           │  │     ├─ ErrorStatus.java
   │  │           │  │     └─ SuccessStatus.java
   │  │           │  └─ exception
   │  │           │     ├─ ApiResponse.java
   │  │           │     └─ handler
   │  │           │        ├─ ExceptionAdvice.java
   │  │           │        ├─ GeneralException.java
   │  │           │        ├─ InstrumentHandler.java
   │  │           │        ├─ PracticeRoomDetailHandler.java
   │  │           │        ├─ PracticeRoomHandler.java
   │  │           │        ├─ RegionHandler.java
   │  │           │        ├─ ReservationHandler.java
   │  │           │        └─ UserHandler.java
   │  │           ├─ common
   │  │           │  ├─ controller
   │  │           │  │  ├─ ReservationPageController.java
   │  │           │  │  └─ TestLoginController.java
   │  │           │  ├─ domain
   │  │           │  │  ├─ BaseEntity.java
   │  │           │  │  ├─ Instrument.java
   │  │           │  │  ├─ Region.java
   │  │           │  │  └─ enums
   │  │           │  │     ├─ InstrumentType.java
   │  │           │  │     └─ RegionType.java
   │  │           │  ├─ repository
   │  │           │  │  ├─ InstrumentRepository.java
   │  │           │  │  └─ RegionRepository.java
   │  │           │  ├─ util
   │  │           │  │  ├─ InstrumentUtil.java
   │  │           │  │  ├─ RedisUtil.java
   │  │           │  │  └─ RegionUtil.java
   │  │           │  └─ validation
   │  │           │     ├─ annotation
   │  │           │     │  └─ CheckPage.java
   │  │           │     └─ validator
   │  │           │        └─ PageCheckValidator.java
   │  │           ├─ config
   │  │           │  ├─ QueryDSLConfig.java
   │  │           │  ├─ RedisConfig.java
   │  │           │  └─ SwaggerConfig.java
   │  │           ├─ practiceRoom
   │  │           │  ├─ controller
   │  │           │  │  ├─ PracticeRoomController.java
   │  │           │  │  ├─ PracticeRoomDetailController.java
   │  │           │  │  └─ PracticeRoomLikeController.java
   │  │           │  ├─ converter
   │  │           │  │  └─ PracticeRoomInstrumentConverter.java
   │  │           │  ├─ domain
   │  │           │  │  ├─ PracticeRoom.java
   │  │           │  │  ├─ PracticeRoomDetail.java
   │  │           │  │  ├─ PracticeRoomInstrument.java
   │  │           │  │  ├─ PracticeRoomLike.java
   │  │           │  │  └─ enums
   │  │           │  │     └─ RoomStatus.java
   │  │           │  ├─ dto
   │  │           │  │  ├─ AvailableTimeSlot.java
   │  │           │  │  ├─ PageRequestDto.java
   │  │           │  │  ├─ PageResponseDto.java
   │  │           │  │  ├─ PracticeRoomDetailRequestDto.java
   │  │           │  │  ├─ PracticeRoomDetailResponseDto.java
   │  │           │  │  ├─ PracticeRoomLikeRequestDto.java
   │  │           │  │  ├─ PracticeRoomLikeResponseDto.java
   │  │           │  │  ├─ PracticeRoomRequestDto.java
   │  │           │  │  └─ PracticeRoomResponseDto.java
   │  │           │  ├─ repository
   │  │           │  │  ├─ PracticeRoomDetailRepository.java
   │  │           │  │  ├─ PracticeRoomInstrumentRepository.java
   │  │           │  │  ├─ PracticeRoomLikeRepository.java
   │  │           │  │  └─ PracticeRoomRepository.java
   │  │           │  ├─ service
   │  │           │  │  ├─ PracticeRoomDetailService.java
   │  │           │  │  ├─ PracticeRoomDetailServiceImpl.java
   │  │           │  │  ├─ PracticeRoomLikeService.java
   │  │           │  │  ├─ PracticeRoomLikeServiceImpl.java
   │  │           │  │  ├─ PracticeRoomService.java
   │  │           │  │  └─ PracticeRoomServiceImpl.java
   │  │           │  └─ validation
   │  │           │     ├─ annotation
   │  │           │     │  ├─ CheckPracticeRoomDetailStatus.java
   │  │           │     │  └─ ExistPracticeRoomDetail.java
   │  │           │     └─ validator
   │  │           │        ├─ PracticeRoomDetailExistValidator.java
   │  │           │        └─ PracticeRoomDetailStatusCheckValidator.java
   │  │           ├─ reservation
   │  │           │  ├─ ReservationScheduler.java
   │  │           │  ├─ controller
   │  │           │  │  └─ ReservationRestController.java
   │  │           │  ├─ converter
   │  │           │  │  ├─ KakaoPayConverter.java
   │  │           │  │  └─ ReservationConverter.java
   │  │           │  ├─ domain
   │  │           │  │  ├─ Reservation.java
   │  │           │  │  ├─ ReservationDetail.java
   │  │           │  │  └─ enums
   │  │           │  │     └─ ReservationStatus.java
   │  │           │  ├─ dto
   │  │           │  │  ├─ PaymentRequestDTO.java
   │  │           │  │  ├─ PaymentResponseDTO.java
   │  │           │  │  ├─ ReservationRequestDTO.java
   │  │           │  │  └─ ReservationResponseDTO.java
   │  │           │  ├─ repository
   │  │           │  │  ├─ ReservationDetailRepository.java
   │  │           │  │  ├─ ReservationRepository.java
   │  │           │  │  ├─ ReservationRepositoryCustom.java
   │  │           │  │  └─ ReservationRepositoryImpl.java
   │  │           │  ├─ service
   │  │           │  │  ├─ KakaoPayService.java
   │  │           │  │  ├─ KakaoPayServiceImpl.java
   │  │           │  │  ├─ ReservationCommandService.java
   │  │           │  │  ├─ ReservationCommandServiceImpl.java
   │  │           │  │  ├─ ReservationQueryService.java
   │  │           │  │  └─ ReservationQueryServiceImpl.java
   │  │           │  └─ validation
   │  │           │     ├─ annotation
   │  │           │     │  ├─ CheckReservationData.java
   │  │           │     │  ├─ CheckReservationStatus.java
   │  │           │     │  ├─ CheckReservationTime.java
   │  │           │     │  ├─ CheckReservationTimeOverlap.java
   │  │           │     │  └─ ExistReservation.java
   │  │           │     ├─ validationSequence
   │  │           │     │  ├─ ValidationOrder.java
   │  │           │     │  └─ ValidationStep.java
   │  │           │     └─ validator
   │  │           │        ├─ ReservationDataCheckValidator.java
   │  │           │        ├─ ReservationExistValidator.java
   │  │           │        ├─ ReservationStatusCheckValidator.java
   │  │           │        ├─ ReservationTimeCheckValidator.java
   │  │           │        └─ ReservationTimeOverlapCheckValidator.java
   │  │           ├─ security
   │  │           │  ├─ CustomUserDetail.java
   │  │           │  ├─ CustomUserDetailsService.java
   │  │           │  ├─ JwtFilter.java
   │  │           │  ├─ JwtTokenProvider.java
   │  │           │  ├─ OAuth
   │  │           │  │  ├─ CustomOAuth2User.java
   │  │           │  │  ├─ CustomOAuth2UserService.java
   │  │           │  │  ├─ OAuith2AuthenticationFailureHandler.java
   │  │           │  │  └─ OAuth2AuthenticationSuccessHandler.java
   │  │           │  ├─ SecurityConfig.java
   │  │           │  └─ handler
   │  │           │     ├─ CustomAccessDeniedHandler.java
   │  │           │     ├─ CustomAuthenticationEntryPoint.java
   │  │           │     └─ ExceptionFilter.java
   │  │           └─ user
   │  │              ├─ controller
   │  │              │  ├─ KakaoLoginPageController.java
   │  │              │  ├─ OwnerController.java
   │  │              │  └─ UserController.java
   │  │              ├─ converter
   │  │              │  ├─ UserConverter.java
   │  │              │  └─ UserInstrumentConverter.java
   │  │              ├─ domain
   │  │              │  ├─ User.java
   │  │              │  ├─ UserInstrument.java
   │  │              │  └─ enums
   │  │              │     └─ RoleType.java
   │  │              ├─ dto
   │  │              │  ├─ KakaoTokenResponseDto.java
   │  │              │  ├─ KakaoUserInfoResponseDto.java
   │  │              │  ├─ UserRequestDto.java
   │  │              │  └─ UserResponseDto.java
   │  │              ├─ repository
   │  │              │  ├─ UserInstrumentRepository.java
   │  │              │  ├─ UserRepository.java
   │  │              │  ├─ UserRepositoryCustom.java
   │  │              │  └─ UserRepositoryImpl.java
   │  │              └─ service
   │  │                 ├─ KakaoService.java
   │  │                 ├─ UserService.java
   │  │                 └─ UserServiceImpl.java
   │  └─ resources
   │     ├─ application.yml
   │     └─ templates
   │        ├─ KakaoReady.html
   │        ├─ home.html
   │        ├─ login.html
   │        ├─ static
   │        │  └─ kakao_login_medium_narrow.png
   │        └─ success.html
   └─ test
      └─ java
         └─ com
            └─ umc7
               └─ ZIC
                  ├─ ZicApplicationTests.java
                  └─ practiceRoom
                     └─ repository
                        ├─ PracticeRoomDetailRepositoryTest.java
                        ├─ PracticeRoomLikeRepositoryTest.java
                        └─ PracticeRoomRepositoryTest.java

설계

아키텍쳐

백엔드 아키텍쳐

image


프론트 아키텍쳐

image

ERD

image

프로젝트 협업 규칙

API 문서화 프로세스

API 설계 단계

  • Notion을 활용한 초기 API 명세서 작성
  • Endpoint 정의
  • Request/Response 스키마 작성

배포 및 연동 단계

  • Swagger/OpenAPI를 통한 자동화된 문서 추가

    • API 변경사항 실시간 반영
    • Request/Response 스키마 자동화/동기화
    • Status Code 자동화/동기화
    • 필수 파라미터 및 제약조건 자동화
  • API 연동 방식

    • AWS 프리티어 계정 활용
    • CI/CD를 통해 자동 배포 및 동기화 API 서버 배포
깃 전략 및 PR 규칙

Feature-Branch 전략(GitHub Flow)

image

Main Branch

- 배포 브랜치, 운영서버 
- 직접적인 PUSH 불가 
- develop → main 으로만 Pull Request 가능 

Develop Branch

- 개발 통합 브랜치: 
    - 다음 배포 버전을 위한 개발 코드 통합 
    - 기능 개발이 완료된 feature 브랜치들의 병합 지점 
    - 테스트 진행 시 베이스 브랜치 

Feature Branch (branch명 : ex - feature#2-security)

- 기능 개발을 위한 작업 브랜치 
- Issue 생성 및 할당 → develop에서 feature 브랜치 생성 → 개발 작업 수행 → develop으로 PR 요청 → 코드 리뷰 후 Merge 
- Merge된 Remote Feature 브랜치는 자동 삭제 설정 
- develop 기준으로 분기 

Merge 방식

- 마지막 approve 사람이 merge 하기 
- feature 브랜치 
- develop 브랜치 (본인이 스스로 approve 가능) 
- main  브랜치 (1명 이상 approve시 가능) 
컨벤션

1. 커밋 유형

  • 커밋 유형은 영어 소문자로 작성하기

  • 급한 버그 수정은 대문자로 작성하기

    커밋 유형 의미
    feature 새로운 기능 추가
    fix 버그 수정
    docs 문서 수정
    style 코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우
    refactor 코드 리팩토링
    test 테스트 코드, 리팩토링 테스트 코드 추가
    chore 패키지 매니저 수정, 그 외 기타 수정 ex) .gitignore
    comment 필요한 주석 추가 및 변경
    rename 파일 또는 폴더 명을 수정하거나 옮기는 작업만인 경우
    remove 파일을 삭제하는 작업만 수행한 경우
    merge 병합 과정에서 충돌을 해결한 경우
    BREAKING CHANGE 커다란 API 변경의 경우
    HOTFIX 급하게 치명적인 버그를 고쳐야 하는 경우

2. 코드 유형

명명 규칙

  • 상수는 영문 대문자, 스네이크 표기법을 사용 (예: RESPONSE_TIMEOUT)
  • 변수 및 함수는 카멜 케이스를 사용 (예: UserId)
  • 폴더 네이밍은 카멜 케이스를 기본 (예: PracticeRoom)
  • DB는 스네이크- jpa에서 카멜케이스 사용시 자동 변환 해 줌
  • URL, 파일명 등은 kebab-case를 사용 (예: /user-email-page )

블록 구문

  • 한 줄짜리 블록일 경우라도 {}를 생략하지 않고, 명확히 줄 바꿈 하여 사용한다

기타

  • 명시되지 않은 사항은 Google Java Style Guide와 같은 표준 자바 스타일 가이드를 준수한다.

팀원 소개

박재락 김현호 김동우

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •