[boostcourse] 3.11. Controller - BE

1. @RestController

- Spring MVC가 제공함

- Spring 4에서 Rest API 또는 Web API를 개발하기 위해 등장한 애노테이션

- 이전 버전의 @Controller와 @ResponseBody를 포함함

 

MessageConverter

- 자바 객체와 HTTP 요청 및 응답 바디를 변환하는 역할

- @ResponseBody, @RequestBody

- @EnableWebMvc로 인한 기본 설정

ex) 외부에서 전달받은 JSON 메소드를 내부에서 사용할 수 있는 객체로 변환하기

ex) 컨드롤러가 리턴한 객체를 JSON으로 변환해서 클라이언트에게 전달할 수 있도록 하기

 

JSON 응답하기

- 컨트롤러의 메소드에서는 JSON으로 변환될 객체를 반환함

- jackson 라이브러리를 추가할 경우, 객체를 JSON으로 변환하는 MessageConverter가 사용되도록 @EnableWebMvc에서 기본으로 설정되어 있음

- jackson 라이브러리를 추가하지 않으면, JSON 메시지로 변환할 수 없어 500에러 발생함

- 사용자 임의의 MessageConverter를 사용하도록 하려면, WebMvcConfigurerAdapter의 configureMessageConverters 메소드를 오버라이딩하도록 함

 

2. @RestController 활용 실습

# pom.xml

		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>	
			<version>2.14.2</version>
		</dependency>
		<dependency>
			<groupId>com.fasterxml.jackson.datatype</groupId>
			<artifactId>jackson-datatype-jdk8</artifactId>
			<version>2.15.0</version>
		</dependency>

# GuestbookApiController.java

package com.example.guestbook.controller;

import com.example.guestbook.dto.Guestbook;
import com.example.guestbook.service.GuestbookService;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.*;

@RestController
@RequestMapping(path="/guestbooks")
public class GuestbookApiController {

    @Autowired
    GuestbookService guestbookService;

    @GetMapping     // path는 @RequestMapping을 통해 공통으로 주어짐
    // ContentType이 applicaiton/json으로 요청이 들어옴
    // DispatcherServlet는 JSON MessageConverter를 내부적으로 사용하여 해당 Map 객체를 JSON으로 변환해서 전송함
    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);

        return map;
    }

    @PostMapping
    // Guestbook 객체도 JSON 메소드로 변환되어 클라이언트에게 전달됨
    public Guestbook write(@RequestBody Guestbook guestbook, HttpServletRequest request) {

        String clientIp = request.getRemoteAddr();

        Guestbook resultGuestbook = guestbookService.addGuestbook(guestbook, clientIp);
        return resultGuestbook;
    }

    @DeleteMapping("/{id}")
    public Map<String, String> 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" : "flase");
    }
}

 

테스트 - Talend API Tester 활용

# GetMapping 테스트

 

# PostMapping 테스트

 

# DeleteMapping 테스트