roundsj
20
2020-09-23 13:18:36
14
289

ResponseBody 없이 내가 만든 클래스를 리턴타입으로 해서 데이터 가져오는 방법 ㅜㅜ


안녕하세요 입사한 지 며칠 된 신입 개발자입니다. 고수님들의 도움이 필요합니다ㅠㅠ


ResponseBody를 사용하지 않고 회원 전체 목록을 가져와야 하는데요....

리턴타입을 List<Member> 가 아닌, 제가 만든 클래스로 해야합니다.


먼저 코드와 설명을 담는BaseResult 클래스와

public class BaseResult {


private String returnCode;

private String returnDesc;

        

        여기에 생성자+getter, setter

}

이를 상속받아서 회원 목록 전체를 생성(?)하는 TestClass 클래스가 있고

class TestClass extends BaseResult {

private List<Member> member;


public TestClass(List<Member> member) {

super();

this.member = member;

}

        + getter, setter


아래는 컨트롤러입니다. 여기서 리스트에 담긴 회원 정보들을 제가 만든 TestClass에 그대로 넣어서 리턴시켜줬는데요

@RequestMapping(value = "/test_ajax", method = RequestMethod.POST, produces = "application/json; charset=utf-8")

public TestClass testAjax() {

// 회원 목록 리스트

List<Member> list = memberService.getMemberList();

TestClass test = new TestClass(list);

return test;

}


ajax에서 success를 타긴 타는데 결과값이 {} 이렇게 나옵니다.

foreach문 돌리려고 하면 반복할 게 없다고 나오고... 

아무래도 리턴되는 값을 JSON으로 인식하지 못해서 날아가는 것 같은데 어떻게 해야할까요ㅠㅠ

참고로 ResponseBody는 절대 쓰면 안되고, JSON Dependency 추가해주었습니다...!

0
  • 답변 14

  • h76
    530
    2020-09-23 13:27:48

    정확히는 알지 못하는데 아마 jsonview라는걸 찾아보시면 답이 나올수도 있습니다.

    참고사이트 올려드립니다.

    https://offetuoso.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-jsonView-%EC%84%A4%EC%A0%95

  • roundsj
    20
    2020-09-23 13:37:29

    답변 감사합니다. 그런데 리턴 타입이 ModelAndView가 되어서도 안되고, 저 TestClass여야해서 사용을 못했습니다ㅠㅠ

  • 클라우디오
    101
    2020-09-23 13:40:14
    응답을 ResponseEntity로 내보내보시는건 어떤가요?
  • 햇개발자
    131
    2020-09-23 13:41:21

    왜 ResponseBody를 사용하면 안되는지 잘 모르겠으나.. ResponseEntity를 사용하면 ResponseBody를 사용한 것과 유사하게 할 수 있습니다.

  • roundsj
    20
    2020-09-23 14:27:08

    회사 팀장님이 그렇게 시키셨거든요ㅠㅠ 그래서 ResponseEntity같은 것들도 쓰면 안될 것 같습니다ㅠㅠ 인터넷 찾아봐도 ResponseBody를 사용하는 경우가 대부분인데 왜인지 모르겠네요.....

    현재 리턴 타입을 Object로 해서 list를 Json타입으로 변형시키고 넘겨봤는데, js에서 {} 요렇게 나오네요


    @RequestMapping(value = "/test_ajax", produces = "application/json; charset=utf-8")

    public Object testAjax() {

    List<Member> placeList = memberService.getMemberList();

    JSONObject obj = new JSONObject();

    try {

    JSONArray jArray = new JSONArray();//배열이 필요할때

    for (int i = 0; i < placeList.size(); i++)//배열

    {

    JSONObject sObject = new JSONObject();//배열 내에 들어갈 json

    sObject.put("emailId", placeList.get(i).getEmailId());

    sObject.put("employeeNo", placeList.get(i).getEmployeeNo());

    jArray.add(sObject);

    }

    obj.put("item", jArray);//배열을 넣음


    LOGGER.debug("회원 목록{}",obj);


    } catch (Exception e) {

    e.printStackTrace();

    }


    return obj;

    }

  • 클라우디오
    101
    2020-09-23 14:30:03 작성 2020-09-23 14:30:20 수정됨

    메소드 return을 Object로 하지 마시고 String으로 해서 생성한 json을 string으로 바꿔서 return하시거나,

    OutputStream을 여셔서 내보내시는 방법으로 해야 될 것 같네요.


    왜 ResponseBody를 쓰지 말라고 하는지는 모르겟지만 ;; 일단 쓰지 말라고 하시면 저런 방법을 시도해보시는게 어떨까요?

  • roundsj
    20
    2020-09-23 14:48:49

    그렇게 해도 {}가 리턴되네요ㅠㅠ 리턴되기 전에 obj 로그 찍어보면 잘나오는데 말이죠....

    무슨 짓을 해도 넘어가면 {} 요것만 나옵니다 흑흑

  • 초보개발자입니당
    816
    2020-09-23 14:52:54

    ObjectMapper 써서 string변환후 string으로 그냥 리턴하면 안될까요

  • 지붕뚫고높이차
    954
    2020-09-23 15:00:04
    프레임워크 소스코드 가져다
    디버그 해보시죠?

    의외로 빨리 해결될수 있습니다.
  • web.
    684
    2020-09-23 16:05:30

    test 클래스를 model에 담은다음 

    return을 jsp페이지로 하고 

    해당 jsp에서 json형식으로 model에 담은 데이터 뿌려주면 됩니다. 

  • yeori
    1k
    2020-09-23 18:31:29

    직장 상사가 과제로 내준듯... 즉 원글이 지워질 수도 있다는 뜻

  • John Suhr
    2k
    2020-09-23 19:00:50

    HttpMessageWriter 검색해보세요; 클래스 반환 타입으로 리턴할 수 있습니다

  • 난쟁
    74
    2020-09-23 23:53:29


    @Autowired
    ObjectMapper mapper;
    
    @RequestMapping(value = "/test_ajax", method = RequestMethod.POST, produces = "application/json; charset=utf-8")
    public String testAjax() {
    	List<Member> list = memberService.getMemberList();
    	TestClass test = new TestClass(list);
    	String result = mapper.writeValueAsString(test);
    
    	return result;
    }

    Responsebody를 사용하면 프레임워크 내부적으로 무슨 일이 일어나는지 직접 구현하면서 알아보라는 의미로 내주신 과제 같은데요. 간단하게 코드로는 아마 위처럼 하시면 될듯해요.

  • roundsj
    20
    2020-09-24 10:07:05

    댓글 달아주신 모든 분들 감사드립니다!!  보니까 joinMapper설정에 modelKey가 있어서 다른 클래스를 리턴하면 json변환이 안되는 것이었습니다ㅜㅜ 

     <!-- <property name="modelKey" value="baseResult" /> -->

    요렇게 주석처리 해주고 난쟁님께서 작성해주신 것과 비슷하게 하니 됩니다!! 참고로 h76님께서 알려주신 jsonView도 해봤는데 잘 되더라고요!

    그리고 yeori님 이거 과제 맞아요ㅠㅠ 그래도 많은 분들이 시간 내주셔서 댓글로 다양한 방법을 적어 주셨고, 다른 누군가가 도움이 될 수도 있으니 이 글은 지우지 않으려고 합니다 !!


    모두들 감사드려요! 저도 얼른 고수가 돼서 다른 분들께 도움이 되겠습니다~~~~~!

  • 로그인을 하시면 답변 을 등록할 수 있습니다.