-
[에러] broken pipe 에러Health-Genie 2023. 12. 20. 09:53728x90
[ 현재 상황 ]
univcert api 적용중 broken pipe에러 발생에 의한 socket read timeout exception 발생
broken pipe 에러 [ 에러 이유 ]
잦은 입출력 호출로 발생한다.
두 개의 소켓(sender, receiver )중에서 receiver가 송신 받은 데이터를 처리하지 못하여 sender가 계속 보내는 경우에 발생한다.
[ 해결 방법 및 코드 변화 ]
서버에서는 client 동작에서 발생하는 에러를 막을 수 없기에 exceptionhandler를 통한 해결이 대표적이다
그 외의 방법으로는 중복 요청 막기 , client의 request 후에 server의 response이 올때까지 기다리게 하는 방법들이 있다.
기존 코드
@Transactional public Map<String, Object> certify(String key, String email, String universityName) throws IOException{ String url = "http://localhost:1234/auth/mail/send"; Request.Builder builder = new Request.Builder().url(url).get(); JSONObject postObj = new JSONObject(); postObj.put("key", key); postObj.put("email", email); postObj.put("universityName", universityName); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), postObj.toJSONString()); builder.post(requestBody); Request request = builder.build(); Response responseHTML = client.newCall(request).execute(); return parseHTMLToJSON(responseHTML); }
1차 수정한 코드
@Transactional public Map<String, Object> certify(String key, String email, String universityName) throws IOException{ String url = baseURL + "/v1/certify"; Request.Builder builder = new Request.Builder().url(url).get(); JSONObject postObj = new JSONObject(); postObj.put("key", key); postObj.put("email", email); postObj.put("universityName", universityName); RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), postObj.toJSONString()); builder.post(requestBody); Request request = builder.build(); Response responseHTML = client.newCall(request).execute(); return parseHTMLToJSON(responseHTML); }
처음에 문제가 url을 api제공측에서 지정한바를 따라야 하는데, local로 지정해서 생긴 문제였습니다.
하지만, parsing된걸 보니까 Internal server error가 났습니다.
2차 수정한 코드
@PostMapping("/send") public JSONObject sendUnivCertMail(@RequestBody MailRequestDto dto) throws IOException { boolean univ_check = false; Map<String,Object> check = UnivCert.check(dto.getUnivName()); if((boolean) check.get("success")) univ_check = true; Map<String, Object> response = UnivCert.certify(KEY, dto.getUniv_email(), dto.getUnivName(), univ_check); return new JSONObject(response); }
1차 수정 코드를 UnivCert인데, 해당 클래스를 import해와서 1차에서 발생했던 server 에러를 해결했다.
[ 참조 ]
'Health-Genie' 카테고리의 다른 글
[에러] JSON parse error (2) 2024.01.06 [이메일] univCert api를 사용한 대학 이메일 인증 (2) 2023.12.21 [postman] api 문서 만들기 (2) 2023.12.11 [타입 고민] 엔티티에 정수 타입으로 Int VS Integer (1) 2023.12.08 [테스트코드] isEqualTo() VS isSameAs() (0) 2023.12.05