Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

DOing

[Spring] @RestController 본문

Spring

[Spring] @RestController

mangdo 2021. 4. 2. 14:42

Spring에서 컨트롤러를 등록하는 방법에는 두가지가 있다.

@Controller와 @RestController.

 

@Controller는 주로 View를 반환한다. 하지만 @Controller에 @ResponseBody를 붙이면 view가 아닌 xml, json과 같은 데이터를 반환할 수 있다. (참고 : 2021.04.01 - [spring] - Controller에서 데이터 반환하기)

매번 @ResponseBody를 붙이는 것은 번거로우니 Spring 4.0부터는 @RestController를 지원하기 시작했다.


@RestController

@Controller + @ResponseBody

@RestController를 확인해보면 다음과 같다.

Spring 4.0부터 사용가능한 어노테이션으로 @Controller에 @ResponseBody가 결합된 어노테이션이다.

 @RestController의 모든 메소드에서 리턴되는 값은 MessageConverter에서 변환되어 HTTP Response Body에 쓰여진다.

 

[ @Controller를 사용하던 기존 코드 ]

@Controller
public class SampleController{

  @GetMapping("/example")
  @ResponseBody
  public SampleDTO example() {
  
    SampleDTO dto = new SampleDTO();
    dto.setAge(24);
    dto.setName("mangdo");
    
    return dto; //스프링이 자동으로 JSON타입으로 객체를 반환해서 전달한다.
  }
}

[ @RestController를 사용하는 수정 코드 ]

@RestController
public class SampleController{

  @GetMapping("/example")
  public SampleDTO example() {
  
    SampleDTO dto = new SampleDTO();
    dto.setAge(24);
    dto.setName("mangdo");
    
    return dto; //스프링이 자동으로 JSON타입으로 객체를 반환해서 전달한다.
  }
}

 

@RestController 사용예

1. 반환 값으로 텍스트 컨텐츠를 반환한다.

반환 값이 바로 response body에 쓰여진다.

@RequestMapping("/rest") 
public String rest1() { 
	return "text content"; 
}

2. 컨텐츠 형식을 지정한다.

consumes는 받는 컨텐츠 형식이고, produces는 응답하는 컨텐츠 형식이다.

org.springframework.http.MediaType 클래스에 콘텐츠 형식의 상수가 정의되어 있으니 이것을 이용하는 것이 좋다.

	@PostMapping(value="/new", consumes="application/json", produces= {MediaType.TEXT_PLAIN_VALUE})
	public ResponseEntity<String> create(@RequestBody ProductReviewVO vo){
		log.info("ReviewVO : " + vo);

		return service.register(vo)==1?
				new ResponseEntity<>("success",HttpStatus.OK) :
				new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
		
	}

 

3. HTTP 상태 및 응답헤더를 지정해준다.

HTTP 상태와 같은 컨텐츠 형식 이외의 응답 헤더를 지정해주고 싶다면 반환값을 ResponseEntity한다.

	@PostMapping(value="/new", consumes="application/json", produces= {MediaType.TEXT_PLAIN_VALUE})
	public ResponseEntity<String> create(@RequestBody ProductReviewVO vo){
		log.info("ReviewVO : " + vo);

		return service.register(vo)==1?
				new ResponseEntity<>("success",HttpStatus.OK) :
				new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
		
	}

4. JSON 반환

반환값을 임의의 클래스라면 springMVC가 Jackson을 사용하여 json으로 변경하여 반환해준다.

	@GetMapping("/quickView")
	public ProductVO getQuickView(Long product_id) {
		
		log.info("quick View data, " + product_id);
		return service.getQuickView(product_id);
	}