@RequestBody
보통 반환하고자 하는 리소스가 복잡할 때 사용한다. 오브젝트처럼 복잡한 자료형을 통째로 요청에 보내고 싶은 경우 사용한다.
@GetMapping("/testRequestBody")
public String testControllerRequestBody(@RequestBody TestRequestBodyDTO testRequestBodyDTO){
return "Hello World! ID " + testRequestBodyDTO.getId() + " Message : " + testRequestBodyDTO.getMessage();
}
@RestController는 @Controller + @ResponseBody로 구성되어있다.
@Controller는 @Component로 스프링이 이 클래스의 오브젝트를 알아서 생성하고 다른 오브젝트들과의 의존성을 연결한다는 뜻이다. @ResponseBody는 이 클래스의 메서드가 리턴하는 것은 웹 서비스의 ResponseBody라는 뜻이다.
메서드가 리턴할 때 스프링은 리턴된 오브젝트를 JSON의 형태로 바꾸고 HttpResponse에 담아 반환한다는 뜻이다.
@GetMapping("/testResponseBody")
public ResponseDTO<String> testControllerResponseBody() {
List<String> list = new ArrayList<>();
list.add("Hello World! I'm ResponseDTO");
ResponseDTO<String> responseDTO = ResponseDTO.<String>builder().data(list).build();
return responseDTO;
}
ResponseEntity는 HTTP 응답의 바디뿐만 아니라 여러 다른 매개변수들(status, header)을 조작하고 싶을 때 사용한다.
package com.example.demo.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ResponseDTO<T> {
private String error;
private List<T> data;
}
@GetMapping("/testResponseEntity")
public ResponseEntity<?> testControllerResponseEntity(){
List<String> list = new ArrayList<>();
list.add("Hello World! I'm ResponseEntity. And you got 400!");
ResponseDTO<String> responseDTO = ResponseDTO.<String>builder().data(list).build();
// http status를 400으로 설정
//return ResponseEntity.badRequest().body(responseDTO);
// http status를 200으로 설정
return ResponseEntity.ok().body(responseDTO);
}
서비스 레이어: 비즈니스 로직
서비스 레이어는 컨트롤러와 퍼시스턴스 사이에서 비즈니스 로직을 수행하는 역할을 한다.
@service 어노테이션
스테레오타입 어노테이션이다. @service 내부에는 @Component 어노테이션을 갖고 있는데 @Component 어노테이션과 비교했을 때 특별한 기능차이는 없다. 단지 이 클래스는 스프링 컴포넌트이며 기능적으로는 비즈니스 로직을 수행하는 서비스 레이어임을 알려주는 어노테이션이다.
package com.example.demo.service;
import org.springframework.stereotype.Service;
@Service
public class TodoService {
public String testService(){
return "Test Service";
}
}
package com.example.demo.controller;
import com.example.demo.dto.ResponseDTO;
import com.example.demo.service.TodoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("todo")
public class TodoController {
// testTodo 메서드 작성하기
@Autowired
private TodoService todoService;
@GetMapping("/test")
public ResponseEntity<?> TestTodo() {
String str = todoService.testService(); // 테스트 서비스 사용
List<String> list = new ArrayList<>();
list.add(str);
ResponseDTO<String> response = ResponseDTO.<String>builder().data(list).build();
return ResponseEntity.ok().body(response);
}
}
@RestController도 내부에 @Component 어노테이션을 갖고 있다. 따라서 @Service, @RestController 모두 자바 빈이고 스프링이 관리한다. 스프링은 TodoControlle 오브젝트를 생성할 때 내부에 선언된 TodoService에 @Autowired 어노테이션이 붙어있다는 것을 확인한다. @Autowired가 알아서 빈을 찾은 다음 그 빈을 이 인스턴스 멤버 변수에 연결하라는 뜻이다.
TodoController를 초기화할 때 스프링은 알아서 TodoService를 초기화 또는 검색해 TodoController에 주입해 준다.
'독서 > React.js, 스프링 부트, AWS로 배우는 웹 개발' 카테고리의 다른 글
CRUD 구현 중 참고 (0) | 2022.04.28 |
---|---|
p.83 ~ 109 (0) | 2022.04.24 |
이클립스에서 롬복(lombok) 사용하기 (0) | 2022.04.23 |
스프링 부트 프로젝트 생성 후 cmd 창에서 실행하는 방법 (0) | 2022.04.21 |
지은이 개발 블로그, 깃헙 주소, 실습 전 책 내용 (0) | 2022.04.21 |