Spring API에서 객체를 JSON 형태로 return 할 때 주의사항

vinca·2023년 3월 13일
0

🍀 Spring

목록 보기
3/7
post-thumbnail

API 객체 JSON return

JSON을 return하는 API형태에는 몇가지 규칙이 있다.
해당 내용은 상당히 내부적인 부분에 의거해서 동작한다.

첫째, 객체를 return 시 해당 원본 클래스의 멤버변수에는 반드시 "게터" 존재해야 한다.

쉽게 말해, 객체에 세터는 없어도 게터는 존재해야한다.

그 이유는 return 시, 객체 내 세터 유무에 따라서 응답 헤더의 타입이 달라진다.

즉, 멤버변수에 게터가 없으면 객체 내 값을 가져올 수 없기에 JSON 형태로 반환해 줄 수가 없기에 다음과 같은 에러 페이지가 표시된다.

쉽게 생각하자면 사실상 게터, 세터가 없는 경우는 드물기에, JSON을 반환 한다면 그냥 반드시 둘 다 존재해야 한다고 생각하자.

둘째, Class내 여러 멤버변수가 있을 때, 하나의 멤버변수의 "게터"만 있어도 오류는 나지 않는다.

"1"번에 의해 쉽게 예상할 수 있는데, 만약 풍선 클래스에 "풍선 가격""풍선 이름" 2가지 멤버변수가 있을 때, "풍선 가격"에만 게터가 정의되어 있고, 풍선 이름은 게터가 없는 상태라도 오류는 나지 않는다.

그 이유는 게터가 하나라도 있기에, 객체를 리턴할 때 리턴되는 Content-TypeJSON이 되기 때문이다.

하지만, 당연하게도 "풍선 이름"은 값을 가져올 수 있는 게터가 없으므로 JSON 파일 내 reutrn 되지 않는다.

셋째, 게터로 결국 JSON 반환의 형태가 결정된다.

JSON은 keyvalue로 구성된 파일 형식이다.

이 때 JSON에 들어가는 Key 값은 게터 함수 명의 get + {keyName}에서의 뒤쪽 KeyName이고

value 값은 실제 매개변수에 저장된 값이다.

무슨 말인 즉슨 아래와 같은 Price 매개변수에 대한 게터가 2개인 소스코드가 있을 때,

게터의 get을 제외한 부분이 KEY 값으로 들어간, 2개의 JSON 데이터가 출력된다.

실제로 굳이 이와같은 오류를 만날 가능성은 크지 않지만, 왜 굳이 게터가 필요할까 세터가 필요할까 등..소스코드의 기본 동작원리를 궁금해서 이것저것 테스트 해보다가 알게된 내용이다.

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

2개의 댓글

comment-user-thumbnail
2023년 3월 14일

좋은 글 감사합니다!
스프링 mvc에서 @ResponseBody를 사용하게 되면 VeiwRsolver 대신 HttpMessageConverter가 동작하게 됩니다. 내부에서 canWirte()로 메시지 컨버터가 지원하는 클래스인지 확인하고, write()를 수행합니다.
현재는 객체이기 때문에 우선순위에 따라 MappingJackson2HttpMessageConverter를 사용하며 Jackson은 객체를 json으로 직렬화 할 때 getter로 접근하기 때문에 다음과 같은 결과가 나타난 것 같습니다.
방지하기 위해서는 사용하지 않을 get메소드에 @JsonIgnore을 추가하면 막을 수 있고, Jackson으로 객체를 직접 json으로 직렬화 하는 경우 new Gson.tojson({변환할 객체})를 하면 필드만 직렬화 가능합니다.

1개의 답글