[Web] Rest Controller

@RestController
- Spring 4에서 REST API 또는 Web API를 개발하기 위해 등장한 어노테이션. 이전 버전의 @Controller와 @ResponseBody를 포함한다.

REST API 글

MessageConvertor
- 자바 객체와 http 요청 / 응답 바디를 변환하는 역할
- @ResponseBody, @RequestBody
- @EnableWevMvc (<-method convert)로 인한 기본 설정

JSON 응답
- 컨트롤러의 메소드에서는 json으로 변환될 객체를 반환한다.
- jackson 라이브러리를 추가할 경우 객체를 json으로 변환하는 메시지 컨버터가 사용되도록 @EnableWebMvc에서 기본으로 설정되어 있다.
- jackson 라이브러리를 추가하지 않으면 json 메시지로 변환할 수 없어 500오류가 발생한다.
- 사용자 임이의 MessageConverter를 사용하도록 하려면 WebMvcConfigurerAdapter의 configureMessageConverters 메소드를 오버라이딩 하도록 한다.

JSON은 기존 XML과 다르게 객체형태와 매우 유사해 가독성이 뛰어나고 작성하기도 쉽다. 특히 언어나 플랫폼에 종속되지 않기 때문에 하나의 폼으로 백에서 프론트까지 오갈 수 있어 개발이 용이해진다.

예제는 앞서 만들었던 방명록 웹페이지를 이용한다.

@RestController
@RequestMapping(path = "/guestbooks")
public class GuestbookApiController {
    @Autowired
    GuestbookService guestbookService;
 
    // /guestbooks가 호출되면서 GET 방식으로 요청이 들어오면 아래 객체가 실행된다
    @GetMapping
    public Map<String, Object> list(@RequestParam(name = "start", required = false, defaultValue = "0"int start) {
        List<Guestbook> list = guestbookService.getGuestbooks(start);
 
        int count = guestbookService.getCount();
        int pageCount = count / GuestbookService.LIMIT;
        if (count % GuestbookService.LIMIT > 0)
            pageCount++;
 
        List<Integer> pageStartList = new ArrayList<>();
        for (int i = 0; i < pageCount; i++) {
            pageStartList.add(i * GuestbookService.LIMIT);
        }
 
        Map<String, Object> map = new HashMap<>();
        map.put("list", list);
        map.put("count", count);
        map.put("pageStartList", pageStartList);
        map.put("start", start);
 
        return map;
 
    }
 
    @PostMapping
    public Guestbook write(@RequestBody Guestbook guestbook, HttpServletRequest request) {
        String clientIp = request.getRemoteAddr(); // ip 반환하는 method
        Guestbook resultGuestbook = guestbookService.addGuestbook(guestbook, clientIp);
        return resultGuestbook;
    }
 
    @DeleteMapping("/{id}")
    public Map<StringString> delete(@PathVariable(name = "id") Long id, HttpServletRequest request) {
        String clientIp = request.getRemoteAddr();
 
        int deleteCount = guestbookService.deleteGuestbook(id, clientIp);
        return Collections.singletonMap("success", deleteCount > 0 ? "true" : "false");
    }
}
 
cs

Map을 반환하고 이것은 자동으로 JSON 객체로 바뀐다. 테스트 해보기 위해 크롬 확장프로그램을 이용했다. 확장프로그램 스토어에서 'restlet'을 검색하면 나오는 프로그램을 사용하면된다.



프로젝트를 생성하고 request를 만든다. method, url을 선택하고 'send' 버튼을 누르면 아래쪽에 결과가 출력된다. 스크린샷은 delete 수행화면으로 찍었고 write를 시험하고 싶다면 method를 POST로 지정한 뒤 BODY 부분에 JSON 형식으로 데이터를 적어서 send 하면 된다.

No comments:

Powered by Blogger.