- 배포 URL : https://K-L1VERSE.site
- Test ID & PW : 소셜로그인 시스템으로 테스트 계정 X
- 서비스 UCC : https://www.youtube.com/watch?v=4-70ExQCwGQ
- 유저끼리 직관 후기, 직관 메이트, 중고 거래 등 간단한 피드 공유
- 성향검사로 응원할 팀 추천하고 이를 sns에 공유
- 팀 정보(응원가, 엠블럼, 선수단 등) 소개
- 경기 일정 정보 제공
- 서비스 내 포인트 배팅
- 실시간 경기 상황 타임라인
- 실시간 채팅 - 클린봇에 의한 욕설 및 혐오발언 필터링
- 실시간 경기 채팅방, 실시간 경기 정보 제공
- 포인트 시스템(출석, 게시글 작성, 댓글 작성 / 배팅, 호감팀 뱃지 구매)으로 유저에게 직접적인 참여 독려
- 성향 test의 결과를 SNS를 통해 공유 (유저 유입)
- 케이리그 관련 피드 게시판/ 직관 메이트 구인 게시판/ 중고거래 게시판 + 비밀댓글
- 해시태그를 통한 게시글 추천
- 기존의 공격적인 워딩의 축구 커뮤니티에서 벗어나 클린 게시판, 클린 채팅방 지향
- 뱃지 아이템 구매 및 착용
- 알림을 통한 관심 구단의 뉴스, 포인트, 댓글 확인 기능
- Jenkins 파이프라인을 통한 CI/CD 자동화
- 도메인 주도 설계 MSA
- API Gateway pattern을 이용한 검증 및 라우팅
- Kafka를 이용한 SAGA 분산 트랜잭션 패턴 적용
- web socket을 이용한 실시간 채팅, 알림 서비스
- 오픈소스 NLP를 이용한 혐오표현 자동 필터링
- 실시간 크롤링
- Redis를 이용한 인증/인가, 출석체크
- Redis를 이용한 채팅방 백업 구축
- 실시간성을 최대한 보장하기 위해 Kafka를 이용한 비동기식 클린봇 기능
"프론트엔드 : React 18.2.0, Node.js 20.10.0, Nginx 1.18.0 (Ubuntu)
백엔드 : SpringBoot 3.2.1(Gradle, Java 17), Spring Cloud Gateway, Spring Data JPA, Spring Security, Django(DRF), Kafka
DB : MariaDB redis
CI/CD : Jenkins
Infra : Docker"
- Front : React 18.2.0(styled-components, Recoil, ESLint, Prettier), Node.js 20.10.0, Nginx 1.18.0 (Ubuntu)
- Back-end : SpringBoot 3.2.1(Gradle, Java 17), Spring Cloud Gateway, Spring Data JPA, Spring Security, Django(DRF), Kafka
- CI/CD : Jenkins, Docker
- 버전 및 이슈관리 : Gitlab, Jira
- 협업 툴 : Discord, MatterMost, Notion
- 서비스 배포 환경 : AWS
Board Project
│ .gitignore
│ build.gradle
│ Dockerfile
│ gradlew
│ gradlew.bat
│ settings.gradle
│
├─gradle
│ └─wrapper
│ gradle-wrapper.jar
│ gradle-wrapper.properties
│
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─KL1verse
│ │ │ BoardApplication.java
│ │ │
│ │ ├─Board
│ │ │ ├─controller
│ │ │ │ BoardController.java
│ │ │ │
│ │ │ ├─dto
│ │ │ │ └─req
│ │ │ │ BoardDTO.java
│ │ │ │ SearchBoardConditionDto.java
│ │ │ │
│ │ │ ├─exception
│ │ │ │ BoardException.java
│ │ │ │ UnauthorizedException.java
│ │ │ │
│ │ │ ├─repository
│ │ │ │ │ BoardRepository.java
│ │ │ │ │
│ │ │ │ └─entity
│ │ │ │ Board.java
│ │ │ │
│ │ │ └─service
│ │ │ BoardService.java
│ │ │ BoardServiceImpl.java
│ │ │
│ │ ├─Comment
│ │ │ ├─controller
│ │ │ │ CommentController.java
│ │ │ │
│ │ │ ├─dto
│ │ │ │ └─req
│ │ │ │ CommentDTO.java
│ │ │ │ CommentLikeDTO.java
│ │ │ │
│ │ │ ├─repository
│ │ │ │ │ CommentLikeRepository.java
│ │ │ │ │ CommentRepository.java
│ │ │ │ │
│ │ │ │ └─entity
│ │ │ │ Comment.java
│ │ │ │ CommentLike.java
│ │ │ │
│ │ │ └─service
│ │ │ CommentLikeService.java
│ │ │ CommentLikeServiceImpl.java
│ │ │ CommentService.java
│ │ │ CommentServiceImpl.java
│ │ │
│ │ ├─kafka
│ │ │ │ KafkaConfig.java
│ │ │ │ KafkaProducer.java
│ │ │ │
│ │ │ ├─consumer
│ │ │ │ CleanbotBoardOutputConsumer.java
│ │ │ │
│ │ │ ├─dto
│ │ │ │ ├─req
│ │ │ │ │ BoardCleanbotCheckReqDto.java
│ │ │ │ │
│ │ │ │ └─res
│ │ │ │ BoardNotificationResDto.java
│ │ │ │ CleanbotCheckResDto.java
│ │ │ │
│ │ │ └─producer
│ │ │ KafkaBoardCleanbotProducer.java
│ │ │ KafkaBoardNotificationProducer.java
│ │ │
│ │ ├─Mate
│ │ │ ├─controller
│ │ │ │ MateController.java
│ │ │ │
│ │ │ ├─dto
│ │ │ │ └─req
│ │ │ │ MateDTO.java
│ │ │ │
│ │ │ ├─exception
│ │ │ │ BoardException.java
│ │ │ │
│ │ │ ├─repository
│ │ │ │ │ MateRepository.java
│ │ │ │ │
│ │ │ │ └─entity
│ │ │ │ Mate.java
│ │ │ │
│ │ │ └─service
│ │ │ MateService.java
│ │ │ MateServiceImpl.java
│ │ │
│ │ ├─Product
│ │ │ ├─controller
│ │ │ │ ProductController.java
│ │ │ │
│ │ │ ├─dto
│ │ │ │ └─req
│ │ │ │ ProductDTO.java
│ │ │ │
│ │ │ ├─exception
│ │ │ │ BoardException.java
│ │ │ │
│ │ │ ├─repository
│ │ │ │ │ ProductRepository.java
│ │ │ │ │
│ │ │ │ └─entity
│ │ │ │ Product.java
│ │ │ │
│ │ │ └─service
│ │ │ ProductService.java
│ │ │ ProductServiceImpl.java
│ │ │
│ │ ├─s3
│ │ │ ├─config
│ │ │ │ S3Config.java
│ │ │ │
│ │ │ ├─controller
│ │ │ │ S3Controller.java
│ │ │ │
│ │ │ ├─dto
│ │ │ │ └─res
│ │ │ │ S3ResDto.java
│ │ │ │
│ │ │ ├─repository
│ │ │ │ │ BoardImageRepository.java
│ │ │ │ │ FileRepository.java
│ │ │ │ │
│ │ │ │ └─entity
│ │ │ │ BoardImage.java
│ │ │ │ File.java
│ │ │ │
│ │ │ └─service
│ │ │ BoardImageService.java
│ │ │ FileService.java
│ │ │ S3Service.java
│ │ │ S3ServiceImpl.java
│ │ │
│ │ └─Waggle
│ │ ├─controller
│ │ │ WaggleController.java
│ │ │ WaggleLikeController.java
│ │ │
│ │ ├─dto
│ │ │ └─req
│ │ │ WaggleDTO.java
│ │ │ WaggleLikeDTO.java
│ │ │
│ │ ├─exception
│ │ │ BoardException.java
│ │ │
│ │ ├─repository
│ │ │ │ WaggleLikeRepository.java
│ │ │ │ WaggleRepository.java
│ │ │ │ WaggleUserHashTagRepository.java
│ │ │ │
│ │ │ └─entity
│ │ │ Waggle.java
│ │ │ WaggleLike.java
│ │ │ WaggleUserHashTag.java
│ │ │
│ │ └─service
│ │ WaggleLikeService.java
│ │ WaggleLikeServiceImpl.java
│ │ WaggleService.java
│ │ WaggleServiceImpl.java
│ │
│ └─resources
│ application-deploy.yml
│ application-dev.yml
│ application.yml
│
└─test
└─java
└─com
└─KL1verse
└─Board
BoardApplicationTests.java
Cleanbot Project
│ .gitignore
│ db.sqlite3
│ Dockerfile
│ manage.py
│ requirements.txt
│
├─.idea
│ │ .gitignore
│ │ Cleanbot.iml
│ │ misc.xml
│ │ modules.xml
│ │ vcs.xml
│ │
│ └─inspectionProfiles
│ profiles_settings.xml
│
├─bot
│ │ admin.py
│ │ apps.py
│ │ models.py
│ │ serializers.py
│ │ tests.py
│ │ urls.py
│ │ views.py
│ │ __init__.py
│ │
│ └─migrations
│ __init__.py
│
└─Cleanbot
asgi.py
settings.py
urls.py
wsgi.py
__init__.py
Crawl Project
│ .gitignore
│ build.gradle
│ Dockerfile
│ gradlew
│ gradlew.bat
│ settings.gradle
│
├─gradle
│ └─wrapper
│ gradle-wrapper.jar
│ gradle-wrapper.properties
│
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─KL1verse
│ │ └─Crawl
│ │ │ CrawlApplication.java
│ │ │
│ │ ├─domain
│ │ │ ├─kafka
│ │ │ │ │ KafkaConfig.java
│ │ │ │ │
│ │ │ │ └─producer
│ │ │ │ KafkaNewsNotificationProducer.java
│ │ │ │ KafkaProducer.java
│ │ │ │
│ │ │ ├─news
│ │ │ │ ├─dto
│ │ │ │ │ └─res
│ │ │ │ │ NewsResDto.java
│ │ │ │ │
│ │ │ │ └─service
│ │ │ │ NewsCrawl.java
│ │ │ │
│ │ │ └─openai
│ │ │ └─service
│ │ │ OpenAiService.java
│ │ │
│ │ └─global
│ │ RandomUserAgent.java
│ │
│ └─resources
│ application-deploy.yml
│ application-dev.yml
│ application.yml
│
└─test
└─java
└─com
└─KL1verse
└─Crawl
CrawlApplicationTests.java
Gateway Project
│ .gitignore
│ build.gradle
│ Dockerfile
│ gradlew
│ gradlew.bat
│ settings.gradle
│
├─gradle
│ └─wrapper
│ gradle-wrapper.jar
│ gradle-wrapper.properties
│
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─KL1verse
│ │ └─Gateway
│ │ │ GatewayApplication.java
│ │ │
│ │ └─auth
│ │ │ JWTFilter.java
│ │ │ JwtUtil.java
│ │ │
│ │ ├─config
│ │ │ CorsConfig.java
│ │ │ SecurityConfig.java
│ │ │
│ │ └─dto
│ │ └─res
│ │ AccessTokenResDto.java
│ │
│ └─resources
│ application-deploy.yml
│ application-dev.yml
│ application.yml
│
└─test
└─java
└─com
└─KL1verse
└─Gateway
GatewayApplicationTests.java
Match Project
│ .gitignore
│ build.gradle
│ Dockerfile
│ gradlew
│ gradlew.bat
│
├─gradle
│ └─wrapper
│ gradle-wrapper.jar
│ gradle-wrapper.properties
│
└─src
└─main
├─java
│ └─com
│ └─KL1verse
│ └─match
│ │ MatchApplication.java
│ │
│ ├─betting
│ │ ├─controller
│ │ │ BettingController.java
│ │ │
│ │ ├─dto
│ │ │ │ Winner.java
│ │ │ │
│ │ │ └─req
│ │ │ BettingRequest.java
│ │ │
│ │ ├─repository
│ │ │ │ BettingRepository.java
│ │ │ │
│ │ │ └─entity
│ │ │ Betting.java
│ │ │
│ │ └─service
│ │ BettingService.java
│ │ BettingServiceImpl.java
│ │
│ ├─chat
│ │ ├─config
│ │ │ ChatConfig.java
│ │ │
│ │ ├─controller
│ │ │ MessageController.java
│ │ │
│ │ └─dto
│ │ ├─req
│ │ │ MessageReqDto.java
│ │ │
│ │ └─res
│ │ MessageResDto.java
│ │
│ ├─domain
│ │ └─sample
│ │ ├─controller
│ │ │ SampleController.java
│ │ │
│ │ └─exception
│ │ SampleException.java
│ │
│ ├─global
│ │ │ ResponseCode.java
│ │ │
│ │ ├─config
│ │ │ CorsConfig.java
│ │ │
│ │ ├─dto
│ │ │ BaseResponse.java
│ │ │
│ │ └─exception
│ │ BaseException.java
│ │ GlobalExceptionHandler.java
│ │
│ ├─kafka
│ │ │ KafkaConfig.java
│ │ │ KafkaProducer.java
│ │ │
│ │ ├─consumer
│ │ │ KafkaBettingRollbackConsumer.java
│ │ │ KafkaCleanbotResultConsumer.java
│ │ │
│ │ ├─dto
│ │ │ ├─req
│ │ │ │ CleanbotCheckReqDto.java
│ │ │ │
│ │ │ └─res
│ │ │ CleanbotCheckResDto.java
│ │ │ MatchNotificationResDto.java
│ │ │
│ │ └─producer
│ │ KafkaBettingProducer.java
│ │ KafkaBettingWinProducer.java
│ │ KafkaCleanbotCheckProducer.java
│ │ KafkaMatchNotificationProducer.java
│ │
│ ├─match
│ │ ├─controller
│ │ │ MatchController.java
│ │ │
│ │ ├─dto
│ │ │ ├─req
│ │ │ │ MatchBettingRequest.java
│ │ │ │ MatchDetailRequest.java
│ │ │ │ MatchListRequest.java
│ │ │ │ ScoreRequest.java
│ │ │ │
│ │ │ └─res
│ │ │ MatchDetailResponse.java
│ │ │ MatchListResponse.java
│ │ │ TicketResponse.java
│ │ │ TimelineResponse.java
│ │ │
│ │ ├─exception
│ │ │ MatchException.java
│ │ │
│ │ ├─repository
│ │ │ │ MatchRepository.java
│ │ │ │ TimelineRepository.java
│ │ │ │
│ │ │ └─entity
│ │ │ Match.java
│ │ │ Timeline.java
│ │ │
│ │ └─service
│ │ MatchService.java
│ │ MatchServiceImpl.java
│ │
│ ├─scheduler
│ │ ├─config
│ │ │ SchedulingConfig.java
│ │ │
│ │ ├─controller
│ │ │ SchedulerController.java
│ │ │
│ │ └─service
│ │ SchedulerService.java
│ │
│ ├─team
│ │ ├─controller
│ │ │ TeamController.java
│ │ │
│ │ ├─dto
│ │ │ ├─req
│ │ │ │ TeamInfoRequest.java
│ │ │ │
│ │ │ └─res
│ │ │ TeamInfoResponse.java
│ │ │
│ │ ├─exception
│ │ │ TeamException.java
│ │ │
│ │ ├─repository
│ │ │ │ MemberRepository.java
│ │ │ │ TeamRepository.java
│ │ │ │
│ │ │ └─entity
│ │ │ Member.java
│ │ │ Song.java
│ │ │ Team.java
│ │ │
│ │ └─service
│ │ TeamService.java
│ │ TeamServiceImpl.java
│ │
│ └─youtube
│ ├─controller
│ │ YoutubeController.java
│ │
│ ├─dto
│ │ ├─req
│ │ │ YoutubeRankRequest.java
│ │ │
│ │ └─res
│ │ YoutubeTimeResponse.java
│ │
│ ├─repository
│ │ │ YoutubeRepository.java
│ │ │
│ │ └─entity
│ │ Youtube.java
│ │
│ └─service
│ YoutubeService.java
│ YoutubeServiceImpl.java
│
└─resources
application-deploy.yml
application-dev.yml
application.yml
Survey Project
│ .gitignore
│ build.gradle
│ Dockerfile
│ gradlew
│ gradlew.bat
│ settings.gradle
│
├─gradle
│ └─wrapper
│ gradle-wrapper.jar
│ gradle-wrapper.properties
│
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─KL1verse
│ │ └─Survey
│ │ │ SurveyApplication.java
│ │ │
│ │ ├─domain
│ │ │ └─sample
│ │ │ ├─controller
│ │ │ │ SampleController.java
│ │ │ │
│ │ │ └─exception
│ │ │ SampleException.java
│ │ │
│ │ ├─global
│ │ │ │ ResponseCode.java
│ │ │ │
│ │ │ ├─dto
│ │ │ │ BaseResponse.java
│ │ │ │
│ │ │ └─exception
│ │ │ BaseException.java
│ │ │ GlobalExceptionHandler.java
│ │ │
│ │ └─survey
│ │ ├─controller
│ │ │ SurveyController.java
│ │ │
│ │ ├─dto
│ │ │ ├─req
│ │ │ │ AnswerDTO.java
│ │ │ │ QuestionDTO.java
│ │ │ │ SurveyDTO.java
│ │ │ │ UserSelectionDTO.java
│ │ │ │
│ │ │ └─res
│ │ │ SurveyResponse.java
│ │ │
│ │ ├─exception
│ │ │ SurveyException.java
│ │ │
│ │ ├─repository
│ │ │ │ AnswerRepository.java
│ │ │ │ QuestionRepository.java
│ │ │ │ SurveyRepository.java
│ │ │ │ WeightRepository.java
│ │ │ │
│ │ │ └─entity
│ │ │ Answer.java
│ │ │ Question.java
│ │ │ Survey.java
│ │ │ Team.java
│ │ │ Weight.java
│ │ │
│ │ └─service
│ │ AnswerService.java
│ │ AnswerServiceImpl.java
│ │ QuestionService.java
│ │ QuestionServiceImpl.java
│ │ SurveyService.java
│ │ SurveyServiceImpl.java
│ │
│ └─resources
│ application-deploy.yml
│ application-dev.yml
│ application.yml
│
└─test
└─java
└─com
└─KL1verse
└─Survey
SurveyApplicationTests.java
UserServer Project
│ .gitignore
│ build.gradle
│ Dockerfile
│ gradlew
│ gradlew.bat
│ settings.gradle
│
├─gradle
│ └─wrapper
│ gradle-wrapper.jar
│ gradle-wrapper.properties
│
└─src
├─main
│ ├─java
│ │ └─com
│ │ └─kl1verse
│ │ └─UserServer
│ │ │ UserServerApplication.java
│ │ │
│ │ ├─domain
│ │ │ ├─auth
│ │ │ │ │ JwtFilter.java
│ │ │ │ │ JwtProperty.java
│ │ │ │ │ JwtSecurityConfig.java
│ │ │ │ │ JwtUtil.java
│ │ │ │ │
│ │ │ │ ├─controller
│ │ │ │ │ AuthController.java
│ │ │ │ │
│ │ │ │ ├─dto
│ │ │ │ │ ├─req
│ │ │ │ │ │ SignInReqDto.java
│ │ │ │ │ │ SignUpReqDto.java
│ │ │ │ │ │
│ │ │ │ │ └─res
│ │ │ │ │ ReIssueResDto.java
│ │ │ │ │ SignInResDto.java
│ │ │ │ │
│ │ │ │ ├─exception
│ │ │ │ │ TokenException.java
│ │ │ │ │
│ │ │ │ ├─repository
│ │ │ │ │ │ TokenRepository.java
│ │ │ │ │ │
│ │ │ │ │ └─entity
│ │ │ │ │ Token.java
│ │ │ │ │
│ │ │ │ └─service
│ │ │ │ AuthService.java
│ │ │ │
│ │ │ ├─badge
│ │ │ │ ├─controller
│ │ │ │ │ BadgeController.java
│ │ │ │ │
│ │ │ │ ├─dto
│ │ │ │ │ └─req
│ │ │ │ │ BadgeBuyReqDto.java
│ │ │ │ │ BadgeDetailReqDto.java
│ │ │ │ │
│ │ │ │ ├─exception
│ │ │ │ │ BadgeException.java
│ │ │ │ │
│ │ │ │ ├─repository
│ │ │ │ │ │ BadgeDetailRepository.java
│ │ │ │ │ │ BadgeRepository.java
│ │ │ │ │ │
│ │ │ │ │ └─entity
│ │ │ │ │ Badge.java
│ │ │ │ │ BadgeDetail.java
│ │ │ │ │
│ │ │ │ └─service
│ │ │ │ BadgeService.java
│ │ │ │
│ │ │ ├─betting
│ │ │ │ BettingEntity.java
│ │ │ │ Winner.java
│ │ │ │
│ │ │ ├─chat
│ │ │ │ ├─config
│ │ │ │ │ ChatConfig.java
│ │ │ │ │
│ │ │ │ ├─controller
│ │ │ │ │ ChatMessageController.java
│ │ │ │ │
│ │ │ │ └─dto
│ │ │ │ └─req
│ │ │ │ MessageReqDto.java
│ │ │ │
│ │ │ ├─kafka
│ │ │ │ │ KafkaConfig.java
│ │ │ │ │ KafkaUserRepository.java
│ │ │ │ │
│ │ │ │ ├─consumer
│ │ │ │ │ KafkaBettingWinConsumer.java
│ │ │ │ │ KafkaBoardNotificationConsumer.java
│ │ │ │ │ KafkaMatchNotificationConsumer.java
│ │ │ │ │ KafkaNewsNotificationConsumer.java
│ │ │ │ │ KafkaUserConsumer.java
│ │ │ │ │
│ │ │ │ ├─dto
│ │ │ │ │ └─req
│ │ │ │ │ BoardNotificationReqDto.java
│ │ │ │ │ NewsNotificationListReqDto.java
│ │ │ │ │ NotificationListReqDto.java
│ │ │ │ │
│ │ │ │ └─producer
│ │ │ │ KafkaBettingRollbackProducer.java
│ │ │ │ KafkaProducer.java
│ │ │ │
│ │ │ ├─notification
│ │ │ │ ├─config
│ │ │ │ │ NotificationConfig.java
│ │ │ │ │
│ │ │ │ ├─controller
│ │ │ │ │ MessageController.java
│ │ │ │ │
│ │ │ │ ├─dto
│ │ │ │ │ ├─req
│ │ │ │ │ │ MessageReqDto.java
│ │ │ │ │ │
│ │ │ │ │ └─res
│ │ │ │ │ NotificationResDto.java
│ │ │ │ │
│ │ │ │ ├─repository
│ │ │ │ │ │ NotificationRepository.java
│ │ │ │ │ │
│ │ │ │ │ └─entity
│ │ │ │ │ Notification.java
│ │ │ │ │ NotificationTypeConverter.java
│ │ │ │ │
│ │ │ │ └─service
│ │ │ │ NotificationService.java
│ │ │ │
│ │ │ ├─oauth
│ │ │ │ ├─controller
│ │ │ │ │ OAuthController.java
│ │ │ │ │
│ │ │ │ └─service
│ │ │ │ OAuthService.java
│ │ │ │ OAuthServiceImpl.java
│ │ │ │
│ │ │ ├─s3
│ │ │ │ ├─config
│ │ │ │ │ S3Config.java
│ │ │ │ │
│ │ │ │ ├─controller
│ │ │ │ │ S3Controller.java
│ │ │ │ │
│ │ │ │ ├─dto
│ │ │ │ │ └─res
│ │ │ │ │ S3ResDto.java
│ │ │ │ │
│ │ │ │ ├─repository
│ │ │ │ │ │ FileRepository.java
│ │ │ │ │ │ UserImageRepository.java
│ │ │ │ │ │
│ │ │ │ │ └─entity
│ │ │ │ │ File.java
│ │ │ │ │ UserImage.java
│ │ │ │ │
│ │ │ │ └─service
│ │ │ │ FileService.java
│ │ │ │ S3Service.java
│ │ │ │ S3ServiceImpl.java
│ │ │ │ UserImageService.java
│ │ │ │
│ │ │ ├─sample
│ │ │ │ ├─controller
│ │ │ │ │ SampleController.java
│ │ │ │ │
│ │ │ │ └─exception
│ │ │ │ SampleException.java
│ │ │ │
│ │ │ └─user
│ │ │ ├─controller
│ │ │ │ NostradamusController.java
│ │ │ │ UserController.java
│ │ │ │
│ │ │ ├─dto
│ │ │ │ └─res
│ │ │ │ MypageResponseDto.java
│ │ │ │ NicknameUpdateReqDto.java
│ │ │ │ NostradamusResponse.java
│ │ │ │
│ │ │ ├─exception
│ │ │ │ UserException.java
│ │ │ │
│ │ │ ├─repository
│ │ │ │ │ NostradamusRepository.java
│ │ │ │ │ UserRepository.java
│ │ │ │ │
│ │ │ │ └─entity
│ │ │ │ User.java
│ │ │ │
│ │ │ └─service
│ │ │ MypageServiceImpl.java
│ │ │ NostradamusServiceImpl.java
│ │ │ UserDetailServiceImpl.java
│ │ │ UserService.java
│ │ │
│ │ └─global
│ │ │ ResponseCode.java
│ │ │
│ │ ├─config
│ │ │ CorsConfig.java
│ │ │ SecurityConfig.java
│ │ │ WebConfig.java
│ │ │
│ │ ├─dto
│ │ │ BaseResponse.java
│ │ │
│ │ └─exception
│ │ BaseException.java
│ │ GlobalExceptionHandler.java
│ │
│ └─resources
│ application-deploy.yml
│ application-dev.yml
│ application.yml
│
└─test
└─java
└─com
└─kl1verse
└─UserServer
UserServerApplicationTests.java
Frontend Project
│ .eslintrc.js
│ .gitignore
│ .prettierrc.js
│ Dockerfile
│ package-lock.json
│ package.json
│ README.md
│
├─.idea
│ │ .gitignore
│ │ frontend.iml
│ │ misc.xml
│ │ modules.xml
│ │ vcs.xml
│ │
│ └─inspectionProfiles
│ Project_Default.xml
│
├─conf
│ nginx.conf
│
├─public
│ │ favicon.ico
│ │ index.html
│ │ manifest.json
│ │ robots.txt
│ │
│ ├─badge
│ │ badge0.png
│ │ badge0back.png
│ │ badge1.png
│ │ .
│ │ .
│ │ .
│ │
│ └─images
│ └─surveyResult
│ background1.png
│ background2.png
│ background3.png
│ .
│ .
│ .
│
└─src
│ App.js
│ App.test.js
│ comment.svg
│ index.js
│ reportWebVitals.js
│ setupTests.js
│
├─api
│ authAxios.js
│ axios.js
│ betting.js
│ comment.js
│ match.js
│ mate.js
│ mockAxios.js
│ nostradamus.js
│ product.js
│ request.js
│ survey.js
│ team.js
│ waggle.js
│ youtube.js
│
├─assets
│ │ BadgeBackground.svg
│ │ BadgeBackground2.svg
│ │ badges.png
│ │ .
│ │ .
│ │ .
│ │
│ ├─banners
│ │ banner1.png
│ │ banner2.png
│ │
│ ├─fonts
│ │ font.css
│ │
│ ├─icon
│ │ back-icon.png
│ │ bell-icon.png
│ │ calendar-icon.svg
│ │ .
│ │ .
│ │ .
│ │
│ └─login_button
│ betting.png
│ community.png
│ google-icon.png
│ kakao.png
│ naver-icon.png
│
├─components
│ │ Nav.js
│ │
│ ├─board
│ │ │ BoardFile.jsx
│ │ │ BoardTopNavBar.jsx
│ │ │ CommentContainer.jsx
│ │ │ CommentForm.jsx
│ │ │ CommentItemCard.jsx
│ │ │ CommentList.jsx
│ │ │ CommentReplyCard.jsx
│ │ │ dateFormat.jsx
│ │ │ ImageBox.jsx
│ │ │ Like.jsx
│ │ │ MateContainer.jsx
│ │ │ MateItemCard.jsx
│ │ │ MateRegistCard.jsx
│ │ │ ProductContainer.jsx
│ │ │ ProductItemCard.jsx
│ │ │ ProductRegistCard.jsx
│ │ │ SearchComponent.jsx
│ │ │ TimeForBoard.jsx
│ │ │ WaggleContainer.jsx
│ │ │ WaggleItemCard.jsx
│ │ │ WaggleRegistCard.jsx
│ │ │
│ │ └─toggle
│ │ ScheduleModal.jsx
│ │ ScheduleSelect2.jsx
│ │ ScheduleTable2.jsx
│ │
│ ├─common
│ │ Modal.jsx
│ │ Radio.jsx
│ │ RadioGroup.jsx
│ │
│ ├─login
│ │ GoogleLoginButton.jsx
│ │ KakaoLoginButton.jsx
│ │ LoginLogo.jsx
│ │ NaverLoginButton.jsx
│ │
│ ├─logout
│ │ LogoutButton.jsx
│ │
│ ├─main
│ │ Banner.jsx
│ │ Board.jsx
│ │ BoardItem.jsx
│ │ Footer.jsx
│ │ Hotclip.jsx
│ │ Nostradamus.jsx
│ │ Notice.jsx
│ │ Survey.jsx
│ │ TodayMatch.jsx
│ │ TodayMatchItem.jsx
│ │
│ ├─match
│ │ │ BettingContainer.jsx
│ │ │ BettingPercentItem.jsx
│ │ │ Chat.jsx
│ │ │ Chat_origin.jsx
│ │ │ EventItem.jsx
│ │ │ MatchScheduleTop.jsx
│ │ │ ScheduleList.jsx
│ │ │ ScheduleSelect.jsx
│ │ │ ScheduleTable.jsx
│ │ │ ScoreItem.jsx
│ │ │ Time.jsx
│ │ │ TimelineContainer.jsx
│ │ │
│ │ ├─currentBetting
│ │ │ CurrentBettingComponent.jsx
│ │ │ CurrentBettingContainer.jsx
│ │ │
│ │ ├─detail
│ │ │ MatchDetailScore.jsx
│ │ │ MatchTimeComponent.jsx
│ │ │
│ │ ├─doBetting
│ │ │ DoBettingContainer.jsx
│ │ │
│ │ └─prediction
│ │ PredictionComponent.jsx
│ │ PredictionContainer.jsx
│ │ PreditionBar.jsx
│ │
│ ├─mypage
│ │ BadgeButton.jsx
│ │ EditNicknameModal.jsx
│ │ LogoutButton.jsx
│ │ MyWagle.jsx
│ │ SettingItem.jsx
│ │ Usergoal.jsx
│ │ UserProfile.jsx
│ │
│ ├─notification
│ │ NotificationCard.jsx
│ │ NotificationList.jsx
│ │
│ ├─Survey
│ │ LoadingBar.jsx
│ │
│ └─team
│ TeamInfoItem.jsx
│
├─global
│ NotificationState.js
│ SocketProvider.js
│ UserState.js
│
├─hooks
│ useDebounce.js
│ useUserAccessToken.js
│
├─pages
│ ├─board_page
│ │ ├─mate_page
│ │ │ MateDetailPage.jsx
│ │ │ MateListPage.jsx
│ │ │ MateRegistPage.jsx
│ │ │
│ │ ├─product_page
│ │ │ ProductDetailPage.jsx
│ │ │ ProductListPage.jsx
│ │ │ ProductRegistPage.jsx
│ │ │
│ │ └─waggle_page
│ │ WaggleDetailPage.jsx
│ │ WaggleListPage.jsx
│ │ WaggleRegistPage.jsx
│ │
│ ├─login_page
│ │ GoogleRedirection.jsx
│ │ KaKaoRedirection.jsx
│ │ LoginPage.jsx
│ │ NaverRedirection.jsx
│ │
│ ├─logout_page
│ │ LogoutPage.jsx
│ │
│ ├─main_page
│ │ MainPage.jsx
│ │
│ ├─match_page
│ │ MatchChattingPage.jsx
│ │ MatchDetailPage.jsx
│ │ MatchSchedulePage.jsx
│ │
│ ├─my_page
│ │ Badge.jsx
│ │ BadgeComponent.jsx
│ │ BadgeGroup.jsx
│ │ BadgeList.jsx
│ │ MyPage.jsx
│ │ SettingPage.jsx
│ │
│ ├─nav
│ │ Navbar.jsx
│ │
│ ├─notification_page
│ │ NotifiationPage.jsx
│ │
│ ├─SurveyPage
│ │ KakaoPage.jsx
│ │ QuestionPage.jsx
│ │ ResultPage.jsx
│ │ StartPage.jsx
│ │
│ └─teamPage
│ TeamInfoPage.jsx
│
└─styles
│ Button.css
│ common.css
│
├─BoardStyles
│ BoardCreateStyle.js
│ BoardDetailStyle.js
│ BoardStyle.js
│ BoardTopNavbarStyle.js
│ CommentStyle.js
│ ImageStyle.js
│ MateListStyle.js
│ ProductListStyle.js
│ WaggleListStyle.js
│
├─global
│ GlobalStyle.js
│
├─main-styles
│ BannerStyle.js
│ BoardItemStyle.js
│ HotclipStyle.js
│ MainStyle.js
│ NostradamusStyle.js
│ NoticeStyle.js
│ SurveyStyle.js
│ TodayMatchStyle.js
│
├─match-styles
│ │ MatchChattingStyle.js
│ │ MatchDetailStyle.js
│ │ MatchScheduleStyle.js
│ │ MatchTimelinStyle.js
│ │
│ ├─currentBetting
│ │ CurrentBettingComponentStyles.js
│ │ CurrentBettingContainerStyles.js
│ │
│ ├─detail
│ │ MatchDetailScoreStyles.js
│ │ MatchTimeComponentStyles.js
│ │
│ ├─doBetting
│ │ DoBettingContainerStyles.js
│ │
│ └─prediction
│ PredictionComponentStyles.js
│ PredictionContainerStyles.js
│ PreditionBarStyles.js
│
├─mypage-styles
│ badgeStyle.js
│ EditNicknameModel.js
│ MypageStyle.js
│ SettingStyle.js
│
├─navbar-styles
│ NavbarStyle.js
│
├─notification-styles
│ NotificationStyle.js
│
├─SurveyStyles
│ LoadingBarStyle.js
│ Main.js
│ QuizCardStyle.js
│ ResultCardStyle.js
│ StartCardStyle.js
│ SurveyFont.css
│ SurveyTop.js
│
└─TeamStyles
TeamStyle.js
- 전체 개발 기간 : 2024-01-02 ~ 2024-02-16
- 기획 : 2024-01-08 ~ 2024-01-10
- 1st sprint : 2024-01-08 ~ 2024-01-12
- 2nd sprint : 2024-01-15 ~ 2024-01-19
- 3th sprint : 2024-01-22 ~ 2024-01-26
- 4th sprint : 2024-01-29 ~ 2024-02-01
- 추석 비대위 조직 : 2024-02-01 ~ 2024-02-05
- 5th sprint : 2024-02-05 ~ 2024-02-09
- 6th sprint : 2024-02-12 ~ 2024-02-16
[BE]
[FE]
- 카카오, 구글, 네이버 계정으로 소셜 로그인이 가능합니다.
- 프로필 사진을 설정할 수 있습니다.
- K-League1 소속 구단의 엠블럼을 뱃지로서 구매하고 착용할 수 있습니다.
- 닉네임을 설정할 수 있습니다.
- 골(포인트), 베팅 현황, 적중률을 확인할 수 있습니다.
- 각 게시판에서 성한 글을 모아볼 수 있습니다.
- 알림을 키거나 끌 수 있습니다.
- 로그아웃할 수 있습니다.
- 게시판에 작성한 글에 댓글이 달리거나 좋아요가 눌렸을 때 알림을 받을 수 있습니다.
- 출석이나 베팅 성공 등으로 포인트를 받았을 때 관련 알림을 받을 수 있습니다.
- 벳지를 착용했을 때 해당 구단의 관련 뉴스가 필터링되어 추천됩니다.
- 베팅한 경기에 대하여 경기 시작 5분 전에 시작 안내를 받을 수 있습니다.
- 각 구단의 공식 SNS와 홈페이지, 응원가, 선수 정보들을 제공하여 K-League1 소속 구단들의 정보를 한 눈에 모아 볼 수 있습니다.
- K리그를 잘 모르는 사람들을 대상으로 성향 테스트를 통해 사용자가 선택한 답변의 가중치를 분석해 가중치가 가장 높은 구단 1개를 추천합니다.
- 추천된 구단을 SNS를 통해 다른 사람들과 공유할 수 있습니다.
- K-League1 경기 일정들을 리스트와 캘린더 형태로 확인할 수 있습니다.
- 경기 진행 동안 실시간 스코어와 타임라인을 볼 수 있습니다.
- 경기 시작 10분 전까지 응원하는 팀 또는 승리가 예상되는 팀에 베팅을 할 수 있습니다.
- 유저들의 베팅 상황에 따라 배당률이 계산되어 노출됩니다.
- 경기가 끝난 후 베팅 결과에 따라 포인트가 배분됩니다.
- 실시간 채팅을 통해 다른 유저들과 소통할 수 있습니다.
- 욕설 또는 불쾌함을 유발할 수 있는 글귀에는 클린봇 기능을 통해 필터링됩니다.
- 내용에 해시태그를 넣으면 자동으로 해시태그로 인식되어 추후 게시글 추천에 사용됩니다.
- 게시글 추천 버튼을 누르면 개인화된 추천 게시글이 도출됩니다.
- 게시글과 댓글 삭제버튼을 클릭하면 모달로 확인창이 뜹니다.
- 제목, 내용, 여러장의 사진 등을 첨부할 수 있습니다.
- 특정 경기를 클릭한 후 게시글을 작성하여 직관 메이트를 구할 수 있습니다.
- 모집중인 게시글에 모집이 완료되면 모집완료로 변경할 수 있습니다.
- 제목, 내용, 여러장의 사진 등을 첨부할 수 있습니다.
- 게시글과 댓글 삭제버튼을 클릭하면 모달로 확인창이 뜹니다.
- 제목, 내용, 여러장의 사진 등을 첨부할 수 있고 사진을 필수적으로 첨부해야 합니다.
- 게시글을 작성하면 거래가능이 뜨고 거래가 완료되면 거래완료로 변경할 수 있습니다.
- 좋아요와 댓글 수는 실시간으로 상세 페이지에 반영됩니다.
- 비밀 댓글을 클릭하면 비밀 댓글이 작성됩니다.
- 비밀 댓글은 게시글 작성자와 댓글 작성자만 확인할 수 있습니다.
- 구글 플레이스토어와 원스토어에 서비스를 배포할 계획입니다.
- 24년 4월까지 신규 유저 2,000명과 유저 리텐션 30%를 목표로 삼았습니다.
- K리그의 흥행과 신규 유저가 목표치를 달성한다면 서비스를 확대할 계획입니다.