Skip to content

Commit a557f25

Browse files
committed
fix: prevent race condition
1 parent f55bbd3 commit a557f25

File tree

1 file changed

+22
-24
lines changed

1 file changed

+22
-24
lines changed

internal/web/handlers.go

Lines changed: 22 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -284,35 +284,33 @@ func (h *APIHandler) EmailHandler(w http.ResponseWriter, r *http.Request) {
284284
http.Error(w, "필수 필드가 누락되었습니다.", http.StatusBadRequest)
285285
return
286286
}
287+
go func(recipients []RecipientInfo) {
288+
for _, rec := range recipients {
289+
data := map[string]interface{}{
290+
"name": rec.Name,
291+
"email": rec.Email,
292+
"year": time.Now().Year(),
293+
}
287294

288-
successCount := 0
289-
// 각 수신자에 대해 템플릿 렌더링 후 개별 이메일 발송
290-
for _, rec := range reqData.Recipient {
291-
// 템플릿 내 플레이스홀더에 사용할 데이터 (예: {{.name}}, {{.email}}, {{.year}})
292-
data := map[string]interface{}{
293-
"name": rec.Name,
294-
"email": rec.Email,
295-
"year": time.Now().Year(),
296-
}
297-
298-
body, err := h.TemplateManager.RenderTemplate(reqData.Template, data)
299-
if err != nil {
300-
log.Printf("템플릿 렌더링 실패 (%s): %v", rec.Email, err)
301-
continue
302-
}
303-
304-
go func() {
305-
if err := h.SMTPClient.SendEmail([]string{rec.Email}, reqData.Subject, body); err != nil {
306-
log.Printf("이메일 발송 실패 (%s): %v", rec.Email, err)
307-
return
295+
body, err := h.TemplateManager.RenderTemplate(reqData.Template, data)
296+
if err != nil {
297+
log.Printf("템플릿 렌더링 실패 (%s): %v", rec.Email, err)
298+
continue
299+
}
300+
for i := 0; i < 10; i++ {
301+
time.Sleep(10 * time.Second)
302+
if err := h.SMTPClient.SendEmail([]string{rec.Email}, reqData.Subject, body); err != nil {
303+
log.Printf("이메일 발송 실패 (%s): %v", rec.Email, err)
304+
continue
305+
}
306+
break
308307
}
309308
log.Printf("이메일 발송 성공 (%s)", rec.Email)
310-
}()
311-
successCount++
312-
}
309+
}
310+
}(reqData.Recipient)
313311

314312
response := map[string]interface{}{
315-
"message": fmt.Sprintf("총 %d명의 수신자에게 이메일 발송에 성공했습니다.", successCount),
313+
"message": fmt.Sprintf("총 %d명의 수신자에게 이메일을 발송합니다.", len(reqData.Recipient)),
316314
}
317315
w.Header().Set("Content-Type", "application/json")
318316
_ = json.NewEncoder(w).Encode(response)

0 commit comments

Comments
 (0)