KoreaIt Academy/Spring Boot

[Spring Boot] @Controller와 @RestController의 차이, REST 방식 사용법(Ajax) - 댓글 등록, 조회

hongeeii 2021. 10. 14.
728x90
반응형

Spring에서 컨트롤러를 지정해주기 위한 어노테이션은 @Controller@RestController가 있습니다.

전통적인 Spring MVC의 컨트롤러인 @Controller와 Restuful 웹서비스의 컨트롤러인 @RestController의

주요한 차이점은 HTTP Response Body가 생성되는 방식입니다.

이번에는 2가지 어노테이션의 차이와 사용법에 대해 알아보도록 하겠습니다. 


REST(Representational State Transfer) 

 대표하는 , 상태, 전송 
"하나의 URI는 하나의 고유한 리소스를 대표하도록 설계됩니다"
예) /board/read?bno=... -> /board/123 : 게시글 중 123번
URI->변수를 쓸 수 있습니다

특징
※ 타 서버간 데이터 전송이 원활하고 언어와 서버의 제약 없이 데이터를 교환할 수 있습니다.

 

1. @Controller(Spring MVC Controller)


[ Controller - View ]

전통적인 Spring MVC의 컨트롤러인 @Controller는 주로 View를 반환하기 위해 사용합니다.

아래와 같은 과정을 통해 Spring MVC Container는 Client의 요청으로부터 View를 반환합니다.

 

  1. Client는 URI 형식으로 웹 서비스에 요청을 보냅니다.
  2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트합니다.
  3. Controller가 요청을 처리한 후에 응답을 DispatcherServlet으로 반환하고, DispatcherServlet은 View를 사용자에게 반환합니다.

@Controller가 View를 반환하기 위해서는 ViewResolver가 사용되며, ViewResolver 설정에 맞게 View를 찾아 렌더링합니다.

 

 

[ Controller - Data ]

하지만 Spring MVC의 컨트롤러에서도 Data를 반환해야 하는 경우도 있습니다.

Spring MVC의 컨트롤러에서는 데이터를 반환하기 위해 @ResponseBody 어노테이션을 활용해주어야 합니다.

이를 통해 Controller도 Json 형태로 데이터를 반환할 수 있습니다.

 

  1. Client는 URI 형식으로 웹 서비스에 요청을 보냅니다.
  2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트합니다.
  3. @ResponseBody를 사용하여 Client에게 Json 형태로 데이터를 반환합니다.

@RestController가 Data를 반환하기 위해서는 viewResolver 대신에 HttpMessageConverter가 동작합니다. HttpMessageConverter에는 여러 Converter가 등록되어 있고,

반환해야 하는 데이터에 따라 사용되는 Converter가 달라집니다.

단순 문자열인 경우에는 StringHttpMessageConverter가 사용되고, 객체인 경우에는MappingJackson2HttpMessageConverter가 사용되며,

데이터 종류에 따라 서로 다른 MessageConverter가 작동하게 됩니다.

Spring은 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해 적합한 HttpMessageConverter를 선택하여 이를 처리합니다.

 

 

 

2. @RestController(Spring Restful Controller)


[ RestController ]

@RestController는 Spring MVC Controlle에 @ResponseBody가 추가된 것입니다.

당연하게도 RestController의 주용도는 Json 형태로 객체 데이터를 반환하는 것입니다. 

 

  1. Client는 URI 형식으로 웹 서비스에 요청을 보냅니다.
  2. Mapping되는 Handler와 그 Type을 찾는 DispatcherServlet이 요청을 인터셉트합니다.
  3. RestController는 해당 요청을 처리하고 데이터를 반환합니다.

 

 

 

package com.example.board.controller;

import com.example.board.beans.vo.ReplyVO;
import com.example.board.services.ReplyService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.io.UnsupportedEncodingException;

@RestController
@Slf4j
@RequiredArgsConstructor
@RequestMapping("/replies/*")
public class ReplyController {

    private final ReplyService replyService;

//    댓글 등록
//     ResponseEntity : 응답할 타입을 받을 객체
//    브라우저에서 JSON타입으로 데이터를 전송하고 서버에서는 댓글의 처리 결과에 따라 문자열로 결과를 리턴한다.
//    consumes : Ajax를 통해 전달받은 데이터의 타입
//    produces : Ajax의 success:function(result)에 있는 result로 전달할 데이터 타입
//    @ResponseBody : @Controller에서 REST API를 구현하기 위해서 사용된다.

//    문자열을 전달할 때 한글이 깨지지 않게 하기 위해서는 text/plain; charset=utf-8을 작성한다.
//    ResponseEntity : 서버의 상태 코드, 응답 메세지 등을 담을 수 있는 타입이다.
   @PostMapping(value="/new", consumes="application/json", produces = "text/plain; charset= utf-8")
    public ResponseEntity<String> create(@RequestBody ReplyVO replyVO) throws UnsupportedEncodingException{

       int replyCount = replyService.register(replyVO);
       log.info("ReplyVO : "+  replyVO);
       log.info("REPLY INSERT COUNT  : "+ replyCount);

       return replyCount==1?
               new ResponseEntity<>(new String("댓글등록 완료".getBytes(),"utf-8"), HttpStatus.OK) :
               new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
   }

}

 

  • @RequestBody 어노테이션이란?
  • HTTP 요청의 body 내용을 자바 객체로 매핑하는 역할을 합니다.

 

  • @ResponseBody 어노테이션이란?
  • -자바 객체를 HTTP 요청의 body 내용으로 매핑하는 역할을 합니다.

 

사용법 1.

 

사용법 2.

 

@PathVariable

//매핑의 URL에 { } 로 들어가는 패스 변수(path variable)를 받습니다.

//   스프링 부트는 ResponseEntity를 무조건 써야하나 자동으로 바꿔줌 List->ResponseEntity
//   게시글 댓글 전체 조회
    @GetMapping("pages/{bno}/{page}")
    public List<ReplyVO> getList(@PathVariable("bno") Long bno, @PathVariable("page") int page){
       log.info("getList/.................");
       Criteria criteria = new Criteria(page,10);
       log.info(criteria.toString());
       return replyService.getList(bno, criteria);
    }

 

 

 

POST방식으로 REST API를 테스트 할 수 있는 방법
Talend api tester를 다운받아 줍니다.

//키값에는 반드시 ""를 붙여줘야 합니다/



728x90
반응형

추천 글