본문으로 바로가기

​RestController

category 수업내용 정리/정리안된 메모 2019. 6. 16. 21:05

RestController

지금까지 했던 컨트롤러의 역할은 컨트롤러 핸들러가 로직을 처리하고 반환값을 viewName 또는 redirect 했었다.

오늘은 Handler가 view정보 또는 redirect 할 URL을 반환하지 않고, 클라이언트가 요청한 데이터를 반환하는 실습을 해보자. (응답이 'view name'이 아닌, text 혹은 html 타입으로 처리)

────────────────────​

실습을 위한 라이브러리 

spring : core,context,jdbc,web,webmvc,aop,test

mybatis : mybatis, mybatis-spring

aspectj : aspectjrt,aspectjweaver

oracle : ojdbc

test : junit

log4j

jsp : jstl

────────────────────​​

return에 적힌 값은 현재 view 이름이기 때문에, jsp/hello.jsp 화면을 만들어내게 된다. 하지만 실제로 hello.jsp를 만들지 않았기 때문에 404 예외가 발생할 것.

예외 발생

​ㅡㅡㅡㅡ

우리가 지금 하려는 것은 view name이 아닌, 단순하게 데이터를 반환하는 것을 할 것 이다.

@ResponseBody을 test()위에 작성하고 hello 라는 요청을 할 경우 

이미지와 같은 결과를 얻을 수 있다. test()에서 return에 적힌 hello는 문자열 자체를 값으로 반환한 것을 확인 할 수 있다.

@ResponseBody가 없으면 ViewResolver가 문자열을 처리하고, return에 적힌 문자열을 view name이라고

생각하고 화면요청을 처리하게 되는데

@ResponseBody를 붙여주면, VeiwResolver가 처리 하지 않고, MessageConverter라는 객체가 처리하게 된다. 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡ

이번에는 Message List를 반환해보자

이렇게 코드를 작성하고 요청을 하면

짠! 406 예외가 뜬다.

간단한 문자열 정도는 반환 할 수 있지만, List가 가지고 있는 toString을 이용해서 데이터를 만들어 내는 작업을 하고, 실질적으로 return되는 것은 List<Message>의 toString 인데. (필기 추가로 더 해야됨)

servlet-context.xml에 이미지 처럼 <mvc:annotation-driven> 속성을 추가하고 다시 요청을 보내면 

짠! 이번에는 500 에러가 뜬다.

1

2

심각: Servlet.service()forservlet [springDispatcherServlet] in context with path [/Day190111_RestController] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: No converter foundfor returnvalue of type: class java.util.ArrayList] with root cause

java.lang.IllegalArgumentException: No converter foundfor returnvalue of type: class java.util.ArrayList

Colored by Color Scripter

cs​

MessageConverter가 동작하는데, 문자열 변환을 어떻게 할 지 모르기 때문에 문자열 변환을 위한 라이브러리가 필요하다.

이때 필요한 라이브러리가 Jackson 이다. 쫴액슨은 자바 객체를 json 문자열로 변환하는 라이브러리를 포함하고 있다. (예전에 gson을 사용해서 문자열을 json 형태의 문자열로 바꾸어 주었던 걸 생각하면 됨)

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

mvnrepository.com에서 jackson 라이브러리를 검색해서 라이브러리에 추가해보자 

jackson을 검색하고 맨 위에 있는 Jackson Databind를 선택하고 제일 많이 사용한 2.9.5 ver를 porm.xml에 추가해서 사용해보자.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

그리고 다시 요청을 해보면 

짠. 드디어 원하던 List가 화면에 출력 된 것을 볼 수 있다.
그리고 문자열을 살펴보면 toString이 아니라, json 형태의 문자열 이라는 것을 확인 할 수 있다. 
​ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

객체를 문자열로 바꾸는 것은 MessageConverter가 하고,

바뀐 문자열을 json으로 바꾸어 주는 것은 jackson이 하는 형태이다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

위에서 나온 브라우저 창에서 우클릭을 하면 파일을 저장 할 수 있는데

바로 json 파일이다.
즉, 현재 화면에 출력된 것은 화면이 아닌 json 타입의 문자열 이라는 것 ! 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

[중간필기]

데이터를 응답하기 위한 방법 : handler(컨트롤러의 메서드) 위에 @ResponseBody를 붙여주면 반환값을 viewResolver가 처리하지 않는다. 

MessageConverter라는 객체가 반환하는 객체/문자열을 전송 가능한 형태(문자열)로 변환해준다.

​​ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ