REST API 사용시 http 400 오류 발생

안녕하세요?

현재 카카오에서 제공하는 REST 를 이용하여 푸시를 잘 사용하고 있습니다.
회사에서 아마도 하루에 몇만건 정도의 푸시를 고객에게 서비스하고 있는데요

누락되는 푸시가 있다는 얘기에 로깅을 강화해서 확인해보니
중간 중간 400 오류를 리턴하는 푸시가 발생하고 있네요
지금도 약 20여분 동안에 20여건 정도가 오류 발생했습니다.

자동화된 시스템에서 발송하는데
무슨 이유로 저런 오류가 발생하는걸까요?

푸시에 사용하는 KEY 자체는 이전에 근무하시던 개발자 분이 등록한거구요
제가 어떤 정보를 드려야 자세한 내용을 알아볼 수 있는지 알려주세요

감사합니다.

====================================
추가.
로그를 분석하며 테스트를 해보니 이상한 점이 있습니다.

동일 메시지를 1명에게만 보내면 400 오류인데
2명 이상에게 보내면 정상으로 처리됩니다.

그럼
1명에게만 전송하면 모두 오류이냐…
이것도 아닙니다. 대부분은 정상처리됩니다.
더 궁금하고 난감하네요

@개발자22730 아마도 초당 컨트롤에 걸린 케이스가 아닐까 예상하고 있는데요, 400 에러 발생시 response body로 해당 이유를 같이 전송하고 있어요. 그 error를 한번 봐 주시겠어요?

1개의 좋아요

네… 감사합니다.
전송 건수와는 상관이 없는듯 해요
초당 몇백건씩 나갈때나 몇분에 한건 나갈때 상관없이 발생하거든요.
규칙은 있어요… 항상 수신자가 1명일때만 발생하네요.

카카오는 응답 메시지가 없다고 개발가이드 문서에서 봤는데 오류는 있나요?
말씀대로 response 를 로깅해봤는데 exception 발생하네요

KakaoPush.post(line:162) :: ##### output : {push_message={“for_gcm”:{“custom_field”:{“sPushCode”:“SS”,“sPushSect”:“SB”,“sCode”:“017810”,“sDateTime”:“20161116090020”,“sPushSN”:“1219805”},“delay_while_idle”:false,“collapse”:“1219805”}}, uuids=[11395]}
KakaoPush.printStackTrace(line:197) :: Server returned HTTP response code: 400 for URL: https://kapi.kakao.com/v1/push/send
KakaoPush.printStackTrace(line:199) :: sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
KakaoPush.printStackTrace(line:199) :: sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)

KakaoPush.printStackTrace(line:199) :: java.lang.Thread.run(Thread.java:745)
KakaoPush.send(line:113) :: POST response code : 400

@개발자22730 넵. error 발생시에 error message와 code가 나와요. 고 response 바디의 내용이 필요해요.

오류 코드 수신시에 소켓을 읽으면 exception 이 발생합니다.
위에 로그도 같은 오류에 대한 로그입니다.

exception이 발생하는데 어떻게 바디를 읽을수 있죠?
제가 뭔가 잘못하고 있나요?

connection.setRequestMethod("POST");
connection.setRequestProperty(_kakaoApiHeader, _kakaoApiAdminKey);
connection.setDoOutput(true);

out = new OutputStreamWriter(connection.getOutputStream());
out.write(outParameter);
out.flush();
out.close();

int responseCode = connection.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_OK) {
	_logger.error("#### Socket output : {}", parameterMap.toString());

	BufferedReader reader = null;
	reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
	StringBuffer strResponse = new StringBuffer("");
	String line = "";

	while ((line = reader.readLine()) != null) {
		strResponse.append(line).append(System.getProperty("line.separator"));
	}
	reader.close();
}

http status가 200 OK(HTTP_OK)가 아닐것이고, 이 경우는 connection.getErrorStream() 을 통해 read를 해야 하지 않을까 살짝 추측해 보아요. 해당 connection이 어떤 class인지는 모르지만요.

HttpURLConnection 을 사용하신다면 해당 sample을 구글링 해보시면 예제들이 많이 나올것 같아요.