'ZIC' 은 음악 연습실을 쉽고 빠르게 예약하고 효율적으로 관리할 수 있게 돕는 서비스입니다.
music의 sic을 어감을 더 찰지게 하기 위해 첫 글자를 Z로 바꾸면서 탄생했습니다.
전체 시스템 구조
패키지 구조
📦
├─ .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
API 문서화 프로세스
API 설계 단계
- Notion을 활용한 초기 API 명세서 작성
- Endpoint 정의
- Request/Response 스키마 작성
배포 및 연동 단계
-
Swagger/OpenAPI를 통한 자동화된 문서 추가
- API 변경사항 실시간 반영
- Request/Response 스키마 자동화/동기화
- Status Code 자동화/동기화
- 필수 파라미터 및 제약조건 자동화
-
API 연동 방식
- AWS 프리티어 계정 활용
- CI/CD를 통해 자동 배포 및 동기화 API 서버 배포
깃 전략 및 PR 규칙
Feature-Branch 전략(GitHub Flow)
- 배포 브랜치, 운영서버
- 직접적인 PUSH 불가
- develop → main 으로만 Pull Request 가능
- 개발 통합 브랜치:
- 다음 배포 버전을 위한 개발 코드 통합
- 기능 개발이 완료된 feature 브랜치들의 병합 지점
- 테스트 진행 시 베이스 브랜치
- 기능 개발을 위한 작업 브랜치
- Issue 생성 및 할당 → develop에서 feature 브랜치 생성 → 개발 작업 수행 → develop으로 PR 요청 → 코드 리뷰 후 Merge
- Merge된 Remote Feature 브랜치는 자동 삭제 설정
- develop 기준으로 분기
- 마지막 approve 사람이 merge 하기
- feature 브랜치
- develop 브랜치 (본인이 스스로 approve 가능)
- main 브랜치 (1명 이상 approve시 가능)
컨벤션
-
커밋 유형은 영어 소문자로 작성하기
-
급한 버그 수정은 대문자로 작성하기
커밋 유형 의미 feature
새로운 기능 추가 fix
버그 수정 docs
문서 수정 style
코드 formatting, 세미콜론 누락, 코드 자체의 변경이 없는 경우 refactor
코드 리팩토링 test
테스트 코드, 리팩토링 테스트 코드 추가 chore
패키지 매니저 수정, 그 외 기타 수정 ex) .gitignore comment
필요한 주석 추가 및 변경 rename
파일 또는 폴더 명을 수정하거나 옮기는 작업만인 경우 remove
파일을 삭제하는 작업만 수행한 경우 merge
병합 과정에서 충돌을 해결한 경우 BREAKING CHANGE
커다란 API 변경의 경우 HOTFIX
급하게 치명적인 버그를 고쳐야 하는 경우
명명 규칙
- 상수는 영문 대문자, 스네이크 표기법을 사용 (예: RESPONSE_TIMEOUT)
- 변수 및 함수는 카멜 케이스를 사용 (예: UserId)
- 폴더 네이밍은 카멜 케이스를 기본 (예: PracticeRoom)
- DB는 스네이크- jpa에서 카멜케이스 사용시 자동 변환 해 줌
- URL, 파일명 등은 kebab-case를 사용 (예: /user-email-page )
- 한 줄짜리 블록일 경우라도 {}를 생략하지 않고, 명확히 줄 바꿈 하여 사용한다
- 명시되지 않은 사항은 Google Java Style Guide와 같은 표준 자바 스타일 가이드를 준수한다.
|
|
|
박재락 | 김현호 | 김동우 |