Skip to content

Commit 8485a26

Browse files
authored
Merge pull request #169 from Myaongi/bug/#167
bug/#167: 디버깅을 위한 로그 추가
2 parents 4d12bbf + bdebff8 commit 8485a26

1 file changed

Lines changed: 117 additions & 45 deletions

File tree

src/main/java/Myaong/Gangajikimi/postlost/service/PostLostCommandService.java

Lines changed: 117 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)