프로젝트 진행 기간
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5NDcyODMsIm5iZiI6MTczODk0Njk4MywicGF0aCI6Ii84OTI2Nzg2NC8yODc5ODgxMTktNjkyMzUwNGYtYjVkMi00NzA3LWI1Y2ItM2ExMWEyMjNhNWQxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDE2NDk0M1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWMyNWMwMjNhNGIwMGY3OTdiZDNiZDhiYjRjODZhMmQ5MTgzMWIxZjkyNzEzNWI3ZWZlY2YzMjM1ZmFhMTQ2YmEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.gJOfqSwTF8hJXXG2n-aiNlU-B7-B1U_csdMfogTVBO8)
피어 리뷰에 적합한 다양한 질문 형식을 제공합니다.
리뷰 결과에 대한 통계 및 시각적 정보를 제공합니다.
수집된 설문 결과들을 저장해서 모아봅니다.
피어 리뷰 중 주관식 답변의 부정적인 표현을 정제합니다.
피어 리뷰의 결과를 대상자 별로 자동 분류합니다.
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5NDcyODMsIm5iZiI6MTczODk0Njk4MywicGF0aCI6Ii84OTI2Nzg2NC8yODczNDQzMjgtM2QyNjAwZDQtZDdjMy00ZTIxLWJjZDctMzU1YTFiYTVjM2M1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDE2NDk0M1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTcyM2FiOTE5ZTEzYmMyY2E3ZWEwY2YzNDRjZDE3MzMyMzM2ZjE1MmE1NzJjMmI0MjZhZGUyMmZiN2E3MjYyMWMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.FLPTKZM8Z3Pmb9Ly5-ztN6dOJX4jcWXzRDeJdEOqUVY)
![image](https://private-user-images.githubusercontent.com/84673536/306198326-02a16100-eaa8-45ce-b47e-2ef8fa8e7302.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5NDcyODMsIm5iZiI6MTczODk0Njk4MywicGF0aCI6Ii84NDY3MzUzNi8zMDYxOTgzMjYtMDJhMTYxMDAtZWFhOC00NWNlLWI0N2UtMmVmOGZhOGU3MzAyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDE2NDk0M1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWU3MmMyNzE2NzQ5ZDQxMDcwNmEwYWU0Y2E5OWM4NWY2NTY2ZjIxODdlM2RmZTY4ODExZGVhYzhiZDliNzA0NzQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.p77lxyBTm45c_CWm6p9VZr6xOWOX3Kn8Fe8HQdnP54g)
![image](https://private-user-images.githubusercontent.com/84673536/306199045-87858042-830c-4735-b81b-fea7a9392acb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5NDcyODMsIm5iZiI6MTczODk0Njk4MywicGF0aCI6Ii84NDY3MzUzNi8zMDYxOTkwNDUtODc4NTgwNDItODMwYy00NzM1LWI4MWItZmVhN2E5MzkyYWNiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDE2NDk0M1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk4YWI3NTljOTI3ZGQxZmJiMjE3YmVlY2I4NmUzNGQzZmNkMWRhZjgwOGJiOWYxMzAzNDNlN2Q5Y2VjMDNmYzUmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.kwY1kEGqxlwaupM0v7VzYe0NcboI1ij8RFSkXXB3X7U)
![](https://private-user-images.githubusercontent.com/89267864/287338101-7c7b5b8e-8e1c-4fa6-91d3-f07692eaa514.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzg5NDcyODMsIm5iZiI6MTczODk0Njk4MywicGF0aCI6Ii84OTI2Nzg2NC8yODczMzgxMDEtN2M3YjViOGUtOGUxYy00ZmE2LTkxZDMtZjA3NjkyZWFhNTE0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMDclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjA3VDE2NDk0M1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWI0NDBhOWQ4YmJlMDllYWU0YTg3MTM4OGMyYTMzYmRiZjk0MjFhZjY4ZjAwMjNmYWEyODg5N2E1NjE2YTUzZjcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.iiuyfe7LCtkmVkKzsq7JUnBsUvwoipd_PE70dAzOaBg)
펼치기/접기
.
├── 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