Riot API를 활용한 전적검색 및 승률 분석 서비스입니다.
![개발목적](https://private-user-images.githubusercontent.com/128073698/263655248-7967ce14-093a-46b8-97be-ac91fd5c5c86.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwMTcyOTgsIm5iZiI6MTczOTAxNjk5OCwicGF0aCI6Ii8xMjgwNzM2OTgvMjYzNjU1MjQ4LTc5NjdjZTE0LTA5M2EtNDZiOC05N2JlLWFjOTFmZDVjNWM4Ni5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQxMjE2MzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT02YjBmZWFjNTgwNmExMGM5YWFhMzMwMGQ5YjczYjBlNDE0MTNjZDc0YTA0ODIwYzk3YjY3YTRmNDAwYWFmNGY2JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.11XBgD7HMf9g5uB5LT1lKWEE7u48h99znUvKzJIyWsE)
- 프론트 : React
- 백엔드 : Spring, Redis, Kafka, Docker
- 클라우드 : Azure VM, Azure Database for MySQL
- CI/CD : Git Actions, Docker Compose
- 협업 도구 : Azure DevOps
- 리액트로 프론트 구성
- GPTAnalyzer 서비스와 Kafka를 이용한 비동기 통신
- Riot CDN 이미지 정보 Redis 캐싱
- 리버스 프록시 서버로 Nginx 구성
메인화면
![메인 화면](https://private-user-images.githubusercontent.com/128073698/263648469-cab47e7a-9ae8-42d7-9d5c-eb788c4bde84.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwMTcyOTgsIm5iZiI6MTczOTAxNjk5OCwicGF0aCI6Ii8xMjgwNzM2OTgvMjYzNjQ4NDY5LWNhYjQ3ZTdhLTlhZTgtNDJkNy05ZDVjLWViNzg4YzRiZGU4NC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQxMjE2MzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lMmUzZDBhOGNiNDA3YzhlZjlhNTE2ZjEwMjAwNWQxZDUxNGQ5MmUzNjI2ZWIxNDczNzk1ZmY1MDZiZjk2N2ZiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.7d9mXSd07gxqdPnKK1SJrnQLFmtf2NkeAu0jgLoHjIM)
소환사 상세 화면
![소환사 상세화면](https://private-user-images.githubusercontent.com/128073698/263648629-39f28688-b60f-49eb-8911-047b8392fafc.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwMTcyOTgsIm5iZiI6MTczOTAxNjk5OCwicGF0aCI6Ii8xMjgwNzM2OTgvMjYzNjQ4NjI5LTM5ZjI4Njg4LWI2MGYtNDllYi04OTExLTA0N2I4MzkyZmFmYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQxMjE2MzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0zMjcyOGE4NTY4NzE2ODFjM2U2NmMzZGU4Y2Q2Njc5Y2MxNGE5MjFjMWEwNzdhNmQwMjg2M2YwNDRiNTdiOTY0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.tnw31KKskvwrKoYB9Wg-HtZ929fndAt_8D-LC81g1_4)
게임 상세 정보
![상세화면 상세](https://private-user-images.githubusercontent.com/128073698/263648845-a2df2143-adbe-4451-b20a-d2f74a126448.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwMTcyOTgsIm5iZiI6MTczOTAxNjk5OCwicGF0aCI6Ii8xMjgwNzM2OTgvMjYzNjQ4ODQ1LWEyZGYyMTQzLWFkYmUtNDQ1MS1iMjBhLWQyZjc0YTEyNjQ0OC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQxMjE2MzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT00NWJhNzhkMzIwMzM5ZWU0ZjczM2VhMjMzMThhMWQ4MzgwODgzODliMjRlODE1NGNiMDMyMGY3MDQyMWUyYWQ5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.COvYSPHPAKYxVUyHOcEleHUe2fjFBAWs6wKIQhJQujg)
승률 분석 화면
![승률 분석 화면](https://private-user-images.githubusercontent.com/128073698/263648977-63eef321-58f7-4659-90c4-7ab18b09935e.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwMTcyOTgsIm5iZiI6MTczOTAxNjk5OCwicGF0aCI6Ii8xMjgwNzM2OTgvMjYzNjQ4OTc3LTYzZWVmMzIxLTU4ZjctNDY1OS05MGM0LTdhYjE4YjA5OTM1ZS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQxMjE2MzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT04OTMwZjc5NDYyNDBhNWE2YjljMDkzMTYwY2ZkNjhiNWU2NDI2NzRjMTQ0NzM1NjVjYzNlMWJlNGI5MDgzOTc4JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.F_1J7wBgT62YdnoLdGMUQ0hkbZkagTHWj5P1lTEf05w)
GPT 승률 통계 분석
![GPT 분석](https://private-user-images.githubusercontent.com/128073698/263649106-a2ffeb5a-5ea7-44e5-a9ff-3aeab4b8f885.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwMTcyOTgsIm5iZiI6MTczOTAxNjk5OCwicGF0aCI6Ii8xMjgwNzM2OTgvMjYzNjQ5MTA2LWEyZmZlYjVhLTVlYTctNDRlNS1hOWZmLTNhZWFiNGI4Zjg4NS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQxMjE2MzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yNWZmYzdlNTRkM2NkZjhlMjNjMzk3Yjk3MjhkMDNjYjE5ZjBiZmZlNmNiMDZhNTEyNWNmOWY4OTY2MzkwNzc0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.146JzBObT9nCRjOfcI9M-9u7JPQ42wdVU2GwAOAUgGQ)
인게임 정보 화면
![인게임 화면](https://private-user-images.githubusercontent.com/128073698/263649282-4828f959-5b0b-4175-a88f-c689f573bedb.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkwMTcyOTgsIm5iZiI6MTczOTAxNjk5OCwicGF0aCI6Ii8xMjgwNzM2OTgvMjYzNjQ5MjgyLTQ4MjhmOTU5LTViMGItNDE3NS1hODhmLWM2ODlmNTczYmVkYi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjA4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIwOFQxMjE2MzhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT05YWFjZDIxY2VmOWU5OTllNjAzYmI5NzIxODlmYzBhOGZlOWJiODAwOWQ3MzEwZjRhMzU0NWY4NGJjNTkyMGVjJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.klE-pyeeXIYy-VS904ZdVU-Jne1WbRPWGeZr8Rs4IMY)
- 매치 정보 가져올때 참여자 10명정보를 쿼리를 한개씩 또 날리는 N + 1 문제 발생
=> JPA Batch Size를 이용해 IN 쿼리로 한방 쿼리를 날려 성능 크게 향상 - RIOT API에서 가져온 소환사의 매치 정보들을 한개씩 insert 쿼리가 날라가서 50개 매치정보 가져오는데 30초 소요
=> batch insert를 통해 한방 insert 쿼리를 날려 성능 향상 30초 -> 10초 - RIOT CDN의 이미지 정보를 매번 API를 통해 받아서 성능 이슈 발생
=> 최초 한번만 API를 통해 가져오고 이후 Redis 캐싱을 통해 성능 향상 - 클라이언트가 Kafka 메세지 브로커를 찾지 못하는 이슈 발생
=> 도커 브리지 네트워크를 만들어서 해결 - CI/CD 배포 파이프라인을 만들면서 Docker 로그인 과정에서 권한 이슈 발생
=> sudo chmod 666 /var/run/docker.sock 을 통해 해결 - 배포완료 과정에서 서비스를 내렸다가 다시 올릴때 nginx가 다시 올라온 서비스를 못찾는 이슈 발생
=> 배포 완료과정에 docker compose stop nginx 추가 및 nginx에 서비스 의존성 추가 - JPA에서 save를 할때 이미 Key값이 있는경우에는 persist가 아니라 merge를 하기때문에 쓸데없는 select 쿼리 발생
=> Persistable 상속하여 isNew 오버라이딩