프로젝트 진행 기간
2023.10.12 ~ 2023.12.04
동료가 생각하는 나의 모습을 알고 싶은 사람들을 위해 피어리뷰
를 효과적으로 관리할 수 있는 서비스입니다!
데브코스내에서 피어리뷰를 진행할 때 구글폼에 의존하면서 생기는 문제점을 해결하고자 했습니다.
개별 응답을 수집하고 종합하는 데 많은 시간이 소요되며 응답 유무를 확인하기 어렵고 또한, 주관식 응답을 정제하는 데 시간이 오래 걸리는 문제가 있습니다.
리뷰 결과를 여러 매체에 의존하지 않고 하나의 플랫폼으로 효과적으로 관리하고자 했습니다.
리뷰 결과를 시각적으로 한눈에 확인할 수 있도록 했으며 PDF 저장 기능을 도입해 결과를 개인적으로 소장할 수 있도록 했습니다.
실제 사용자를 유치하고 서비스를 지속 운영하고자 했습니다.
데브코스 인원들을 타겟으로 실사용자를 유치하고 테스터 경험을 통해 피드백 반영 후 안정적이며 지속적인 운영을 목표로 했습니다.
![스크린샷 2023-12-05 오후 6 21 38](https://private-user-images.githubusercontent.com/89267864/287988119-6923504f-b5d2-4707-b5cb-3a11a223a5d1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk4MDc0NjgsIm5iZiI6MTczOTgwNzE2OCwicGF0aCI6Ii84OTI2Nzg2NC8yODc5ODgxMTktNjkyMzUwNGYtYjVkMi00NzA3LWI1Y2ItM2ExMWEyMjNhNWQxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDE1NDYwOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTRmMDZiMDU5YzVhZTU3OWZiZWQ1MzRiMDVjYzE1M2I1N2NlZjk0OTE0ZTQwZTM4OWQ1YTAyOTQwYWQwZWIxMDYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.OyIL5dMfbOgugr00F2PACBjWDel-4BHOKMwHw5VXsog)
피어 리뷰에 적합한 다양한 질문 형식을 제공합니다.
리뷰 결과에 대한 통계 및 시각적 정보를 제공합니다.
수집된 설문 결과들을 저장해서 모아봅니다.
피어 리뷰 중 주관식 답변의 부정적인 표현을 정제합니다.
피어 리뷰의 결과를 대상자 별로 자동 분류합니다.
Product Owner | Developer | Scrum Master |
---|---|---|
장수연 | 신범철 | 김주웅 |
리뷰 결과 도메인 유저, 인증 도메인 |
리뷰 답변 도메인 Cloud |
리뷰 설문 도메인 |
🦸 FE 히어로들
종류 | 기술 스택 |
---|---|
🚀 Develop Tools | |
🛠️ 클라우드 |
✨ 이벤트 스토밍
Miro를 통한 도메인 분석 및 플로우 차트 작성
![스크린샷 2023-12-02 오전 2 54 44](https://private-user-images.githubusercontent.com/89267864/287344328-3d2600d4-d7c3-4e21-bcd7-355a1ba5c3c5.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk4MDc0NjgsIm5iZiI6MTczOTgwNzE2OCwicGF0aCI6Ii84OTI2Nzg2NC8yODczNDQzMjgtM2QyNjAwZDQtZDdjMy00ZTIxLWJjZDctMzU1YTFiYTVjM2M1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDE1NDYwOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTQzNGYxYjE4NTljZWU0NjBkMDc5NTFiNjMyMGFlM2I1MmJlOGQ0MDI4ZjM5MmJiNDBlYzdhN2U1ZTlkYTdjYjkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.J2_6jN-cwVyuIfKnofqX7211xxoEgT03swtFg-UfZZA)
![image](https://private-user-images.githubusercontent.com/84673536/306198326-02a16100-eaa8-45ce-b47e-2ef8fa8e7302.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk4MDc0NjgsIm5iZiI6MTczOTgwNzE2OCwicGF0aCI6Ii84NDY3MzUzNi8zMDYxOTgzMjYtMDJhMTYxMDAtZWFhOC00NWNlLWI0N2UtMmVmOGZhOGU3MzAyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDE1NDYwOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTU3ZjFkMjY2ZTU2OThlYjU5MzY3ZjI3ZTg4Zjk5Y2ZhODI0ZWU1NWNjOWJmNDViZGM2ZmE0MmZmZjc3NmFhOTAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.k0pbj2EX3WkmedAvu7Hm1yrLk3Ws1BYjP5hvwKLmokU)
![image](https://private-user-images.githubusercontent.com/84673536/306199045-87858042-830c-4735-b81b-fea7a9392acb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk4MDc0NjgsIm5iZiI6MTczOTgwNzE2OCwicGF0aCI6Ii84NDY3MzUzNi8zMDYxOTkwNDUtODc4NTgwNDItODMwYy00NzM1LWI4MWItZmVhN2E5MzkyYWNiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDE1NDYwOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTVjNmU3NTVkZWM3NjdjMmFhYzQ2YTJjMTY2YjFkYTBhZjIzZmYyYTlmMDVmOTQ3MzFmZjg4MDRkMmY4YjhhN2QmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.N4x7LwR3huiESiZuHnEy4bCcA9_J983mldlFQSYL-70)
![](https://private-user-images.githubusercontent.com/89267864/287338101-7c7b5b8e-8e1c-4fa6-91d3-f07692eaa514.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk4MDc0NjgsIm5iZiI6MTczOTgwNzE2OCwicGF0aCI6Ii84OTI2Nzg2NC8yODczMzgxMDEtN2M3YjViOGUtOGUxYy00ZmE2LTkxZDMtZjA3NjkyZWFhNTE0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjE3VDE1NDYwOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTI4Nzc1NGRhN2U2YjBhZmJlMjJjZmEyYjYyMDhhNWQ2ODk3NjRjNmM1ZTBlZWE5Mjg0MmFhZmI3OTkyMWNhMjImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.ktomtyAS0V9Le9OlvWyWcvLsaV3UkJh4qTvnGNyXVNo)
펼치기/접기
.
├── ReplyTarget
│ ├── application
│ │ └── ReplyTargetService.java
│ ├── domain
│ │ └── ReplyTarget.java
│ ├── dto
│ │ ├── request
│ │ │ ├── CreateReplyTargetRequest.java
│ │ │ └── UpdateReplyTargetRequest.java
│ │ └── response
│ │ └── ReplyTargetResponse.java
│ └── repository
│ ├── ReplyTargetCustomRepository.java
│ ├── ReplyTargetCustomRepositoryImpl.java
│ └── ReplyTargetRepository.java
├── ReviewRangerApplication.java
├── auth
│ ├── api
│ │ └── AuthController.java
│ ├── application
│ │ ├── AuthService.java
│ │ └── CustomUserDetailsService.java
│ ├── domain
│ │ ├── RefreshToken.java
│ │ └── UserPrincipal.java
│ ├── dto
│ │ ├── JoinRequest.java
│ │ ├── LoginRequest.java
│ │ ├── LoginResponse.java
│ │ ├── ValidateEmailRequest.java
│ │ └── ValidateNameRequest.java
│ └── repository
│ └── RefreshTokenRepository.java
├── common
│ ├── config
│ │ ├── AsyncConfig.java
│ │ ├── JasyptConfig.java
│ │ ├── OpenAIConfig.java
│ │ ├── QueryDslConfig.java
│ │ ├── RedisConfig.java
│ │ ├── S3Config.java
│ │ ├── SecurityConfig.java
│ │ └── SwaggerConfig.java
│ ├── entity
│ │ └── BaseEntity.java
│ ├── exception
│ │ ├── ErrorCode.java
│ │ ├── GlobalExceptionHandler.java
│ │ └── RangerException.java
│ ├── image
│ │ └── infrastructure
│ │ ├── ImageManager.java
│ │ └── S3manager.java
│ ├── jwt
│ │ ├── ExceptionHandlerFilter.java
│ │ ├── JwtFilter.java
│ │ └── JwtTokenProvider.java
│ ├── openai
│ │ ├── Prompt.java
│ │ ├── api
│ │ │ └── OpenAIController.java
│ │ ├── application
│ │ │ └── OpenAIService.java
│ │ ├── constant
│ │ │ └── Command.java
│ │ └── dto
│ │ └── request
│ │ ├── CleanRepliesRequest.java
│ │ ├── Message.java
│ │ └── OpenAIRequest.java
│ ├── redis
│ │ ├── RedisProperties.java
│ │ └── RedisUtil.java
│ ├── regex
│ │ └── UserRegex.java
│ ├── response
│ │ └── RangerResponse.java
│ └── slack
│ ├── SlackConstant.java
│ ├── SlackController.java
│ └── SlackService.java
├── finalReviewResult
│ ├── api
│ │ └── FinalReviewResultController.java
│ ├── application
│ │ └── FinalReviewResultService.java
│ ├── domain
│ │ ├── AnswerSupplier.java
│ │ ├── FinalQuestion.java
│ │ ├── FinalQuestionType.java
│ │ ├── FinalReviewResult.java
│ │ ├── FinalReviewResultAnswer.java
│ │ ├── FinalReviewResultAnswerDropdown.java
│ │ ├── FinalReviewResultAnswerHexStat.java
│ │ ├── FinalReviewResultAnswerObjects.java
│ │ ├── FinalReviewResultAnswerRating.java
│ │ ├── FinalReviewResultAnswerSubject.java
│ │ └── Hexstat.java
│ ├── dto
│ │ ├── CheckFinalResultStatus.java
│ │ ├── CreateFinalReplyRequest.java
│ │ ├── CreateFinalReviewRequest.java
│ │ ├── CreateFinalReviewResponse.java
│ │ ├── FinalReviewResultListResponse.java
│ │ ├── GetFinalReviewAnswerResponse.java
│ │ ├── GetFinalReviewResultResponse.java
│ │ └── UpdateAnswerOfSubject.java
│ └── repository
│ ├── DropdownTypeRepository.java
│ ├── FinalReviewResultCustomRepository.java
│ ├── FinalReviewResultCustomRepositoryImpl.java
│ ├── FinalReviewResultRepository.java
│ ├── HexstatTypeRepository.java
│ ├── ObjectTypeRepository.java
│ ├── RatingTypeRepository.java
│ └── SubjectTypeRepository.java
├── participation
│ ├── api
│ │ └── ParticipationController.java
│ ├── application
│ │ └── ParticipationService.java
│ ├── domain
│ │ ├── Participation.java
│ │ └── ReviewStatus.java
│ ├── dto
│ │ ├── request
│ │ │ ├── SubmitParticipationRequest.java
│ │ │ └── UpdateParticipationRequest.java
│ │ └── response
│ │ ├── GetParticipationResponse.java
│ │ ├── ParticipationResponse.java
│ │ ├── ReceiverResponse.java
│ │ └── ResponserResponse.java
│ └── repository
│ ├── ParticipationCustomRepository.java
│ ├── ParticipationCustomRepositoryImpl.java
│ └── ParticipationRepository.java
├── question
│ ├── api
│ │ └── QuestionController.java
│ ├── application
│ │ └── QuestionService.java
│ ├── domain
│ │ ├── Question.java
│ │ ├── QuestionOption.java
│ │ └── QuestionType.java
│ ├── dto
│ │ ├── request
│ │ │ ├── CreateQuestionOptionRequest.java
│ │ │ └── CreateQuestionRequest.java
│ │ └── response
│ │ ├── GetQuestionOptionResponse.java
│ │ └── GetQuestionResponse.java
│ └── repository
│ ├── QuestionOptionRepository.java
│ └── QuestionRepository.java
├── reply
│ ├── api
│ │ └── ReplyRestController.java
│ ├── application
│ │ └── ReplyService.java
│ ├── domain
│ │ └── Reply.java
│ ├── dto
│ │ ├── request
│ │ │ ├── CreateReplyRequest.java
│ │ │ └── UpdateReplyRequest.java
│ │ └── response
│ │ └── ReplyResponse.java
│ └── repository
│ └── ReplyRepository.java
├── review
│ ├── api
│ │ └── ReviewController.java
│ ├── application
│ │ └── ReviewService.java
│ ├── domain
│ │ ├── Review.java
│ │ └── ReviewType.java
│ ├── dto
│ │ ├── request
│ │ │ └── CreateReviewRequest.java
│ │ └── response
│ │ ├── GetReviewDetailResponse.java
│ │ ├── GetReviewResponse.java
│ │ └── ReviewResponse.java
│ └── repository
│ ├── ReviewCustomRepository.java
│ ├── ReviewCustomRepositoryImpl.java
│ └── ReviewRepository.java
└── user
├── api
│ └── UserController.java
├── application
│ └── UserService.java
├── domain
│ └── User.java
├── dto
│ ├── GetUserResponse.java
│ ├── UpdateNameRequest.java
│ ├── UpdatePasswordRequest.java
│ ├── UserInfoResponse.java
│ └── UserResponse.java
└── repository
└── UserRepository.java