Java

[Spring Boot] Rest API 개념 및 작성 방법

cob 2022. 10. 10. 14:46
REST API
REST(Representational State Transfer) 란?
HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고,
HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미한다.

REST API 란?
자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미합니다.
크게 URL, HTTP 메서드, 요청 매개변수 또는 요청 바디로 구분된다.

 

 

 


1. URL 맵핑

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController         //해당 어노테이션으로 컨트롤러가 RestController임을 명시한다.
@RequestMapping("test") // 리소스
public class TestController {
	@GetMapping            //Get으로 요청하면 해당 메서드 실행
	public String testController() {
		return "Hello World!";
	}
	@GetMapping("/testGetMapping")
	public String testControllerWithPath() {
		return "Hello World! testGetMapping";
	}
}
@PostMapping, @PutMapping, @DeleteMapping 스프링 4.3이후 버전부터 가능
  • url/test → "Hello World!"을 리턴 받는다.
  • url/test/testGetMapping → "Hello World! testGetMapping" 리턴 받는다.
  • @RequestMapping 없이 @GetMapping 만으로도 url 매핑이 가능하다.

 

 


2. 요청 파라미터 넘겨주는 방법 (1) PathVariable

import org.springframework.web.bind.annotation.PathVariable;

@GetMapping("/{id}")
 	public String testControllerWithPathVariables(@PathVariable(required = false) int id) {
		return "Hello world! ID " + id;
	}
PathVariable을 이용하면 /{id}와 같이 URI의 경로로 넘어오는 값을 변수로 받을 수 있다.
  • required = false는 이 파라미터가 필수 값은 아니라는 뜻으로 값을 명시하지 않아도 에러가 나지 않는다.

 

 


3. 요청 파라미터 넘겨주는 방법 (2) RequestParam

import org.springframework.web.bind.annotation.RequestParam;

@GetMapping("/testRequestParam")
	public String testControllerRequestParam(@RequestParam(required = false) int id) {
		return "Hello world! ID " + id;
	}
@RequestParam을 이용하면 /testRequestParam?id={id} 와 값이 Key, Value로 값을 넘겨 받을 수 있다.

 

 


4. 요청 파라미터 넘겨주는 방법 (3) RequestBody

String이나 int 같은 기본 자료형이 아닌 오브젝트처럼 복잡함 자료형을 통째로 요청 보낼때 사용

( DTO )

import lombok.Data;

@Data
public class TestRequestBodyDTO {
	private int id;
	private String message;
}

 

( Controller )

import com.example.demo.dto.TestRequestBodyDTO;
import org.springframework.web.bind.annotation.RequestBody;

@GetMapping("/testRequestBody")
	public String testControllerRequestBody(@RequestBody TestRequestBodyDTO testRequestBodyDTO) {
		return "Hello World! ID " + testRequestBodyDTO.getId() + "Mssage : " + testRequestBodyDTO.getMessage();
	}

 

RequestBody

  • RequestBody로 보내오는 JSON을 TestRequestDTO 오브젝트로 변환해 가져오라는 뜻이다.
    즉, 클라이언트 요청 바디로 JSON 데이터 형태의 문자열을 넘겨준다.

 

 


5. 결과값 넘겨주는 방법 (1) ResponseBody

문자열 리턴이 아닌 오브젝트 리턴 방법
리턴할 때 스프링은 리턴된 오브젝트를 JSON 데이터 형태로 바꾸고 HttpResponse에 담아 반환한다는 뜻

( DTO )

import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ResponseDTO<T> {
	private String error;
	private List<T> data;

}

 

( Controller )

import com.example.demo.dto.ResponseDTO;

@GetMapping("/testResponseBody")
	public ResponseDTO<String> testControllerResponseBody(){
		List<String> list = new ArrayList<>();
		list.add("Hellow World! I'm ResponseDTO");
		ResponseDTO<String> response = ResponseDTO.<String>builder().data(list).build();
		return response;
	}
  • 방법은 아주 간단한다 그냥 오브젝트를 리턴하면 된다.

ResponseBody

 


6. 결과 값 넘겨주는 방법 (5) ResponseEntity

응답의 바디뿐만 아니라 여러 다른 매개변수들, 예를 들어 status나 header를 조작하고 싶을 때 사용한다.

( DTO )

import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Builder
@NoArgsConstructor
@AllArgsConstructor
@Data
public class ResponseDTO<T> {
	private String error;
	private List<T> data;

}

 

( Controller )

import org.springframework.http.ResponseEntity;
import java.util.ArrayList;
import java.util.List;

@GetMapping("/testResponseEntity")
	public ResponseEntity<?> testControllerResponseEntity(){
		List<String> list = new ArrayList<>();
		list.add("Hello World! I'm REsponseEntity. And you got 400!");
		ResponseDTO<String> response = ResponseDTO.<String>builder().data(list).build();
		// http status를 400으로 설정
		return ResponseEntity.badRequest().body(response);
	}

ResponseEntity

400 Bad Request가 반환되는 것을 확인할 수 있다. ResponseEntity를 리턴하는 것과 ResponseDTO를 리턴하는 것을 비교했을 때 리턴되는 body에는 아무 차이가 없다. 단지 헤더와 HTTP Status를 조작할 수 있다는 점이 다르다.

 

  • badRequest() 메서드를 사용했지만 정상적으로 응답을 반환한다면 ok() 메서드를 사용한다.
return ResponseEntity.ok().body(response);
반응형