From 336c1d39c27209e059ba8196d728f362b4cb415a Mon Sep 17 00:00:00 2001 From: yeonjae02 <0yeonjae2@naver.com> Date: Mon, 27 Oct 2025 15:46:39 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20AI=20=EC=9D=91=EB=8B=B5=20=EB=B3=B5?= =?UTF-8?q?=ED=98=B8=ED=99=94=20=EC=A0=84=20=20=EC=9C=A0=ED=9A=A8=EC=84=B1?= =?UTF-8?q?=20=EA=B2=80=EC=82=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/service/MyAccountService.java | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/howWeather/howWeather_backend/domain/member/service/MyAccountService.java b/src/main/java/com/howWeather/howWeather_backend/domain/member/service/MyAccountService.java index c987e14..3c49278 100644 --- a/src/main/java/com/howWeather/howWeather_backend/domain/member/service/MyAccountService.java +++ b/src/main/java/com/howWeather/howWeather_backend/domain/member/service/MyAccountService.java @@ -303,10 +303,26 @@ private Map encryptPredictionData(List d @Transactional public void saveRecommendationsInternal(Map encryptedData, String newRegionName) { - if (encryptedData == null || encryptedData.isEmpty()) return; + if (encryptedData == null || encryptedData.isEmpty()) { + log.warn("[추천 데이터 처리 중단] 전달된 데이터 맵이 null이거나 비어있습니다."); + return; + } + + if (!encryptedData.containsKey("iv") || !encryptedData.containsKey("payload")) { + log.warn("[추천 데이터 처리 중단] AI 응답 Map에 복호화에 필요한 'iv' 또는 'payload' 키가 없습니다. 응답: {}", encryptedData); + return; + } + + String iv = encryptedData.get("iv"); + String payload = encryptedData.get("payload"); + if (iv == null || iv.isBlank() || payload == null || payload.isBlank()) { + log.warn("[추천 데이터 처리 중단] AI 응답 Map의 'iv' 또는 'payload' 값이 null이거나 비어있습니다. 응답: {}", encryptedData); + return; + } try { String decryptedJson = aesCipher.decrypt(encryptedData); + if (decryptedJson.startsWith("\"") && decryptedJson.endsWith("\"")) { decryptedJson = objectMapper.readValue(decryptedJson, String.class); } @@ -330,6 +346,7 @@ public void saveRecommendationsInternal(Map encryptedData, Strin } log.info("[추천 데이터 저장 완료] memberId={}", member.getId()); + recommendationRepository.flush(); entityManager.clear(); } else { @@ -337,9 +354,9 @@ public void saveRecommendationsInternal(Map encryptedData, Strin recommendationRepository.findByMemberIdAndDate(member.getId(), LocalDate.now()); if (!existingData.isEmpty()) { - for (ClothingRecommendation rec : existingData) { Map updatedPrediction = new HashMap<>(rec.getPredictionMap()); + ClothingRecommendation updatedEntity = ClothingRecommendation.builder() .id(rec.getId()) .memberId(rec.getMemberId()) @@ -356,12 +373,17 @@ public void saveRecommendationsInternal(Map encryptedData, Strin entityManager.clear(); log.info("[기존 데이터 지역명 업데이트 완료] memberId={}", member.getId()); + } else { + log.info("[기존 데이터 없음] AI 결과가 비어있고 업데이트할 기존 데이터도 없습니다. memberId={}", member.getId()); } } } + } catch (CustomException e) { + log.error("[추천 데이터 처리 실패] KNOWN_ERROR - memberId={} message={}", encryptedData.get("userId"), e.getMessage(), e); + throw e; } catch (Exception e) { - log.error("[추천 데이터 처리 실패] message={}", e.getMessage(), e); + log.error("[추천 데이터 처리 실패] UNKNOWN_ERROR - message={}", e.getMessage(), e); throw new CustomException(ErrorCode.UNKNOWN_ERROR, "지역명 업데이트 중 오류가 발생했습니다."); } }