Spring에서는 Ajax 요청 후 응답을 받고자 하면 보통 컨트롤러에서 해당 메소드에 @ResponseEntity Annotation을 달아놓고 return 으로 반환하면 잘 받는다.

 

하지만 Servlet에는 @ResponseEntity Annotation이 없으니 다르게 리턴해야 했다.

 

요청을 처리 후 결과는 PrintWriter로 처리하면 응답을 보낼 수 있었다.

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
                                             throws ServletException, IOException {
    
    String result = boardService.delete(request);
    
    PrintWriter out = response.getWriter();
    out.print(result);
}

 

자 여기서 문제점.

String 타입으로 응답을 받고자 했고 정상적으로 처리가 된 경우 "success"를 받고 문제가 발생한 경우에는 "fail"을 받고자 했었다.

Ajax에서는 if(result == "success")로 처리를 하고 있었다.

근데 여기서 해당 조건에 걸리질 않았다.

 

ajax에서 console로 찍어봐도 success를 출력하는데 전혀 조건에 걸리질 않았다.

javaScript에서 문자열 비교할 때 다른 방법이 있나 찾아보고 다 해봤지만 하나도 안됐다.

 

문제는 PrintWriter 처리에서 있었다.

out.print(result)로 보내야 했지만 코드를 마저 다 쓰는것이 귀찮았던지라 자동완성으로 out.println(result)를 찍었던것..

 

out.print로 수정하니 정상적으로 잘 체크할 수 있었다.

 

정확하게 아! 이거때문에! 라고 할 순 없지만 아마 내 생각에는

print의 경우 "success"로 넘어왔을 것이고 개행을 하는 println의 경우는 "success\n"으로 넘어와서 그 차이에 비교를 할 수 없었던 것 아닐까 싶다.

 

 

 

정리하는김에 getJSON 요청에 대한 처리도 정리.

jQuery를 통해 getJSON 요청을 보내 데이터를 파싱하고 처리하는 부분이 있었다.

이것 역시 Spring에서는 ResponseEntity로 리턴을 해 쉽게 처리했었다.

Servlet에서는 역시 ResponseEntity가 없다..

 

그럼 이걸 처리하기 위해서는 json으로 변환을 해줘야 할 필요가 있었고, 그 데이터를 보내줘야 했다.

json 변환을 처리하기 위해서는 gson 라이브러리를 사용했고 코드는 아래와 같이 처리했다.

 

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
                                             throws ServletException, IOException {
    CommentDTO dto = commentService.getComment(request);
    
    response.setContentType("application/json");
    response.setCharacterEncoding("UTF-8");
    
    String gson = new GsonBuilder().setDateFormat("yyyy-mm-dd").create().toJson(dto);
    
    response.getWriter().write(gson);
}

일단 gson 처리에서 문제가 있다.

이 프로젝트에서 Date 구조의 경우 yyyy-mm-dd 구조로 데이터베이스에 담겨있고 이 구조대로 출력이 된다.

하지만 gson으로 변환하면 Date 구조가 00월 00일 00년 형태로 지맘대로 바꿔버린다.

그래서 변환을 할 때 setDateFormat으로 설정해줄 필요가 있다.

 

그리고 응답의 경우 print() 가 아닌 write()로 응답하면 된다.

 

+ Recent posts