프로젝트/운동일지

오류발생 - 총볼륨 구하는 로직

티코딩 2024. 6. 10. 17:20

가장 최근에 구현한 총볼륨을 구해서 표시해주는 로직에 문제가 생겼다.

여기서 세트추가하면 home에서 총볼륨을 구해 표시해준다.

 

세트가 한개일땐 잘 구해진다.

세트가 두개가되면

총 볼륨이 2배가 된다.

로직이 잘못된거같다.

 

현재 로직부터 살펴보자.

 

1. HomeController

@GetMapping("/home")
    public String home(@RequestParam(value = "year", required = false) Integer year,
                       @RequestParam(value = "month", required = false) Integer month,
                       Model model) {
        LocalDate now = LocalDate.now();
        int currentYear = (year == null) ? now.getYear() : year;
        int currentMonth = (month == null) ? now.getMonthValue() : month;

        YearMonth yearMonth = YearMonth.of(currentYear, currentMonth);
        User currentUser = userService.getCurrentUser();
        Long userId = currentUser.getId();
        WsessionDto.WsessionStatsDto stats = wsessionService.getMonthlyStats(userId, yearMonth);
        model.addAttribute("totalVolume", stats.getTotalVolume());
        int daysInMonth = yearMonth.lengthOfMonth();
        LocalDate firstOfMonth = yearMonth.atDay(1);
        int dayOfWeekValue = firstOfMonth.getDayOfWeek().getValue() % 7; // Sunday=0, Monday=1, ..., Saturday=6

        List<Integer> emptyDays = new ArrayList<>();
        for (int i = 0; i < dayOfWeekValue; i++) {
            emptyDays.add(i);
        }

        List<String> days = new ArrayList<>();
        for (int i = 1; i <= daysInMonth; i++) {
            days.add(String.format("%02d", i));
        }

        String paddedMonth = String.format("%02d", currentMonth);

        List<LocalDate> sessionDates = wsessionService.getSessionDates(currentYear, currentMonth);
        List<String> sessionDays = (sessionDates != null) ? sessionDates.stream()
                .map(date -> String.format("%02d", date.getDayOfMonth()))
                .collect(Collectors.toList()) : new ArrayList<>();

        model.addAttribute("currentYear", currentYear);
        model.addAttribute("currentMonth", currentMonth); // 패딩 처리하지 않은 숫자
        model.addAttribute("paddedMonth", paddedMonth); // 패딩된 월 문자열
        model.addAttribute("emptyDays", emptyDays);
        model.addAttribute("days", days);
        model.addAttribute("sessionDays", sessionDays);

        return "home";
    }

 

2. WsessionService

@Transactional(readOnly = true)
    public WsessionDto.WsessionStatsDto getMonthlyStats(Long userId, YearMonth yearMonth) {
        LocalDate startDate = yearMonth.atDay(1);
        LocalDate endDate = yearMonth.atEndOfMonth();

        List<Wsession> sessions = wsessionRepository.findAllByUserIdAndWsessionIdBetween(userId, startDate, endDate);

        int totalWeight = 0;
        int totalReps = 0;

        for (Wsession session : sessions) {
            for (Exercise exercise : session.getExercises()) {
                for (ExerciseSet set : exercise.getSets()) {
                    totalWeight += set.getWeight();
                    totalReps += set.getReps();
                }
            }
        }
        int totalVolume = totalWeight * totalReps;
        return new WsessionDto.WsessionStatsDto(totalVolume);
    }

 

내가 왜이렇게 한지 모르겠다. 계산식이 잘못되었다. 총볼륨은 총무게 * 총반복횟수가 아니라, 각세트의 무게 x 횟수한거를 다 더한게 총볼륨이다.

그래서 간단히 고쳤다.

@Transactional(readOnly = true)
    public WsessionDto.WsessionStatsDto getMonthlyStats(Long userId, YearMonth yearMonth) {
        LocalDate startDate = yearMonth.atDay(1);
        LocalDate endDate = yearMonth.atEndOfMonth();

        List<Wsession> sessions = wsessionRepository.findAllByUserIdAndWsessionIdBetween(userId, startDate, endDate);

        int totalVolume = 0;	//수정한부분


        for (Wsession session : sessions) {
            for (Exercise exercise : session.getExercises()) {
                for (ExerciseSet set : exercise.getSets()) {
                    int setVolume = set.getWeight() * set.getReps();	//수정한부분
                    totalVolume += setVolume;	//수정한부분
                }
            }
        }
        return new WsessionDto.WsessionStatsDto(totalVolume);
    }
}

휴~ 잘됐다.