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)
Spring MVC 기초 정리 — 파즈의 공부 일기 (tistory.com)
[네트워크] get 과 post 의 차이 :: 인생의 로그캣 (tistory.com)
@RequestParam, @PathVariable, @RequestBody (tistory.com)
[Java] Iterable을 컬렉션(Collection)으로 바꾸는 방법 (tistory.com)
https://devlog-wjdrbs96.tistory.com/84
'Study > SpringBoot' 카테고리의 다른 글
[SpringBoot] security, logging(slf4j) (0) | 2022.10.02 |
---|---|
[SpringBoot] 다양한설정 (1) | 2022.09.20 |