본문 바로가기

Study/SpringBoot

[SpringBoot] REST API

REST API 구현

 

Controller 생성

-CustomerController.java

package kr.ac.hansung.cse.controller;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import kr.ac.hansung.cse.model.Customer;
import kr.ac.hansung.cse.repo.CustomerRepository;;

@RestController
@RequestMapping("/api")
public class CustomerController {

	static Logger logger = LoggerFactory.getLogger(CustomerController.class);
	
	@Autowired
	CustomerRepository repository;
	
	@GetMapping(value="/customers", produces = MediaType.APPLICATION_JSON_VALUE)
	public ResponseEntity<List <Customer>> getAll(){
		
		logger.debug("Calling getAll()");
		
		List<Customer> list = new ArrayList<>();
		Iterable<Customer> customers = repository.findAll();
		
		customers.forEach(list::add);
		
		return new ResponseEntity<List<Customer>>(list, HttpStatus.OK);
		
	}
	
	@PostMapping(value="/customers")
	public ResponseEntity<Void> postCustomer(@RequestBody Customer customer) {
		
		logger.debug("Calling postCustomer( )");
		
		String firstName = customer.getFirstName();
		String lastName = customer.getLastName();
		
		repository.save(new Customer(firstName, lastName));
		
		return new ResponseEntity<Void>(HttpStatus.CREATED);
		
	}
	
	@GetMapping(value="/customers/{lastName}", produces=MediaType.APPLICATION_JSON_VALUE)
	public ResponseEntity<List<Customer>> findByLastName(@PathVariable String lastName){
		
		logger.debug("Calling findByLastName(  )");
		
		List<Customer> customers = repository.findByLastName(lastName);
		return new ResponseEntity<List<Customer>>(customers, HttpStatus.OK);
		
	}
	
	@DeleteMapping(value="/customers/{id}")
	public ResponseEntity<Void> deleteCustomer(@PathVariable long id){
		
		logger.debug("Calling deleteCustomer(  )");
		repository.delete(id);
		
		return new ResponseEntity<Void>(HttpStatus.NO_CONTENT)
	}
}

 

Iterable customers = repository.findAll();
  • findAll()를 사용해 모든 repositroy 조회할 수 있다.
customers.forEach(list::add); // 데이터 각각을 집어넣는다.
  • Iterable객체에서 제공하는 forEach 메서드를 사용해 모든 데이터 각각을 list에 집어넣는다.
return new ResponseEntity<List<Customer>>(list, HttpStatus.OK);
  • body에 list를 집어넣고, status는 OK를 하여 전달한다.

 

 

@PathVariable

  • URI 경로의 일부를 파라미터로 사용할 때 이용한다.
  • 템플릿 변수의 값을 추출하고 그 값을 메서드 변수에 할당한다.
  • Rest api에서 값을 호출할 때 주로 사용한다.

@RequestBody

  • http 요청의 body에 담긴 값을 자바 객체로 변환한다.
  • 비동기 처리 구현 시 @ResponseBody와 함께 사용한다.
  • JSON 데이터를 원하는 타입의 객체로 변환해야 하는 경우에 사용한다.
  • 클라이언트에서 서버로 데이터를 요청하기 위해 JSON 데이터를 요청 본문에 담아 서버로 보내면
    서버에서 @RequestBody 어노테이션을 사용해 HTTP 요청 본문에 담긴 값들을 자바 객체로 변환시켜 객체에 저장한다.

@RequestParam : query 처리

@PathVariable : URI 변수 처리

@RequestBody : JSON 처리

 

 

GET과 POST

 

GET

  • 클라이언트에서 서버로 어떠한 리소스로부터 정보를 요청하기 위해 사용되는 메서드이다.
    ex) 게시판의 게시물을 조회
  • GET은 요청을 전송할 때 필요한 데이터를 Body에 담지 않고, 쿼리 스트링을 통해 전송합니다.
  • 쿼리스트링 : URL의 끝에 ?와 함께 이름과 값으로 쌍을 이루는 요청 파라미터 
  • GET 요청은 캐시가 가능하다
  • GET 요청은 길이 제한이 있다.
  • GET 요청은 url에 요청이 보이기 때문에 보안상 중요한 정보를 다루면 안 된다

POST

  • 전송할 데이터를 HTTP 메시지 body 부분에 담아서 서버로 보낸다.
  •  HTTP 메시지의 Body는 길이의 제한 없이 데이터를 전송할 수 있기 때문에 POST 요청은 GET과 달리 대용량 데이터를 전송할 수 있다.
  • POST 요청은 캐시 되지 않는다.
  • POST 요청은 브라우저 히스토리에 남지 않는다.
  • POST 요청은 데이터 길이에 제한이 없다.

 

HTTP 요청 맵핑 - 미디어 타입 MediaType

  • 문자열을 입력하는 대신 MediaType을 사용하면 상수를 IDE에서 자동 완성으로 사용할 수 있다.
  • 클래스에 선언한 @RequestMapping에 사용한 것과 조합이 되지 않고 메서드에 사용한 @RequestMapping의 설정으로 덮어쓴다.

특정한 타입의 데이터를 담고 있는 요청만 처리하는 핸들러

  • @RequestMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
  • 이는 APPLICATION_JSON_VALUE의 타입의 요청만 받아들인다는 것을 의미한다
  • 매치되는 않는 경우에 415 Unsupported Media Type를 응답한다.

특정한 타입의 응답을 만드는 핸들러

  • @RequestMapping( produces = MediaType.APPLICATION_JSON_VALUE)
  •  해당 형태의 유형으로 응답을 한다는 것을 의미한다.
    생성되는 Response Body가 JSON 포맷이다.
    -> 넘겨줄 때 Json 포맷으로 넘겨주게 된다.
  • 매치되지 않는 경우에 406 Not Acceptable 를 응답한다.

 

 

 

테스트

 

Get 할 경우 Json 포맷으로 넘어오는 데이터들을 확인할 수 있다. 

 

PostMan을 활용한 테스트

 

-getAll()

 

-LastName으로 조회 

 

-Post 생성.

HttpStatus.CREATED = 201 Created

 

-DELETE

 

 

 


 

 

HTTP GET,POST방식 차이 (tistory.com)

 

HTTP GET,POST방식 차이

이전 글 : https://brilliantdevelop.tistory.com/32 이 글을 읽기전에 먼저 읽을 것을 권장합니다. HTTP 메소드 중 GET방식과 POST 방식 차이 get방식이든 post방식이든 둘 다 브라우저가 서버에 요청하는 것입니.

brilliantdevelop.tistory.com

Spring MVC 기초 정리 — 파즈의 공부 일기 (tistory.com)

 

Spring MVC 기초 정리

Spring MVC 기초 정리 매핑 요청 @RestController @RequestMapping("/http-method") public class HttpMethodController { @PostMapping("/users") public ResponseEntity createUser(@RequestBody User user) { L..

bepoz-study-diary.tistory.com

[네트워크] get 과 post 의 차이 :: 인생의 로그캣 (tistory.com)

 

[네트워크] get 과 post 의 차이

GET 과 POST 는 HTTP 메서드로 클라이언트에서 서버로 무언가를 요청할 때 사용한다. 2019/06/01 - [IT 정보 로그캣/CS] - [네트워크] http 란 [네트워크] http 란 기본적으로 네트워크 통신을 할 때 처음 접하

noahlogs.tistory.com

@RequestParam, @PathVariable, @RequestBody (tistory.com)

 

@RequestParam, @PathVariable, @RequestBody

https://elfinlas.github.io/2018/02/18/spring-parameter/ Spring에서 @RequestParam과 @PathVariable Spring에서 Controller의 전달인자…Spring을 사용하다 보면 Controller 단에서 클라이언트에서 URL에 파라..

u0hun.tistory.com

[Java] Iterable을 컬렉션(Collection)으로 바꾸는 방법 (tistory.com)

 

[Java] Iterable을 컬렉션(Collection)으로 바꾸는 방법

자바 라이브러리를 사용하다보면 Iterable 객체를 받아와서 컬렉션(Collection) 객체로 바꿔 쓰고 싶은 경우가 많다. 그냥 일반적인 자바 소스코드로 작성해서 사용하는 방법도 있고, 구아바(Guava), Ap

hbase.tistory.com

https://devlog-wjdrbs96.tistory.com/84

 

[Java] Iterable 과 Iterator 이란?

Collection framework는 뭔가 되게 많고 복잡한 느낌이 들어서 완벽하게 정리가 된 느낌은 아니었다. 가령 Iterator는 어떤 역할인지는 알겠는데 어떤 계층구조를 갖고 있는지 궁금했고, 공부하다보니 It

devlog-wjdrbs96.tistory.com

 

'Study > SpringBoot' 카테고리의 다른 글

[SpringBoot] security, logging(slf4j)  (0) 2022.10.02
[SpringBoot] 다양한설정  (1) 2022.09.20