From 615506bfdfd7668c225a667a54292b427e143e93 Mon Sep 17 00:00:00 2001 From: yjhss <20211420@sungshin.ac.kr> Date: Thu, 19 Feb 2026 21:11:19 +0900 Subject: [PATCH 1/2] =?UTF-8?q?Fix:=20ConvictionScore,=20FearIndex=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EC=97=86=EC=9D=84=20=EB=95=8C=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EB=8C=80=EC=8B=A0=20=EA=B8=B0=EB=B3=B8=EA=B0=92?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ConvictionScoreServiceImpl.java | 15 +++++--- .../service/FearIndexServiceImpl.java | 35 +++++++++++-------- 2 files changed, 31 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/umc/finly/domain/analysis/association/service/ConvictionScoreServiceImpl.java b/src/main/java/com/umc/finly/domain/analysis/association/service/ConvictionScoreServiceImpl.java index d5d095ac..728e2737 100644 --- a/src/main/java/com/umc/finly/domain/analysis/association/service/ConvictionScoreServiceImpl.java +++ b/src/main/java/com/umc/finly/domain/analysis/association/service/ConvictionScoreServiceImpl.java @@ -3,6 +3,7 @@ import com.umc.finly.domain.analysis.association.converter.ConvictionScoreConverter; import com.umc.finly.domain.analysis.association.dto.response.ConvictionScoreResDTO; import com.umc.finly.domain.analysis.association.entity.ConvictionScoreResult; +import com.umc.finly.domain.analysis.association.enums.Status; import com.umc.finly.domain.analysis.association.exception.code.ConvictionScoreErrorCode; import com.umc.finly.domain.analysis.association.exception.ConvictionScoreException; import com.umc.finly.domain.analysis.association.repository.ConvictionScoreResultRepository; @@ -29,10 +30,16 @@ public void calculateAndSave(Long memberId, LocalDate start, LocalDate end) { @Override public ConvictionScoreResDTO getConvictionScore(Long memberId) { // 가장 최신 매수 확신도 결과 조회 - ConvictionScoreResult currentResult = convictionScoreResultRepository.findFirstByMemberIdOrderByEndDateDesc(memberId) - .orElseThrow(() -> new ConvictionScoreException(ConvictionScoreErrorCode.CONVICTION_SCORE_NOT_FOUND)); - - return ConvictionScoreConverter.toConvictionScoreResDTO(currentResult.getConvictionScore()); + return convictionScoreResultRepository.findFirstByMemberIdOrderByEndDateDesc(memberId) + .map(currentResult -> + ConvictionScoreConverter.toConvictionScoreResDTO(currentResult.getConvictionScore()) + ) + // 결과 데이터가 없을 경우 기본값 반환 + .orElseGet(() -> ConvictionScoreResDTO.builder() + .convictionScore(0) + .status(Status.LOW) + .phrase("분석을 위해 데이터를 모으는 중이에요") + .build()); } } diff --git a/src/main/java/com/umc/finly/domain/analysis/association/service/FearIndexServiceImpl.java b/src/main/java/com/umc/finly/domain/analysis/association/service/FearIndexServiceImpl.java index 173bd33c..0ca85559 100644 --- a/src/main/java/com/umc/finly/domain/analysis/association/service/FearIndexServiceImpl.java +++ b/src/main/java/com/umc/finly/domain/analysis/association/service/FearIndexServiceImpl.java @@ -3,6 +3,7 @@ import com.umc.finly.domain.analysis.association.converter.FearIndexConverter; import com.umc.finly.domain.analysis.association.dto.response.FearIndexResDTO; import com.umc.finly.domain.analysis.association.entity.FearIndexResult; +import com.umc.finly.domain.analysis.association.enums.ChangeDirection; import com.umc.finly.domain.analysis.association.exception.code.FearIndexErrorCode; import com.umc.finly.domain.analysis.association.exception.FearIndexException; import com.umc.finly.domain.analysis.association.repository.FearIndexResultRepository; @@ -29,20 +30,24 @@ public void calculateAndSave(Long memberId, LocalDate startDate, LocalDate endDa @Override public FearIndexResDTO getFearIndex(Long memberId) { - // 1. 가장 최근에 저장된 분석 결과 조회 - FearIndexResult currentResult = fearIndexResultRepository.findFirstByMemberIdOrderByEndDateDesc(memberId) - .orElseThrow(() -> new FearIndexException(FearIndexErrorCode.FEAR_INDEX_NOT_FOUND)); - - // 2. 해당 결과의 시작일(startDate)을 기준으로 그보다 이전의 마지막 데이터 조회 (변화량 비교용) - int prevScore = fearIndexResultRepository.findFirstByMemberIdAndEndDateBeforeOrderByEndDateDesc( - memberId, currentResult.getStartDate()) - .map(FearIndexResult::getFearIndex) - .orElse(currentResult.getFearIndex()); // 이전 기록 없으면 현재와 동일 처리 - - // 3. 컨버터를 통해 DTO로 변환하여 반환 - return FearIndexConverter.toFearIndexResDTO( - currentResult.getFearIndex(), - prevScore - ); + // 가장 최근 분석 결과 조회 + return fearIndexResultRepository.findFirstByMemberIdOrderByEndDateDesc(memberId) + .map(currentResult -> { + // [결과 데이터가 있는 경우] + // 이전 데이터 조회 로직 진행 + int prevScore = fearIndexResultRepository.findFirstByMemberIdAndEndDateBeforeOrderByEndDateDesc( + memberId, currentResult.getStartDate()) + .map(FearIndexResult::getFearIndex) + .orElse(currentResult.getFearIndex()); // 이전 기록 없으면 현재와 동일 처리 + + return FearIndexConverter.toFearIndexResDTO(currentResult.getFearIndex(), prevScore); + }) + // [결과 데이터가 없는 경우] + .orElseGet(() -> FearIndexResDTO.builder() + .fearIndex(0) + .changeDirection(ChangeDirection.SAME) + .changeValue(0) + .phrase("분석을 위해 데이터를 모으는 중이에요") + .build()); } } From 5706ac7e6b45f0f1aad3fde41c80b0e14ac39e27 Mon Sep 17 00:00:00 2001 From: yjhss <20211420@sungshin.ac.kr> Date: Thu, 19 Feb 2026 22:19:49 +0900 Subject: [PATCH 2/2] =?UTF-8?q?Chore:=20ConvictionScoreServiceImpl=20Trans?= =?UTF-8?q?actional(readOnly=20=3D=20true)=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../analysis/association/service/ConvictionScoreServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/umc/finly/domain/analysis/association/service/ConvictionScoreServiceImpl.java b/src/main/java/com/umc/finly/domain/analysis/association/service/ConvictionScoreServiceImpl.java index 728e2737..eafaa3d1 100644 --- a/src/main/java/com/umc/finly/domain/analysis/association/service/ConvictionScoreServiceImpl.java +++ b/src/main/java/com/umc/finly/domain/analysis/association/service/ConvictionScoreServiceImpl.java @@ -15,6 +15,7 @@ @Service @RequiredArgsConstructor +@Transactional(readOnly = true) public class ConvictionScoreServiceImpl implements ConvictionScoreService { private final ConvictionScoreResultRepository convictionScoreResultRepository;