서블릿에서 Spring 전환 시 JSONObject 사용 방식 때문에 발생한 응답 오류 해결하기
1. 문제 상황
기존 서블릿 기반에서는 응답을 보낼 때 JSONObject, JSONArray를 직접 사용해서 데이터를 만듬
JSONObject result = new JSONObject();
JSONArray boardComboDatas = new JSONArray();
// 데이터 채우기
result.put("boardComboDatas", boardComboDatas);
// response로 출력
response.getWriter().write(result.toString());
Fornt단에서는 response.boardComboDatas.forEach(...) 방식으로 정상적으로 데이터를 읽음
그런데 Spring 컨테이너로 전환하면서, JSONObject, JSONArray를 직접 사용하지 않고 바로 Java 객체(List, Map)를 리턴하는 방식으로 변경
return boardComboDatas; // List 그대로 반환
문제 발생
2. 문제 원인
• 서블릿에서는 항상 JSONObject로 감싸서 보내줬기 때문에 프론트엔드는 response.boardComboDatas로 접근 가능
• 스프링에서는 Java 객체(List)를 그대로 리턴하게 되면서 프론트엔드는 response 자체가 리스트여서 boardComboDatas라는 키를 찾을 수 없음
즉, Spring에서는 JSONObject 구조를 따로 만들어주지 않으면, 프론트 기존 코드(response.boardComboDatas.forEach)가 동작하지 않음
3. 상황별 정리
방식 | 서버 리턴 형태 | 프론트 처리 방법 |
서블릿 (JSONObject 사용) | { "boardComboDatas": [...] } | response.boardComboDatas.forEach(...) |
Spring (List 바로 리턴) | [ {...}, {...}, ... ] | response.forEach(...) |
4. 해결 방법
프론트 코드를 수정하지 않고 그대로 유지하려면, Spring에서도 Map으로 한번 감싸서 보내야 함
Map<String, Object> result = new HashMap<>();
result.put("boardComboDatas", boardComboDatas);
return result;
이렇게 하면 Spring이 내부적으로 JSON 변환할 때 자동으로 { "boardComboDatas": [...] } 형태로 응답을 만들어줌
프론트는 기존 코드 유지 가능:
response.boardComboDatas.forEach(boardComboData => {
// 데이터 처리
});
5. 결론
서블릿 → Spring 전환 시 주의할 점
• 서블릿에서는 JSONObject, JSONArray를 직접 다룸
• Spring에서는 Java 객체를 바로 리턴
• 기존 프론트 코드를 유지하고 싶으면 서버에서도 Map으로 한번 감싸서 리턴해줘야 함
"response.boardComboDatas"를 쓰려면 서버에서도 "boardComboDatas" 키를 만들어 보내야함