@@ -60,6 +60,33 @@ public PostLost postPostLost(PostLostRequest request, Member member, List<Multip
6060 // 실제 이미지와 AI 이미지 중 하나는 무조건 들어옴 (프론트엔드에서 보장)
6161 boolean hasRealImages = (images != null && !images .isEmpty ());
6262 boolean hasAiImage = (aiImage != null && !aiImage .isEmpty ());
63+
64+ log .info ("[이미지 초기 체크] images null: {}, images empty: {}, images size: {}, aiImage null: {}, aiImage empty: {}" ,
65+ images == null ,
66+ images != null && images .isEmpty (),
67+ images != null ? images .size () : 0 ,
68+ aiImage == null ,
69+ aiImage != null && aiImage .isEmpty ());
70+
71+ if (aiImage != null ) {
72+ log .info ("[AI 이미지 상세 정보] originalFilename: {}, size: {}, contentType: {}, isEmpty: {}" ,
73+ aiImage .getOriginalFilename (),
74+ aiImage .getSize (),
75+ aiImage .getContentType (),
76+ aiImage .isEmpty ());
77+ }
78+
79+ if (images != null && !images .isEmpty ()) {
80+ for (int i = 0 ; i < images .size (); i ++) {
81+ MultipartFile img = images .get (i );
82+ log .info ("[실제 이미지 {}] originalFilename: {}, size: {}, contentType: {}, isEmpty: {}" ,
83+ i ,
84+ img .getOriginalFilename (),
85+ img .getSize (),
86+ img .getContentType (),
87+ img .isEmpty ());
88+ }
89+ }
6390
6491 String processedDogType = request .getDogType ();
6592
@@ -93,28 +120,45 @@ public PostLost postPostLost(PostLostRequest request, Member member, List<Multip
93120 List <String > imageKeyNames ;
94121 String aiImageKeyName ;
95122
123+ // 이미지 분기 체크 로그
124+ log .info ("[이미지 분기 체크 시작] PostLost ID: {}, hasRealImages: {}, hasAiImage: {}" ,
125+ savedPostLost .getId (), hasRealImages , hasAiImage );
126+
96127 // 실제 이미지 또는 AI 이미지 중 하나는 무조건 존재
97128 if (hasAiImage ) {
98- // AI 이미지 업로드
99- aiImageKeyName = s3Service .upload (
100- aiImage ,
101- "postLost" ,
102- savedPostLost .getId ().toString () + "_ai" // postId_ai 형태로 저장
103- );
104- log .info ("[AI 이미지 업로드 완료] AI 이미지 keyName: {}" , aiImageKeyName );
105-
106- savedPostLost .setAiImage (aiImageKeyName );
107-
108- // AI 이미지 임베딩 생성 및 저장
109- generateAndSaveEmbedding (savedPostLost ,
110- aiImage ,
111- processedDogType ,
112- request .getDogColor (),
113- request .getFeatures (),
114- "AI 이미지" ,
115- startTime );
129+ log .info ("[AI 이미지 분기 진입] PostLost ID: {}" , savedPostLost .getId ());
130+ try {
131+ log .info ("[AI 이미지 S3 업로드 시작] PostLost ID: {}, size: {}" , savedPostLost .getId (), aiImage .getSize ());
132+ // AI 이미지 업로드
133+ aiImageKeyName = s3Service .upload (
134+ aiImage ,
135+ "postLost" ,
136+ savedPostLost .getId ().toString () + "_ai" // postId_ai 형태로 저장
137+ );
138+ log .info ("[AI 이미지 업로드 완료] AI 이미지 keyName: {}, 실행 시간: {}ms" ,
139+ aiImageKeyName , System .currentTimeMillis () - startTime );
140+
141+ savedPostLost .setAiImage (aiImageKeyName );
142+
143+ // AI 이미지 임베딩 생성 및 저장
144+ log .info ("[AI 이미지 임베딩 생성 시작] PostLost ID: {}" , savedPostLost .getId ());
145+ generateAndSaveEmbedding (savedPostLost ,
146+ aiImage ,
147+ processedDogType ,
148+ request .getDogColor (),
149+ request .getFeatures (),
150+ "AI 이미지" ,
151+ startTime );
152+ log .info ("[AI 이미지 임베딩 생성 완료] PostLost ID: {}, 실행 시간: {}ms" ,
153+ savedPostLost .getId (), System .currentTimeMillis () - startTime );
154+ } catch (Exception e ) {
155+ log .error ("[AI 이미지 처리 실패] PostLost ID: {}, error: {}" ,
156+ savedPostLost .getId (), e .getMessage (), e );
157+ throw e ;
158+ }
116159
117160 } else if (hasRealImages ) {
161+ log .info ("[실제 이미지 분기 진입] PostLost ID: {}, images count: {}" , savedPostLost .getId (), images .size ());
118162 // 실제 이미지들 업로드
119163 imageKeyNames = images .stream ()
120164 .filter (image -> image != null && !image .isEmpty ()) // null 또는 빈 파일 필터링
@@ -140,23 +184,35 @@ public PostLost postPostLost(PostLostRequest request, Member member, List<Multip
140184
141185 } else {
142186 // 이 경우는 발생하지 않아야 함 (프론트엔드에서 보장)
187+ log .error ("[이미지 없음 예외 발생] PostLost ID: {}, hasRealImages: {}, hasAiImage: {}, images null: {}, aiImage null: {}" ,
188+ savedPostLost .getId (), hasRealImages , hasAiImage , images == null , aiImage == null );
143189 throw new GeneralException (ErrorCode .NO_IMAGE );
144190 }
145191
146192
147193 /**
148194 * 반경 3km 유저들에게 알림 전송
149195 * */
150- notificationService .notifyNearbyUsers (
151- savedPostLost .getId (),
152- request .getLostLatitude (),
153- request .getLostLongitude (),
154- member .getId (),
155- PostType .LOST
156- );
196+ log .info ("[알림 전송 시작] PostLost ID: {}, latitude: {}, longitude: {}" ,
197+ savedPostLost .getId (), request .getLostLatitude (), request .getLostLongitude ());
198+ try {
199+ notificationService .notifyNearbyUsers (
200+ savedPostLost .getId (),
201+ request .getLostLatitude (),
202+ request .getLostLongitude (),
203+ member .getId (),
204+ PostType .LOST
205+ );
206+ log .info ("[알림 전송 완료] PostLost ID: {}, 실행 시간: {}ms" ,
207+ savedPostLost .getId (), System .currentTimeMillis () - startTime );
208+ } catch (Exception e ) {
209+ log .error ("[알림 전송 실패] PostLost ID: {}, error: {}" ,
210+ savedPostLost .getId (), e .getMessage (), e );
211+ // 알림 실패해도 게시글 작성은 성공으로 처리
212+ }
157213
158214 long endTime = System .currentTimeMillis ();
159- log .info ("[PostLost 작성 완료] PostLost ID: {}, 실행 시간: {}ms" , savedPostLost .getId (), (endTime - startTime ));
215+ log .info ("[PostLost 작성 완료] PostLost ID: {}, 전체 실행 시간: {}ms" , savedPostLost .getId (), (endTime - startTime ));
160216
161217 return savedPostLost ;
162218 }
@@ -349,27 +405,43 @@ private void generateAndSaveEmbedding(PostLost postLost,
349405 String features ,
350406 String imageType ,
351407 long startTime ) {
352- log .info ("[임베딩 생성 시작] {} 사용" , imageType );
408+ log .info ("[임베딩 생성 시작] {} 사용, PostLost ID: {}, image size: {}, contentType: {}, originalFilename: {}" ,
409+ imageType , postLost .getId (), image .getSize (), image .getContentType (), image .getOriginalFilename ());
353410
354- EmbeddingResponse embeddingResponse = aiService .generateEmbedding (
355- image ,
356- dogType ,
357- dogColor ,
358- features
359- );
360- log .info ("[FastAPI 임베딩 생성 요청 완료] {} 사용, 실행 시간: {}ms" , imageType , System .currentTimeMillis () - startTime );
361-
362- // 임베딩 생성 성공 시 DB에 저장
363- if (embeddingResponse != null ) {
364- postLostEmbeddingService .saveEmbedding (
365- postLost ,
366- embeddingResponse .imageEmbeddingToArray (), // 이미지 임베딩 벡터
367- embeddingResponse .textEmbeddingToArray () // 텍스트 임베딩 벡터
411+ try {
412+ log .info ("[FastAPI 임베딩 생성 요청 시작] PostLost ID: {}, dogType: {}, dogColor: {}" ,
413+ postLost .getId (), dogType , dogColor );
414+
415+ EmbeddingResponse embeddingResponse = aiService .generateEmbedding (
416+ image ,
417+ dogType ,
418+ dogColor ,
419+ features
368420 );
369- postLost .updateDogInfo (String .join ("\n " , embeddingResponse .getSentences ()));
370- log .info ("[{} 임베딩 저장 완료]" , imageType );
371- } else {
372- log .warn ("[{} 임베딩 생성 실패] embeddingResponse가 null입니다." , imageType );
421+ log .info ("[FastAPI 임베딩 생성 요청 완료] {} 사용, 실행 시간: {}ms" , imageType , System .currentTimeMillis () - startTime );
422+
423+ // 임베딩 생성 성공 시 DB에 저장
424+ if (embeddingResponse != null ) {
425+ log .info ("[임베딩 저장 시작] PostLost ID: {}, imageEmbedding size: {}, textEmbedding size: {}" ,
426+ postLost .getId (),
427+ embeddingResponse .getImage () != null ? embeddingResponse .getImage ().size () : 0 ,
428+ embeddingResponse .getText () != null ? embeddingResponse .getText ().size () : 0 );
429+
430+ postLostEmbeddingService .saveEmbedding (
431+ postLost ,
432+ embeddingResponse .imageEmbeddingToArray (), // 이미지 임베딩 벡터
433+ embeddingResponse .textEmbeddingToArray () // 텍스트 임베딩 벡터
434+ );
435+ postLost .updateDogInfo (String .join ("\n " , embeddingResponse .getSentences ()));
436+ log .info ("[{} 임베딩 저장 완료] PostLost ID: {}, 실행 시간: {}ms" ,
437+ imageType , postLost .getId (), System .currentTimeMillis () - startTime );
438+ } else {
439+ log .warn ("[{} 임베딩 생성 실패] embeddingResponse가 null입니다. PostLost ID: {}" , imageType , postLost .getId ());
440+ }
441+ } catch (Exception e ) {
442+ log .error ("[{} 임베딩 생성 중 예외 발생] PostLost ID: {}, error: {}" ,
443+ imageType , postLost .getId (), e .getMessage (), e );
444+ throw e ;
373445 }
374446 }
375447
0 commit comments