Post

Ajax 사용 시 데이터가 짤린다면?: 새로고침을 의심해보자

Ajax 로 request 보낼 때 주의 할 점!


토이 프로젝트로 만든 django 프로젝트가 있다. 그 프로젝트는 이메일 내용을 받아 엄청 다수의 사람들에게 이메일을 보내는 일을 한다. 이런 프로젝트를 왜 만들었냐면 사내 메일 보내기 시스템에는 최대 5백명까지 수신인이 지정이 되는데 이는 Q&A 플랫폼 회원수(5만명)에 한참 미치지 못하기 때문이다

그 프로젝트 안에 이런 Java script 코드가 있다. 작성한 Email Content, Title, Receiver, Sender 를 긁어와서 $.post 로 다시 django 에게 요청을 보낸다. 그리고 그 요청이후 window.location.href = "/"; 을 하여 메인페이지로 온다.

1
2
3
4
5
6
7
8
9
let data = {
	content: content,
	title: title,
	...
};
$.post(url, data, function(response) {
	alert(response);
});
window.location.href = "/";

그런데 아주 큰 문제가 있었다. content 사이즈가 커지면 커질수록 어쩔땐 django 에서 body 를 다 받고 어쩔땐 몇개를 누락하는 것이다! 이건 content 사이즈가 늘면 늘수록 더 자주 그랬다. 이럴수가… 나는 처음에 사내 방화벽을 의심했었지만 결론은 나의 실수였다 !!!!

문제가 뭐였을까 ?


요청을 보내고 바로 새로고침을 하면 request 의 data 가 잘려버린다…. 진짜 처음 알았다. 따라서 새로고침을 없앴다. 그런데 사용자가 이메일이 전부 다 보내질때까지 기다릴수는 없었다… 왜냐면 10초에 200명씩 보내는것이라 5만명을 다 기다릴수는 없었기 때문이다 따라서 django 에서 reqeust 를 받으면 이메일 보내는 동작을 시작한 뒤에 바로 response 를 return 해 주었다!

1
2
3
p = multiprocessing.Process(target=send_mail, args=(content, title, receiver, sender,))
p.start()
return

그리고 js 코드도 이렇게 수정 하였다.

1
2
3
4
5
6
7
8
let data = {
	content: content,
	title: title,
	...
};
$.post(url, data, function(response) {
	alert(response);
});

아예 새로고침을 없애버리니 드디어 모든 문제가 해결 되었다!

This post is licensed under CC BY 4.0 by the author.

© 병욱. Some rights reserved.