diff --git a/.github/workflows/rankit-cicd.yml b/.github/workflows/rankit-cicd.yml new file mode 100644 index 0000000..c777c07 --- /dev/null +++ b/.github/workflows/rankit-cicd.yml @@ -0,0 +1,68 @@ +name: develop branch bluegreen deployment + +on: + push: + branches: + - release* # Trigger on any branch that starts with "release" + +jobs: + build: + runs-on: ubuntu-latest + permissions: + contents: read + + steps: + - uses: actions/checkout@v4 + + # 1. JDK 17 설정 + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + # 2. Gradle 설정 + - name: Setup Gradle + uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0 + + # 3. Jar 파일 빌드 (테스트 제외) + - name: Build with Gradle Wrapper + run: ./gradlew -x test bootJar + + # 4. Docker Buildx 설정 + - name: Set up Docker Build + uses: docker/setup-buildx-action@v1 + + # 5. Docker 로그인 + - name: Login to Docker Hub + uses: docker/login-action@v1 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_TOKEN }} + + # 6. Docker 이미지 빌드 및 푸시 + - name: Build and push Docker image + run: | + docker build -t ${{ secrets.DOCKER_USERNAME }}/rankitrun-be:latest . + docker push ${{ secrets.DOCKER_USERNAME }}/rankitrun-be:latest + + deploy: + runs-on: ubuntu-latest + needs: build # build 작업이 완료되어야 실행 + permissions: + contents: read + + steps: + # 1. EC2 SSH 접속을 위한 키 등록 + - name: Set up SSH key + uses: webfactory/ssh-agent@v0.5.3 + with: + ssh-private-key: ${{ secrets.API_RANKIT_PEM }} + + # 2. EC2에 blue green 무중단 배포를 위한 스크립트 실행 + - name: Run deploy.sh + run: | + ssh -o StrictHostKeyChecking=no ec2-user@${{ secrets.EC2_HOST }} << 'EOF' + chmod +x deploy.sh # 만약 실행 권한이 없다면 추가 + ./deploy.sh # 스크립트 실행 + EOF \ No newline at end of file diff --git a/.github/workflows/rankit-multiaz-cicd.yml b/.github/workflows/rankit-multiaz-cicd.yml deleted file mode 100644 index 83da7ec..0000000 --- a/.github/workflows/rankit-multiaz-cicd.yml +++ /dev/null @@ -1,231 +0,0 @@ -name: rankit-multiaz-rolling-zerodowntime-cicd - -on: - push: - branches: - - release* # Trigger on any branch that starts with "release" - -jobs: - build: - runs-on: ubuntu-latest - permissions: - contents: read - - steps: - - uses: actions/checkout@v4 - - # 1. JDK 17 설정 - - name: Set up JDK 17 - uses: actions/setup-java@v4 - with: - java-version: '17' - distribution: 'temurin' - - # 2. Gradle 설정 - - name: Setup Gradle - uses: gradle/actions/setup-gradle@417ae3ccd767c252f5661f1ace9f835f9654f2b5 # v3.1.0 - - # 3. Jar 파일 빌드 (테스트 제외) - - name: Build with Gradle Wrapper - run: ./gradlew -x test bootJar - - # 4. Docker Buildx 설정 - - name: Set up Docker Build - uses: docker/setup-buildx-action@v1 - - # 5. Docker 로그인 - - name: Login to Docker Hub - uses: docker/login-action@v1 - with: - username: ${{ secrets.DOCKER_USERNAME }} - password: ${{ secrets.DOCKER_TOKEN }} - - # 6. Docker 이미지 빌드 및 푸시 - - name: Build and push Docker image - run: | - docker build -t ${{ secrets.DOCKER_USERNAME }}/rankitrun-be:latest . - docker push ${{ secrets.DOCKER_USERNAME }}/rankitrun-be:latest - deploy: - runs-on: ubuntu-latest - needs: build # build 작업이 완료되어야 실행 - permissions: - contents: read - - steps: - # 1. AWS CLI 설치 - - name: Install AWS CLI - run: | - sudo apt-get update - sudo apt-get install awscli -y - - # 2. AWS 자격 증명 설정 - - name: Configure AWS credentials - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - run: | - aws configure set aws_access_key_id $AWS_ACCESS_KEY_ID - aws configure set aws_secret_access_key $AWS_SECRET_ACCESS_KEY - aws configure set region ap-northeast-2 # 서울 AWS 리전을 설정 - - # 3. ALB 연결 끊기 (EC2-A) - - name: Deregister EC2-A from Target Group - run: | - aws elbv2 deregister-targets \ - --target-group-arn ${{ secrets.TARGET_GROUP_ARN }} \ - --targets Id=${{ secrets.EC2_A_ID }} - echo "EC2-A has been deregistered from the ALB." - - # 4. Bastion 호스트에 접속하여 EC2-A에 docker-compose 실행 - - name: Deploy to EC2-A via Bastion Host - env: - BASTION_HOST: ${{ secrets.BASTION_HOST }} - SSH_PRIVATE_KEY: ${{ secrets.API_RANKIT_PEM }} - EC2_A_IP: ${{ secrets.EC2_A_IP }} - run: | - echo "$SSH_PRIVATE_KEY" > private_key.pem - chmod 600 private_key.pem - ssh -o StrictHostKeyChecking=no -i private_key.pem ec2-user@$BASTION_HOST "ssh -o StrictHostKeyChecking=no -i /home/ec2-user/my-key.pem ec2-user@$EC2_A_IP ' - if [ \$(docker-compose ps -q app | xargs -r docker inspect -f \"{{.State.Running}}\") == \"true\" ]; then - docker-compose down - fi - sleep 10 - docker-compose up -d --pull always - - # 향상된 헬스체크: 최대 10번 시도, 5초 간격 - MAX_HEALTH_CHECKS=10 - HEALTH_CHECK_COUNT=0 - - while [ \$HEALTH_CHECK_COUNT -lt \$MAX_HEALTH_CHECKS ]; do - if curl -s 127.0.0.1:8080 | grep -q \"health Check Success\"; then - echo \"EC2-A is healthy after \$((HEALTH_CHECK_COUNT + 1)) attempts.\" - exit 0 - else - echo \"Health check attempt \$((HEALTH_CHECK_COUNT + 1)) failed. Retrying in 5 seconds...\" - sleep 5 - HEALTH_CHECK_COUNT=\$((HEALTH_CHECK_COUNT + 1)) - fi - - if [ \$HEALTH_CHECK_COUNT -eq \$MAX_HEALTH_CHECKS ]; then - echo \"EC2-A health check failed after \$MAX_HEALTH_CHECKS attempts.\" - exit 1 - fi - done - '" - rm private_key.pem - - # 5. ALB 연결 복원 (EC2-A) - - name: Register EC2-A back to Target Group - run: | - aws elbv2 register-targets \ - --target-group-arn ${{ secrets.TARGET_GROUP_ARN }} \ - --targets Id=${{ secrets.EC2_A_ID }} - echo "EC2-A has been registered back to the ALB." - - # 6. ALB 연결 상태 확인 (EC2-A) - - name: Check Health of ALB Connection to EC2-A - run: | - MAX_ATTEMPTS=30 - ATTEMPT=0 - - while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do - HEALTH_STATUS=$(aws elbv2 describe-target-health \ - --target-group-arn ${{ secrets.TARGET_GROUP_ARN }} \ - --query "TargetHealthDescriptions[?Target.Id=='${{ secrets.EC2_A_ID }}'].TargetHealth.State" \ - --output text) - - if [ "$HEALTH_STATUS" == "healthy" ]; then - echo "EC2-A is healthy in ALB." - break - else - echo "Waiting for EC2-A to become healthy in ALB..." - sleep 10 - ATTEMPT=$((ATTEMPT + 1)) - fi - - if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then - echo "EC2-A is not healthy in ALB after $MAX_ATTEMPTS attempts. Exiting." - exit 1 - fi - done - - # 7. ALB 연결 끊기 (EC2-C) - - name: Deregister EC2-C from Target Group - run: | - aws elbv2 deregister-targets \ - --target-group-arn ${{ secrets.TARGET_GROUP_ARN }} \ - --targets Id=${{ secrets.EC2_C_ID }} - echo "EC2-C has been deregistered from the ALB." - - # 8. Bastion 호스트에 접속하여 EC2-C에 docker-compose 실행 - - name: Deploy to EC2-C via Bastion Host - env: - BASTION_HOST: ${{ secrets.BASTION_HOST }} - SSH_PRIVATE_KEY: ${{ secrets.API_RANKIT_PEM }} - EC2_C_IP: ${{ secrets.EC2_C_IP }} - run: | - echo "$SSH_PRIVATE_KEY" > private_key.pem - chmod 600 private_key.pem - ssh -o StrictHostKeyChecking=no -i private_key.pem ec2-user@$BASTION_HOST "ssh -o StrictHostKeyChecking=no -i /home/ec2-user/my-key.pem ec2-user@$EC2_C_IP ' - if [ \$(docker-compose ps -q app | xargs -r docker inspect -f \"{{.State.Running}}\") == \"true\" ]; then - docker-compose down - fi - sleep 10 - docker-compose up -d --pull always - - # 향상된 헬스체크: 최대 10번 시도, 5초 간격 - MAX_HEALTH_CHECKS=10 - HEALTH_CHECK_COUNT=0 - - while [ \$HEALTH_CHECK_COUNT -lt \$MAX_HEALTH_CHECKS ]; do - if curl -s 127.0.0.1:8080 | grep -q \"health Check Success\"; then - echo \"EC2-C is healthy after \$((HEALTH_CHECK_COUNT + 1)) attempts.\" - exit 0 - else - echo \"Health check attempt \$((HEALTH_CHECK_COUNT + 1)) failed. Retrying in 5 seconds...\" - sleep 5 - HEALTH_CHECK_COUNT=\$((HEALTH_CHECK_COUNT + 1)) - fi - - if [ \$HEALTH_CHECK_COUNT -eq \$MAX_HEALTH_CHECKS ]; then - echo \"EC2-C health check failed after \$MAX_HEALTH_CHECKS attempts.\" - exit 1 - fi - done - '" - rm private_key.pem - - # 9. ALB 연결 복원 (EC2-C) - - name: Register EC2-C back to Target Group - run: | - aws elbv2 register-targets \ - --target-group-arn ${{ secrets.TARGET_GROUP_ARN }} \ - --targets Id=${{ secrets.EC2_C_ID }} - echo "EC2-C has been registered back to the ALB." - - # 10. ALB 연결 상태 확인 (EC2-C) - - name: Check Health of ALB Connection to EC2-C - run: | - MAX_ATTEMPTS=30 - ATTEMPT=0 - - while [ $ATTEMPT -lt $MAX_ATTEMPTS ]; do - HEALTH_STATUS=$(aws elbv2 describe-target-health \ - --target-group-arn ${{ secrets.TARGET_GROUP_ARN }} \ - --query "TargetHealthDescriptions[?Target.Id=='${{ secrets.EC2_C_ID }}'].TargetHealth.State" \ - --output text) - - if [ "$HEALTH_STATUS" == "healthy" ]; then - echo "EC2-C is healthy in ALB." - break - else - echo "Waiting for EC2-C to become healthy in ALB..." - sleep 10 - ATTEMPT=$((ATTEMPT + 1)) - fi - - if [ $ATTEMPT -eq $MAX_ATTEMPTS ]; then - echo "EC2-C is not healthy in ALB after $MAX_ATTEMPTS attempts. Exiting." - exit 1 - fi - done diff --git a/README.md b/README.md index f7e4491..1841d05 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ - - - +## 🌐 Service +> **[RankIt](https://rankit.run)** - https://rankit.run @@ -24,7 +23,6 @@ -
## 1. 개발 환경 @@ -34,7 +32,28 @@ - 서비스 배포 환경 : AWS - EC2 , Docker , Github Actions 사용 예정
-## 2. 전략 및 컨벤션 +## 2. 서비스 아키텍쳐 (최종 완성형) +![image](https://github.com/user-attachments/assets/1fe4896c-4a5c-4756-9337-6c02970a47e6) + + + +## 2-1. 현재 아키텍쳐 (지속된 비용 문제로 인한 변경) + +### 변경 사유 +- 현재 유저 규모로 예상했을때 이중화 서버를 구축하기에는 너무 많은 비용이 부과되어 현재 구조로 변경 +- 현재 구조의 경우 비용이 나오지 않음! + +![img.png](https://github.com/user-attachments/assets/2d6ddd97-04ef-481c-b2e3-c52ef8bfe0b1) + + + +
+ + ## 3. ERD + +![image](https://github.com/user-attachments/assets/5c8108bb-c155-4127-a7e6-d730e5de3f1e) + +## 4. 브랜치 전략 및 컨벤션 ### 브랜치 전략 @@ -64,7 +83,7 @@ -## 3. 패키지 구조 +## 5. 패키지 구조 ### 05.20 기준 도메인형으로 변경! diff --git a/src/main/java/gitbal/backend/api/schoolPage/controller/SchoolRankController.java b/src/main/java/gitbal/backend/api/schoolPage/controller/SchoolRankController.java index 3dc7aa3..40bfbfb 100644 --- a/src/main/java/gitbal/backend/api/schoolPage/controller/SchoolRankController.java +++ b/src/main/java/gitbal/backend/api/schoolPage/controller/SchoolRankController.java @@ -26,7 +26,7 @@ public class SchoolRankController { private final SchoolRankService schoolRankService; - @GetMapping("/mySchool") // 삭제???? + @GetMapping("/mySchool") @Operation(summary = "이 API 가 필요할까요? 이건 보류", description = "내 학교 정보 탭 관련 api 요청입니다.") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "내 학교 정보 요청을 성공했습니다."), diff --git a/src/main/java/gitbal/backend/api/univcert/service/MailService.java b/src/main/java/gitbal/backend/api/univcert/service/MailService.java index 1bac584..51e4a81 100644 --- a/src/main/java/gitbal/backend/api/univcert/service/MailService.java +++ b/src/main/java/gitbal/backend/api/univcert/service/MailService.java @@ -42,7 +42,7 @@ public void sendMail(String to) { helper.setSubject("랭깃 인증 코드 발급 안내"); helper.setText(setContext(code), true); helper.addInline("rankitLogo", - new ClassPathResource("img/rankit.png")); // 로고 파일 경로 수정 필요 + new ClassPathResource("img/rankit.png")); mailSender.send(message); univCertRepository.findByEmail(to).ifPresentOrElse(u -> u.updateCode(code, diff --git a/src/main/java/gitbal/backend/domain/user/User.java b/src/main/java/gitbal/backend/domain/user/User.java index a82b7d6..cc9cdd5 100644 --- a/src/main/java/gitbal/backend/domain/user/User.java +++ b/src/main/java/gitbal/backend/domain/user/User.java @@ -46,7 +46,6 @@ public class User extends BaseTimeEntity { @Column(name = "user_id") private Long id; - // Todo: 공부한 이후 수정 작업 계속 진행 (JPA 공부) @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "school_id") private School school; diff --git a/src/main/java/gitbal/backend/global/mock/GenerateRealMockUser.java b/src/main/java/gitbal/backend/global/mock/GenerateRealMockUser.java deleted file mode 100644 index fb6a71e..0000000 --- a/src/main/java/gitbal/backend/global/mock/GenerateRealMockUser.java +++ /dev/null @@ -1,51 +0,0 @@ -package gitbal.backend.global.mock; - -import lombok.Getter; - -import java.util.List; - -@Getter -public class GenerateRealMockUser { - - private final List names = List.of( - "Ace", "Apollo", "Ash", "Atlas", "Axel", "Blaine", "Blaze", "Bolt", "Brick", "Brody", - "Buck", "Cade", "Cash", "Chase", "Cole", "Dash", "Dax", "Dex", "Finn", "Flynn", - "Gage", "Griff", "Hawk", "Holt", "Hunter", "Jace", "Jett", "Knox", "Lance", "Logan", - "Mace", "Maverick", "Max", "Nash", "Nico", "Pax", "Phoenix", "Quinn", "Rex", "Ryder", - "Sawyer", "Scout", "Sky", "Slade", "Steel", "Stone", "Talon", "Tate", "Thane", "Troy", - "Vance", "Wolf", "Zane", "Zoey", "Zoe", "Zara", "Ava", "Luna", "Mila", "Ella", - "Emma", "Nora", "Layla", "Isla", "Maya", "Avery", "Aurora", "Brook", "Hazel", "Leah", - "Skylar", "Piper", "Alexa", "Riley", "Quinn", "Ruby", "Aiden", "Bray", "Colt", "Evan", - "Finn", "Grey", "Hugh", "Jace", "Kian", "Levi", "Milo", "Noah", "Odin", "Pace", - "Reed", "Seth", "Theo", "Vito", "Wren", "Zion", "Aria", "Belle", "Cleo", "Daisy", - "Elle", "Freya", "Gia", "Hope", "Ivy", "Jade", "Kara", "Lily", "Mia", "Nova", - "Olive", "Paige", "Rain", "Sage", "Tara", "Una", "Vera", "Willow", "Xena", "Yara", - "Zoe", "Beau", "Casey", "Dana", "Eli", "Finn", "Gus", "Hale", "Ike", "Jax", - "Kade", "Lake", "Moe", "Nate", "Otto", "Poe", "Quade", "Rex", "Saul", "Tate", - "Uma", "Vann", "Wade", "Xan", "Yule", "Zed", "Amy", "Bea", "Cora", "Dora", - "Eve", "Faye", "Gina", "Hope", "Isis", "Juno", "Kia", "Lena", "Mara", "Nina", - "Opal", "Pearl", "Rea", "Sia", "Tia", "Uma", "Vera", "Wyn", "Xia", "Yumi", - "Zara", "Arlo", "Benji", "Cedric", "Dexter", "Ezra", "Fletcher", "Gideon", "Harley", "Idris", - "Jasper", "Kingston", "Landon", "Micah", "Nash", "Orion", "Parker", "Rafael", "Samson", "Tristan", - "Uri", "Victor", "Wyatt", "Xander", "Yosef", "Zeke", "Alma", "Belle", "Cleo", "Dara", - "Elena", "Flora", "Gina", "Helena", "Ines", "Jemma", "Kyla", "Luna", "Mira", "Nadia", - "Orla", "Poppy", "Rhea", "Selena", "Tiana", "Una", "Veda", "Willow", "Xenia", "Yasmin", - "Zuri", "Asher", "Brooks", "Colby", "Dane", "Ellis", "Ford", "Gage", "Hayes", "Ian", - "Jett", "Kai", "Lyle", "Mason", "Nico", "Owen", "Porter", "Quinn", "Reid", "Shane", - "Trey", "Urban", "Vaughn", "Wells", "Xavi", "Yanni", "Zander", "Aiden", "Beck", "Clark", - "Dean", "Emmet", "Flynn", "Grant", "Hale", "Ira", "Jude", "Knox", "Lane", "Miles", - "Nolan", "Oscar", "Pace", "Reeve", "Shay", "Thane", "Usher", "Vale", "West", "Xen", - "Yule", "Zane", "Blair", "Carter", "Dylan", "Emery", "Fallon", "Galen", "Haven", "Indie", "Jules", "Kieran", - "Lennox", "Marlow", "Nico", "Oakley", "Paisley", "Quincy", "Remy", "Shay", "Tatum", "Urban", - "Vesper", "Wilder", "Xavi", "Yara", "Zeke", "Alden", "Briar", "Cassian", "Darcy", "Ellery", - "Frankie", "Greer", "Harlow", "Idris", "Joss", "Keegan", "Lark", "Maddox", "Nova", "Onyx", - "Perry", "Romy", "Stevie", "Teagan", "Uma", "Vaughn", "Winslow", "Xander", "Yates", "Zara", "Arwen", "Blaise", "Caelan", "Dove", "Elio", "Frost", "Gentry", "Hollis", "Ira", "Juno", - "Kace", "Lumi", "Merlin", "Niall", "Orin", "Phaedra", "Riven", "Sable", "Theron", "Vale" - ); - - - - - - -} diff --git a/src/main/java/gitbal/backend/global/mock/ImgGenerator.java b/src/main/java/gitbal/backend/global/mock/ImgGenerator.java deleted file mode 100644 index 1588e9e..0000000 --- a/src/main/java/gitbal/backend/global/mock/ImgGenerator.java +++ /dev/null @@ -1,16 +0,0 @@ -package gitbal.backend.global.mock; - -public class ImgGenerator { - private static String IMG_BASE_URL = "https://raw.githubusercontent.com/jamooooong/rankit_mock_img/refs/heads/main/jpg/rankit_mock_"; - public String imgGenerator(int index){ - StringBuilder sb = new StringBuilder(); - if(index < 10) - sb.append(IMG_BASE_URL).append("00").append(index).append(".jpg"); - else if(index < 100) - sb.append(IMG_BASE_URL).append("0").append(index).append(".jpg"); - else - sb.append(IMG_BASE_URL).append(index).append(".jpg"); - return sb.toString(); - } - -} diff --git a/src/main/java/gitbal/backend/global/mock/MockDataGenerator.java b/src/main/java/gitbal/backend/global/mock/MockDataGenerator.java deleted file mode 100644 index ba5650b..0000000 --- a/src/main/java/gitbal/backend/global/mock/MockDataGenerator.java +++ /dev/null @@ -1,161 +0,0 @@ -package gitbal.backend.global.mock; - - -import gitbal.backend.api.guestBookPage.facade.GuestBookPageFacade; -import gitbal.backend.domain.guestbook.application.GuestBookService; -import gitbal.backend.domain.introduction.application.repository.IntroductionRepository; -import gitbal.backend.domain.region.application.repository.RegionRepository; -import gitbal.backend.domain.user.UserService; -import gitbal.backend.global.constant.Grade; -import gitbal.backend.domain.region.Region; -import gitbal.backend.domain.school.School; -import gitbal.backend.domain.user.User; -import gitbal.backend.domain.school.SchoolRepository; -import gitbal.backend.domain.user.UserRepository; -import gitbal.backend.domain.region.application.RegionService; -import gitbal.backend.domain.school.SchoolService; - -import java.util.HashSet; -import java.util.List; -import java.util.Random; -import java.util.stream.Collectors; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.boot.CommandLineRunner; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Transactional; - - -@Component -@RequiredArgsConstructor -@Slf4j -public class MockDataGenerator implements CommandLineRunner { - - // Repositories and services declarations are omitted for brevity - private final SchoolRepository schoolRepository; - private final RegionRepository regionRepository; - private final UserRepository userRepository; - private final UserService userService; - private final SchoolService schoolService; - private final RegionService regionService; - private final GuestBookService guestBookService; - private final IntroductionRepository introductionRepository; - - - private final Random random = new Random(); - private final GenerateRealMockUser generateRealMockUser = new GenerateRealMockUser(); - private SchoolGenerator schoolGenerator; - private RegionGenerator regionGenerator; - private final ImgGenerator imgGenerator = new ImgGenerator(); - - @Override - @Transactional - public void run(String... args) throws Exception { - schoolGenerator = new SchoolGenerator(schoolRepository); - regionGenerator = new RegionGenerator(regionRepository); - log.info("Start runner to create mock data"); - List names = new HashSet<>(generateRealMockUser.getNames()).stream().toList(); - log.info("name size was {}" , names.size()); - - for (int i = 0; i < names.size(); i++) { - String username = names.get(i); - log.info("now username {}", username); - log.info("now i {}", i); - if (userRepository.findByNickname(username).isPresent()) { - log.info("duplicate"); - continue; - } - School school = schoolGenerator.generateSchool(); - Region region = regionGenerator.generateRegion(); - String imgUrl = imgGenerator.imgGenerator(i); - Long randomScore = (long) random.nextInt(0, 120000); // Example userScore - - User user = User.builder() - .school(school) - .region(region) - .nickname(username) - .score(randomScore) - .profile_img(imgUrl) - .grade(Grade.PURPLE) - .build(); - - createIntroductionForUser(user); - String randomMajorLanguagesForUser = createRandomMajorLanguagesForUser(user); - scoring(user); - - // Update user with the new relations - user.joinMockUpdateUser(school, region, randomMajorLanguagesForUser, - user.getNickname(), user.getScore(), user.getProfile_img(), 0, user.getIntroduction()); - - userRepository.save(user); - guestBookService.saveGuestBook(user, "안녕하세요!"); - - if (i % 50 == 0 && i != 0) { - userRepository.flush(); - log.info("Flushed and cleared at count {}", i); - } - } - - // Test를 위한 나(이승준)의 githubid와 동일한 nickname data - -// String lee = "leesj000603"; -// if (userRepository.findByNickname(lee).isPresent()) { -// log.info("duplicate"); -// return; -// } -// -// createUserWithNickname(lee); -// createUserWithNickname("jamooooong"); - userService.updateUserRank(); //user 순위 업데이트 - userService.updateUserGrade(); // user 등급 업데이트 - schoolService.updateSchoolRank(); // school 순위 업데이트 - log.info("Mock data creation completed!!!!!!"); - } - - - private void createUserWithNickname(String nickName) { - School school = schoolRepository.findById(1L) - .orElse(null); - Region region = regionRepository.findById(1L) - .orElse(null); - - User user = User.builder() - .school(school) - .region(region) - .nickname(nickName) - .score(140000L) - .profile_img("https://i.namu.wiki/i/tyx9GSyT6U1vpeboPZpUimd2wgkQsB7SDBIe8nFnHRlgCrXRpp6_C9QRvz61A9KRyf_oP1rUHT8Ykwc3CQF9nDQ4aFR5_5ZueLRbnodvtMpF_wPCbRMis09h_JwvVMIRv12bnrAXy6ecLT959C9a4w.webp") - .grade(Grade.PURPLE) - .build(); - - String randomMajorLanguagesForUser = createRandomMajorLanguagesForUser(user); - - user.joinMockUpdateUser(school, region, randomMajorLanguagesForUser, - user.getNickname(), user.getScore(), user.getProfile_img(), 0, introductionRepository.createIntroductionAndReturn()); - userRepository.save(user); - } - - private String createRandomMajorLanguagesForUser(User user) { - // Generate a random number of languages for each user - int languagesCount = 1; // Random number of languages between 1 and 5 - int i = random.nextInt(5); - String[] languages = {"Java", "C#", "JavaScript", "Python", "C"}; - String randomLanguage = languages[i]; - - return randomLanguage; - } - - private User createIntroductionForUser(User user) { - user.setIntroduction(introductionRepository.createIntroductionAndReturn()); - return user; - } - - - private void scoring(User findUser) { - schoolService.joinNewUserScore(findUser); - regionService.joinNewUserScore(findUser); - } - - -} \ No newline at end of file diff --git a/src/main/java/gitbal/backend/global/mock/RegionGenerator.java b/src/main/java/gitbal/backend/global/mock/RegionGenerator.java deleted file mode 100644 index 4ac2d55..0000000 --- a/src/main/java/gitbal/backend/global/mock/RegionGenerator.java +++ /dev/null @@ -1,28 +0,0 @@ -package gitbal.backend.global.mock; - -import gitbal.backend.domain.region.Region; -import gitbal.backend.domain.region.application.repository.RegionRepository; -import gitbal.backend.domain.school.School; -import gitbal.backend.domain.school.SchoolRepository; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -public class RegionGenerator { - - private final RegionRepository regionRepository; - private static final int REGION_SIZE = 10; - private static long id=1; - - private static int count=0; - - public Region generateRegion() { - Region byId = regionRepository.findById((id % REGION_SIZE) +1).get(); - if(count<5) { - count++; - }else{ - count=0; - id++; - } - return byId; - } -} diff --git a/src/main/java/gitbal/backend/global/mock/SchoolGenerator.java b/src/main/java/gitbal/backend/global/mock/SchoolGenerator.java deleted file mode 100644 index e3b69d3..0000000 --- a/src/main/java/gitbal/backend/global/mock/SchoolGenerator.java +++ /dev/null @@ -1,27 +0,0 @@ -package gitbal.backend.global.mock; - -import gitbal.backend.domain.school.School; -import gitbal.backend.domain.school.SchoolRepository; -import lombok.RequiredArgsConstructor; - -import java.util.Optional; - -@RequiredArgsConstructor -public class SchoolGenerator { - - private final SchoolRepository schoolRepository; - private static long id=1; - - private static int count=0; - - public School generateSchool() { - School byId = schoolRepository.findById(id).get(); - if(count<5) { - count++; - }else{ - count=0; - id++; - } - return byId; - } -} diff --git a/src/main/java/gitbal/backend/schedule/SchedulingService.java b/src/main/java/gitbal/backend/schedule/SchedulingService.java index bf77c0c..9ef4200 100644 --- a/src/main/java/gitbal/backend/schedule/SchedulingService.java +++ b/src/main/java/gitbal/backend/schedule/SchedulingService.java @@ -26,7 +26,7 @@ public class SchedulingService { private final UserGradeUpdater userGradeUpdater; private final UnivCertCodeChecker univCertCodeChecker; - @Scheduled(initialDelay = 1, fixedRate = 120, timeUnit = TimeUnit.MINUTES) // fixedRate를 사용하여 일정한 6시간의 주기를 가지는것이 중요! + @Scheduled(initialDelay = 1, fixedRate = 120, timeUnit = TimeUnit.MINUTES) // fixedRate를 사용하여 일정한 2시간의 주기를 가지는것이 중요! @SchedulerLock(name="updateUser") @Transactional public void updateUser() { diff --git a/src/main/java/gitbal/backend/schedule/userupdate/UserSetup.java b/src/main/java/gitbal/backend/schedule/userupdate/UserSetup.java index 95ea478..8fbac8a 100644 --- a/src/main/java/gitbal/backend/schedule/userupdate/UserSetup.java +++ b/src/main/java/gitbal/backend/schedule/userupdate/UserSetup.java @@ -1,7 +1,6 @@ package gitbal.backend.schedule.userupdate; import gitbal.backend.domain.user.UserService; -import gitbal.backend.global.mock.GenerateRealMockUser; import java.util.List; import java.util.stream.Collectors; @@ -9,14 +8,11 @@ public abstract class UserSetup { - private final GenerateRealMockUser generateRealMockUser = new GenerateRealMockUser(); protected List getAllUsernames(UserService userService){ - List allUserNamesExcludeMockData = userService.findAllUserNames(); + List userNames = userService.findAllUserNames(); - return allUserNamesExcludeMockData.stream() - .filter(u -> !generateRealMockUser.getNames().contains(u)) - .collect(Collectors.toList()); + return userNames.stream().toList(); } }