✅ Spring_

서블릿에서 Spring 전환 시 JSONObject 사용 방식 때문에 발생한 응답 오류 해결하기

CodeLoge 2025. 4. 27. 20:35

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" 키를 만들어 보내야함