@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에 주입해 준다.

+ Recent posts