55import com .blockguard .server .domain .analysis .dto .request .GptRequest ;
66import com .blockguard .server .domain .analysis .dto .response .FraudAnalysisResponse ;
77import com .blockguard .server .domain .analysis .dto .response .GptResponse ;
8- import com .blockguard .server .global .common .codes .ErrorCode ;
9- import com .blockguard .server .global .exception .BusinessExceptionHandler ;
8+ import com .blockguard .server .infra .gpt .GptApiClient ;
109import com .blockguard .server .infra .ocr .NaverOcrClient ;
11- import lombok .AllArgsConstructor ;
1210import lombok .RequiredArgsConstructor ;
1311import lombok .extern .slf4j .Slf4j ;
14- import org .springframework .beans .factory .annotation .Value ;
15- import org .springframework .http .*;
1612import org .springframework .stereotype .Service ;
1713import org .springframework .util .StringUtils ;
18- import org .springframework .web .client .RestClientException ;
19- import org .springframework .web .client .RestTemplate ;
2014import org .springframework .web .multipart .MultipartFile ;
2115
2216import java .io .IOException ;
2923public class FraudAnalysisService {
3024
3125 private final NaverOcrClient naverOcrClient ;
32- private final RestTemplate restTemplate ;
33-
34- @ Value ("${ai.server.url}" )
35- private String aiBaseUrl ;
26+ private final GptApiClient gptApiClient ;
3627
3728 public FraudAnalysisResponse fraudAnalysis (FraudAnalysisRequest fraudAnalysisRequest , List <MultipartFile > imageFiles ) {
3829 List <String > keywords = new ArrayList <>();
@@ -44,36 +35,17 @@ public FraudAnalysisResponse fraudAnalysis(FraudAnalysisRequest fraudAnalysisReq
4435
4536 GptRequest gptRequest = buildGptRequest (fraudAnalysisRequest , keywords , additionalDescription , imageContent );
4637
47- try {
48- HttpHeaders headers = new HttpHeaders ();
49- headers .setContentType (MediaType .APPLICATION_JSON );
50-
51- HttpEntity <GptRequest > entity = new HttpEntity <>(gptRequest , headers );
52- ResponseEntity <GptResponse > response = restTemplate .postForEntity (
53- aiBaseUrl ,
54- entity ,
55- GptResponse .class
56- );
57-
58- if (response .getBody () == null || !response .getStatusCode ().is2xxSuccessful ()) {
59- log .error ("AI 서버 응답 오류: status={}, body={}" , response .getStatusCode (), response .getBody ());
60- throw new BusinessExceptionHandler (ErrorCode .AI_SERVER_ERROR );
61- }
38+ // ai 서버 호출
39+ GptResponse gptResponse = gptApiClient .analyze (gptRequest );
6240
63- double score = response .getBody ().getScore ();
64- return FraudAnalysisResponse
65- .builder ()
66- .keywords (response .getBody ().getKeywords ())
67- .score (response .getBody ().getScore ())
68- .estimatedFraudType (response .getBody ().getEstimatedFraudType ())
69- .explanation (response .getBody ().getExplanation ())
70- .riskLevel (RiskLevel .fromScore (score ).getValue ())
71- .build ();
72-
73- } catch (RestClientException e ){
74- log .error ("AI 서버 통신 실패: {}" , e .getMessage ());
75- throw new BusinessExceptionHandler (ErrorCode .AI_SERVER_ERROR );
76- }
41+ double score = gptResponse .getScore ();
42+ return FraudAnalysisResponse .builder ()
43+ .keywords (gptResponse .getKeywords ())
44+ .score (gptResponse .getScore ())
45+ .estimatedFraudType (gptResponse .getEstimatedFraudType ())
46+ .explanation (gptResponse .getExplanation ())
47+ .riskLevel (RiskLevel .fromScore (score ).getValue ())
48+ .build ();
7749 }
7850
7951 private String extractOcrText (List <MultipartFile > imageFiles ) {
0 commit comments