Skip to content

Commit 9358640

Browse files
authored
Merge pull request #151 from Money-Touch/fix/#150
2 parents 2ea149a + a990f78 commit 9358640

7 files changed

Lines changed: 31 additions & 100 deletions

File tree

src/main/java/com/server/money_touch/domain/budget/service/budget/BudgetQueryServiceImpl.java

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import com.server.money_touch.domain.budget.enums.CategoryType;
88
import com.server.money_touch.domain.budget.repository.budget.BudgetRepository;
99
import com.server.money_touch.domain.budget.repository.budgetCategory.BudgetCategoryRepository;
10-
import com.server.money_touch.domain.consumptionRecord.entity.TotalConsumption;
10+
import com.server.money_touch.domain.consumptionRecord.repository.consumptionRecord.ConsumptionRecordRepository;
1111
import com.server.money_touch.domain.consumptionRecord.repository.totalConsumption.TotalConsumptionRepository;
1212
import com.server.money_touch.domain.user.entity.User;
1313
import com.server.money_touch.domain.user.repository.user.UserRepository;
@@ -35,7 +35,7 @@
3535
public class BudgetQueryServiceImpl implements BudgetQueryService {
3636
private final BudgetRepository budgetRepository;
3737
private final BudgetCategoryRepository budgetCategoryRepository;
38-
private final TotalConsumptionRepository totalConsumptionRepository;
38+
private final ConsumptionRecordRepository consumptionRecordRepository;
3939
private final UserRepository userRepository;
4040

4141
// 예산 존재 여부 검증
@@ -89,29 +89,25 @@ private <T> List<T> convertBudgetCategories(List<BudgetCategory> categories, Fun
8989
}
9090

9191
// 예산 아이디 및 총 소비 금액 조회
92-
@Transactional
92+
@Transactional(readOnly = true)
9393
@Override
9494
public BudgetResponse.TotalConsumptionResultDTO findBudgetByIdAndTotalConsumption(Long userId, Integer year, Integer month) {
9595
User user = userRepository.findById(userId)
9696
.orElseThrow(() -> new ErrorHandler(ErrorStatus.USER_NOT_FOUND));
9797

98-
// 해당 월의 시작일과 종료일 계산
98+
// 예산 조회 기간(예산 id 조회는 기존 로직 유지)
9999
LocalDateTime startOfMonth = LocalDate.of(year, month, 1).atStartOfDay();
100100
LocalDateTime endOfMonth = startOfMonth.plusMonths(1).minusNanos(1);
101101

102-
// 총 소비 금액 조회 (없으면 0으로 처리)
103-
TotalConsumption totalConsumption = totalConsumptionRepository
104-
.findByUserAndCreatedAtBetween(user, startOfMonth, endOfMonth)
105-
.orElse(null);
106-
107-
int totalAmount = (totalConsumption != null) ? totalConsumption.getTotalConsumptionAmount() : 0;
102+
// 총 소비 금액: consumption_record에서 직접 합계
103+
Integer totalAmount = consumptionRecordRepository.sumMonthlyAmountByUser(userId, year, month);
104+
if (totalAmount == null) totalAmount = 0;
108105

109-
// 예산 조회 (없으면 budgetId = null)
110-
// 회원가입 및 1일에 데이터가 생성되기 때문에 createdAt과 updatedAt이 같으면 아직 사용자가 직접 등록하지 않은 예산으로 간주
106+
// 해당 월에 사용자가 직접 등록한 예산 조회
111107
Budget budget = budgetRepository.findRegisteredBudgetInMonthNative(userId, startOfMonth, endOfMonth)
112108
.orElse(null);
113-
114109
Long budgetId = (budget != null) ? budget.getId() : null;
110+
115111
log.info("예산 아이디 및 총 소비 금액 조회 - userId: {}, budgetId: {}", userId, budgetId);
116112
return BudgetConverter.toTotalConsumptionResultDto(budgetId, totalAmount);
117113
}

src/main/java/com/server/money_touch/domain/consumptionRecord/repository/consumptionRecord/ConsumptionRecordRepository.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.server.money_touch.domain.user.entity.User;
55
import org.springframework.data.jpa.repository.JpaRepository;
66
import org.springframework.data.jpa.repository.Query;
7+
import org.springframework.data.repository.query.Param;
78

89
import java.time.LocalDateTime;
910
import java.util.List;
@@ -19,4 +20,19 @@ SELECT cr.consumptionCategory.budgetCategoryName, SUM(cr.amount)
1920
WHERE cr.user = :user AND cr.consumeDate BETWEEN :start AND :end
2021
GROUP BY cr.consumptionCategory.budgetCategoryName """)
2122
List<Object[]> findCategorySpendingBetween(User user, LocalDateTime start, LocalDateTime end);
23+
24+
// 이번 달 총 소비 금액 조회
25+
@Query(
26+
value = "SELECT COALESCE(SUM(amount), 0) " +
27+
"FROM consumption_record " +
28+
"WHERE user_id = :userId " +
29+
"AND MONTH(consume_date) = :month " +
30+
"AND YEAR(consume_date) = :year",
31+
nativeQuery = true
32+
)
33+
Integer sumMonthlyAmountByUser(
34+
@Param("userId") Long userId,
35+
@Param("year") Integer year,
36+
@Param("month") Integer month
37+
);
2238
}

src/main/java/com/server/money_touch/domain/consumptionRecord/service/ConsumptionRecordCommandServiceImpl.java

Lines changed: 2 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ public class ConsumptionRecordCommandServiceImpl implements ConsumptionRecordCom
3333
private final ConsumptionRecordRepository consumptionRecordRepository;
3434
private final ConsumptionCategoryRepository consumptionCategoryRepository;
3535
private final UserRepository userRepository;
36-
private final TotalConsumptionRepository totalConsumptionRepository;
3736

3837
// 일일 소비 기록 등록
3938
@Transactional
@@ -51,18 +50,6 @@ public ConsumptionRecordResponse.ConsumptionRecordCreateResultDTO saveDailyConsu
5150
ConsumptionRecord dailyConsumptionRecord = ConsumptionRecordConverter.toDailyConsumptionRecord(user, consumptionCategory, request, false);
5251
consumptionRecordRepository.save(dailyConsumptionRecord);
5352

54-
// 4-1. 현재 연도와 월 기준으로 월 시작일과 종료일 계산
55-
LocalDateTime startOfMonth = LocalDate.now().withDayOfMonth(1).atStartOfDay();
56-
LocalDateTime endOfMonth = startOfMonth.plusMonths(1).minusNanos(1);
57-
58-
// 4-2. 해당 월의 총 소비 금액 조회, 데이터가 없다면 생성
59-
TotalConsumption totalConsumption = totalConsumptionRepository
60-
.findByUserAndCreatedAtBetween(user, startOfMonth, endOfMonth)
61-
.orElseGet(() -> totalConsumptionRepository.save(TotalConsumptionConverter.toTotalConsumption(user)));
62-
63-
// 4-3. 소비 금액 추가
64-
totalConsumption.updateAddTotalConsumptionAmount(request.getAmount());
65-
6653
Long consumptionRecordId = dailyConsumptionRecord.getId();
6754
log.info("일일 소비 기록 등록 완료: userId: {}, consumptionRecordId: {}", userId, consumptionRecordId);
6855
return ConsumptionRecordConverter.toConsumptionRecordCreateResultDTO(consumptionRecordId);
@@ -84,19 +71,7 @@ public void updateDailyConsumptionRecord(Long userId, Long consumptionRecordId,
8471
ConsumptionCategory consumptionCategory = consumptionCategoryRepository.findByUserAndBudgetCategoryName(user, request.getCategoryName())
8572
.orElseThrow(() -> new ErrorHandler(ErrorStatus.CONSUMPTION_CATEGORY_NAME_NOT_FOUND));
8673

87-
// 4-1. 현재 연도와 월 기준으로 월 시작일과 종료일 계산
88-
LocalDateTime startOfMonth = LocalDate.now().withDayOfMonth(1).atStartOfDay();
89-
LocalDateTime endOfMonth = startOfMonth.plusMonths(1).minusNanos(1);
90-
91-
// 4-2. 해당 월의 총 소비 금액 조회, 데이터가 없다면 에러
92-
TotalConsumption totalConsumption = totalConsumptionRepository
93-
.findByUserAndCreatedAtBetween(user, startOfMonth, endOfMonth)
94-
.orElseThrow(() -> new IllegalArgumentException("총 소비 정보가 존재하지 않습니다. 관리자에게 문의해 주세요."));
95-
96-
// 4-3. 총 소비 금액 수정
97-
totalConsumption.updateTotalConsumptionAmount(consumptionRecord.getAmount(), request.getAmount());
98-
99-
// 5. 일일 소비 기록 수정
74+
// 4. 일일 소비 기록 수정
10075
consumptionRecord.updateDailyConsumptionRecord(consumptionCategory, request.getAmount(), request.getContent(),request.getMemo(), request.getConsumeDate());
10176

10277
log.info("일일 소비 기록 수정 완료 - userId: {}, consumptionRecordId: {}", userId, consumptionRecordId);
@@ -114,19 +89,7 @@ public void deleteDailyConsumptionRecord(Long userId, Long consumptionRecordId)
11489
ConsumptionRecord consumptionRecord = consumptionRecordRepository.findById(consumptionRecordId)
11590
.orElseThrow(() -> new ErrorHandler(ErrorStatus.CONSUMPTION_RECORD_NOT_FOUND));
11691

117-
// 3-1. 현재 연도와 월 기준으로 월 시작일과 종료일 계산
118-
LocalDateTime startOfMonth = LocalDate.now().withDayOfMonth(1).atStartOfDay();
119-
LocalDateTime endOfMonth = startOfMonth.plusMonths(1).minusNanos(1);
120-
121-
// 3-2. 해당 월의 총 소비 금액 조회, 데이터가 없다면 에러
122-
TotalConsumption totalConsumption = totalConsumptionRepository
123-
.findByUserAndCreatedAtBetween(user, startOfMonth, endOfMonth)
124-
.orElseThrow(() -> new IllegalArgumentException("총 소비 정보가 존재하지 않습니다. 관리자에게 문의해 주세요."));
125-
126-
// 3-3. 총 소비 금액 차감
127-
totalConsumption.updateSubstractTotalConsumptionAmount(consumptionRecord.getAmount());
128-
129-
// 6. 소비 기록 삭제
92+
// 3. 소비 기록 삭제
13093
consumptionRecordRepository.delete(consumptionRecord);
13194

13295
log.info("일일 소비 기록 삭제 완료 - userId: {}, consumptionRecordId: {}", userId, consumptionRecordId);

src/main/java/com/server/money_touch/domain/consumptionRecord/service/ConsumptionRecordServiceImpl.java

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -87,18 +87,6 @@ public ConsumptionRecordResponse.ConsumptionRecordCreateResultDTO createConsumpt
8787
consumptionRecordImageRepository.save(image);
8888
}
8989

90-
// 4-1. 현재 연도와 월 기준으로 월 시작일과 종료일 계산
91-
LocalDateTime startOfMonth = LocalDate.now().withDayOfMonth(1).atStartOfDay();
92-
LocalDateTime endOfMonth = startOfMonth.plusMonths(1).minusNanos(1);
93-
94-
// 4-2. 해당 월의 총 소비 금액 조회, 데이터가 없다면 생성
95-
TotalConsumption totalConsumption = totalConsumptionRepository
96-
.findByUserAndCreatedAtBetween(user, startOfMonth, endOfMonth)
97-
.orElseGet(() -> totalConsumptionRepository.save(TotalConsumptionConverter.toTotalConsumption(user)));
98-
99-
// 4-3. 소비 금액 추가
100-
totalConsumption.updateAddTotalConsumptionAmount(request.getAmount());
101-
10290
return new ConsumptionRecordResponse.ConsumptionRecordCreateResultDTO(record.getId());
10391

10492
}

src/main/java/com/server/money_touch/domain/fixedConsumption/service/FixedConsumptionSchedulerService.java

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ public class FixedConsumptionSchedulerService {
3636
private final FixedConsumptionRepository fixedConsumptionRepository;
3737
private final ConsumptionCategoryRepository consumptionCategoryRepository;
3838
private final ConsumptionRecordRepository consumptionRecordRepository;
39-
private final TotalConsumptionRepository totalConsumptionRepository;
4039
private final BudgetCommandService budgetCommandService;
4140

4241
/**
@@ -61,26 +60,18 @@ public void registerFixedConsumptionsToRecords() {
6160
public void processUserFixedConsumption(User user) {
6261
try {
6362
LocalDateTime startOfMonth = LocalDate.now().withDayOfMonth(1).atStartOfDay();
64-
LocalDateTime endOfMonth = startOfMonth.plusMonths(1).minusNanos(1);
6563

6664
// 1. Budget, 기본 ConsumptionCategory 테이블 조회 or 생성
6765
Budget budget = budgetCommandService.createOrFindBudgetForMonth(user);
6866
budgetCommandService.saveCategoryBudgetsByType(null, user, budget, CategoryType.DEFAULT);
6967

70-
// 2. TotalConsumption 조회 or 생성
71-
TotalConsumption totalConsumption = totalConsumptionRepository
72-
.findByUserAndCreatedAtBetween(user, startOfMonth, endOfMonth)
73-
.orElseGet(() -> totalConsumptionRepository.save(
74-
TotalConsumptionConverter.toTotalConsumption(user))
75-
);
76-
77-
// 3. 기본 ConsumptionCategory 목록 불러오기 (카테고리 이름 기준 매핑)
68+
// 2. 기본 ConsumptionCategory 목록 불러오기 (카테고리 이름 기준 매핑)
7869
Map<String, ConsumptionCategory> categoryMap = consumptionCategoryRepository
7970
.findAllByUserAndBudgetCategoryType(user, CategoryType.DEFAULT)
8071
.stream()
8172
.collect(Collectors.toMap(ConsumptionCategory::getBudgetCategoryName, c -> c));
8273

83-
// 4~6. 고정비 목록을 기반으로 소비 기록 생성 및 저장 + TotalConsumption 반영
74+
// 3. 고정비 목록을 기반으로 소비 기록 생성 및 저장 + TotalConsumption 반영
8475
fixedConsumptionRepository.findAllByUser(user).stream()
8576
.map(fc -> {
8677
String categoryName = fc.getCategoryName();
@@ -92,11 +83,6 @@ public void processUserFixedConsumption(User user) {
9283

9384
// 소비 기록 생성
9485
ConsumptionRecord record = ConsumptionRecordConverter.toConsumptionRecordForFix(user, category, fc, startOfMonth);
95-
96-
// TotalConsumption 금액 반영
97-
totalConsumption.updateAddTotalConsumptionAmount(fc.getFixedConsumptionAmount());
98-
totalConsumptionRepository.save(totalConsumption); // 명시적 저장
99-
10086
return record;
10187
})
10288
.filter(Objects::nonNull)

src/main/java/com/server/money_touch/domain/user/service/user/AuthService.java

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ public class AuthService {
3939
private final PasswordEncoder passwordEncoder;
4040
private final UserQueryService userQueryService;
4141
private final BudgetCommandService budgetCommandService;
42-
private final TotalConsumptionRepository totalConsumptionRepository;
4342

4443
public UserResponse.OAuthLoginResultDTO oAuthLogin(String accessCode, String redirectUrl,HttpServletResponse httpServletResponse) {
4544
// 1. access token 요청 시 동적 redirectUri 전달
@@ -62,16 +61,9 @@ public UserResponse.OAuthLoginResultDTO oAuthLogin(String accessCode, String red
6261

6362
// ✅ 신규 가입자에 대해서만 예산 및 소비 생성
6463
if (isNewUser) {
65-
LocalDateTime startOfMonth = LocalDate.now().withDayOfMonth(1).atStartOfDay();
66-
LocalDateTime endOfMonth = startOfMonth.plusMonths(1).minusNanos(1);
67-
64+
// Budget, 기본 ConsumptionCategory 테이블 조회 or 생성
6865
Budget budget = budgetCommandService.createOrFindBudgetForMonth(user);
6966
budgetCommandService.saveCategoryBudgetsByType(null, user, budget, CategoryType.DEFAULT);
70-
71-
totalConsumptionRepository.findByUserAndCreatedAtBetween(user, startOfMonth, endOfMonth)
72-
.orElseGet(() -> totalConsumptionRepository.save(
73-
TotalConsumptionConverter.toTotalConsumption(user))
74-
);
7567
}
7668

7769
// 1. User를 기반으로 CustomUserDetails 생성

src/main/java/com/server/money_touch/domain/user/service/user/UserCommandServiceImpl.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -104,20 +104,10 @@ public UserResponse.UserCreateResultDTO signUpLocal(UserRequest.LocalSignUpDTO r
104104
// 약관 동의 처리
105105
processAgreements(savedUser, request.getAgreeTerms());
106106

107-
LocalDateTime startOfMonth = LocalDate.now().withDayOfMonth(1).atStartOfDay();
108-
LocalDateTime endOfMonth = startOfMonth.plusMonths(1).minusNanos(1);
109-
110-
// 1. Budget, 기본 ConsumptionCategory 테이블 조회 or 생성
107+
// Budget, 기본 ConsumptionCategory 테이블 조회 or 생성
111108
Budget budget = budgetCommandService.createOrFindBudgetForMonth(user);
112109
budgetCommandService.saveCategoryBudgetsByType(null, user, budget, CategoryType.DEFAULT);
113110

114-
// 2. TotalConsumption 조회 or 생성
115-
TotalConsumption totalConsumption = totalConsumptionRepository
116-
.findByUserAndCreatedAtBetween(user, startOfMonth, endOfMonth)
117-
.orElseGet(() -> totalConsumptionRepository.save(
118-
TotalConsumptionConverter.toTotalConsumption(user))
119-
);
120-
121111
log.info("로컬 회원가입 완료 - userId: {}", savedUser.getId());
122112

123113
return UserResponse.UserCreateResultDTO.builder()

0 commit comments

Comments
 (0)