커리큘럼(12-30/변경)
01. Java
02. git
03. Database
04. Jsp [Server]
05. HTML,CSS
07. JS
06. 미니프로젝트-2W
08. SpringFramework , SrpingBoot (v)
09. React JS [Front-end]
10. 중간프로젝트 (1M)
11. Linux 명령어
12. AWS 클라우드
13. DevOps - Docker
14. App - Android
15. 최종프로젝트 (1M)
스프링 부트
REST API
- 두 컴퓨터(서버) 간의 데이터를 교환하기 위한 인터페이스 표준
- REST API는 양방향 통신
- 기존의 @Controller는 return에 Model을 담아서 뷰에 전달하는 방식으로 사용
- REST API는 서버간 통신을 위한 Controller
- @RestController는 return에 처리하는 데이터를 조금 다른 타입으로 처리하는 형식
- 객체(데이터)를 반환할 수도 받을수도 있음
REST API의 메시지 컨버터
1. @RequestBody
- 클라이언트(주로 웹 브라우저나 모바일 앱)에서 보낸 HTTP 요청의 본문(body) 데이터를 Java 객체로 변환
- 클라이언트에서 JSON 형식으로 데이터를 보내면, 그 데이터를 Java의 객체로 변환하여 컨트롤러 메서드의 파라미터로 받을 수 있음
- 주로 POST, PUT요청에서 사용
2. @ResponseBody
- Java 객체를 HTTP 응답 본문에 포함된 데이터로 변환하여 클라이언트에게 전달
- Java 객체를 JSON이나 XML로 변환해서 응답 본문에 담아서 클라이언트에게 전달할 수 있음
- 주로 GET 요청에서 사용되며, 클라이언트가 서버로부터 JSON, XML, 텍스트 등을 요청할 때 사용
@RestController
는 @Controller
와 @ResponseBody
를 합친 기능
- HTTP 메시지 컨버터란, 요청 본문에서 메시지를 읽어 들이거나(@RequestBody), 응답 본문에 메시지를 작성(@RequestBody)할 때 사용하여 요청 브라우저로 응답을 바꾸는 장치
- 뷰 템플릿으로 HTML으로 응답하는 게 아니라, 화면에서 처리할 JSON or 문자열 or xml형태로 응답하는 기능
- HTTP 요청 데이터 읽기
- HTTP 요청이 들어오고, 컨트롤러에서 @RequestBody나 HttpEntity 파라미터 사용
- 컨트롤러에서 @ResponseBody나 HttpEntity로 값 반환
REST 어노테이션
어노테이션 |
기능 |
@RestController |
Controller가 rest방식임을 명시(Controller + ResponseBody) |
@ResponseBody |
뷰 리졸버로 전달하는게 아니라 데이터를 요청한 화면으로 전달함을 명시(RestController에는 이미 포함) |
@PathVariable |
URL경로에 파라미터를 줄 수도 있으며, URL경로의 있는 값을 추출할 때 사용 |
@RequestBody |
JSON데이터를 자동으로 바인딩 처리 |
REST 전송방식 4가지
작업 |
전송방식 |
URL형식 |
등록 |
POST |
/reply/등록 |
조회 |
GET |
/reply/{id} |
수정 |
PUT |
/reply/{id} 제이슨타입 |
삭제 |
DELETE |
/reply{id} |
옵션(서버의 응답확인) |
OPTIONS |
서버의 응답을 미리 확인하는 요청 |
- 보내는 데이터 형식은 JSON형식 혹은 Form형식 사용
- REST API의 데이터 형식 제어
- 서버에서 제공하는 데이터는 선언한 타입
consumes= "application/json" , produces="application/json"
@RestController // 일반 컨트롤러와는 다른의미 - return에 담기는 데이터가 요청한 곳으로 응답함
public class RestBasicController {
@GetMapping("/hello")
public String hello() {
return "<h3>hello</h3>";
}
// 데이터를 보내는 방법
// 1. 객체 반환
//ResponseBody와 JSon-databind라이브러리가 해줍니다(자동으로)
@GetMapping("/bye")
public SimpleVO bye() {
return new SimpleVO(1, "홍길동", LocalDateTime.now());
}
// 2. 맵을 반환
@GetMapping("/getMap")
public Map<String, Object> getMap() {
Map<String, Object> map = new HashMap<>();
map.put("name", "홍길동");
map.put("age", 200);
map.put("data", new SimpleVO(1, "홍길동", LocalDateTime.now()));
return map;
}
// 3. 리스트로 반환
@GetMapping("/getList")
public List<SimpleVO> getList() {
List<SimpleVO> list = new ArrayList<>();
list.add(new SimpleVO(1, "홍길동", LocalDateTime.now()));
list.add(new SimpleVO(2, "홍길자", LocalDateTime.now()));
return list;
}
// 값을 받는 방법
// 요청의 다양한 타입 get
// @RequestParam이나, VO를 통해서 받을 수 있음
//
@GetMapping("/getData")
public String getData(@RequestParam(required = false) String name,
@RequestParam(required = false) int sno,
HttpServletRequest request) {
log.info(request.getRemoteAddr());
log.info(name + "," + sno);
return "success";
}
@GetMapping("/getData2")
public String getData2(SimpleVO vo) {
log.info(vo.toString());
return "success";
}
@GetMapping("/getData3/{name}/{sno}")
public String getData3(@PathVariable("name") String name,
@PathVariable("sno") int sno) {
log.info(name + "," + sno);
return "success";
}
/// ////////////////////////////////////////
// POST방식으로 데이터 받기
// 상대방이 데이터를 보내는 contentType을 지정함
// form타입 , JSON타입
// 보내는 입장이 form형식으로 보내는 경우
// @PostMapping("/getForm")
// public String getForm(SimpleVO vo){
// log.info(vo.toString());
// return "success";
// }
@PostMapping("/getForm")
public String getForm(@RequestParam("name") String name,
@RequestParam("mno") String mno) {
log.info(name + "," + mno);
return "success";
}
// 보내는 입장이 JSON타입으로 보내는 경우 -> VO또는 MAP타입으로
// @RequestBody -> JSON데이터를 Object맵핑
// { "name" : "홍길동" , "age" : 1 }
// @PostMapping("/getJson")
// public String getJson(@RequestBody SimpleVO vo){
// log.info(vo.toString());
// return "success";
// }
@PostMapping("/getJson")
public String getJson(@RequestBody Map<String, Object> map) {
log.info(map.toString());
return "success";
}
////////////////////////////////////
// produces - 서버에서 보내는 타입에 대한 명세 ( 아무것도 안적으면 기본 JSON타입)
// consumes - 서버에 보내는 타입에 대한 명세
@PostMapping(value = "/getResult",
produces = "text/plain",
consumes = "multipart/form-data")
public String getResult(@RequestBody String str) {
log.info(str);
return "<h3>성공</h3>";
}
// 응답문서 작성하기 ResponseEntity<보낼데이터타입>
@PostMapping("/createEntity")
public ResponseEntity<SimpleVO> createEntity() {
SimpleVO vo = new SimpleVO(2,"홍길동", LocalDateTime.now());
// 응답문서에 헤더에 대한 내역을 추가할 수 있음
HttpHeaders headers = new HttpHeaders();
headers.add("content-type","application/json");
headers.add("authorization","JSON WEB TOKEN");
headers.add("Access-control-allow-origin","*");
return new ResponseEntity<>(vo, headers,HttpStatus.OK);
}
////////////////////////////////////
// 명세에 맞춰 작성후 부메랑으로 호출
/*
요청 주소 - /api/v1/getData
메서드 - get
클라이언트에서 보내는 데이터 - num,name
서버 응답 데이터 SimpleVO
responseEntity로 응답
*/
@GetMapping("api/v1/getData")
public ResponseEntity<SimpleVO> getData(@RequestParam("num")int num,
@RequestParam("name")String name) {
SimpleVO vo = new SimpleVO(num,name, LocalDateTime.now());
return new ResponseEntity<>(vo,HttpStatus.OK);
}
/*
요청주소 - /api/v1/getInfo
메서드 - post
클라이언트에서 보내는 데이터 - JSON 타입의 num,name
서버에서 응답하는 데이터 - List<SimpleVO>
responseEntity로 응답
*/
@PostMapping(value= "api/v1/getInfo",
consumes="application/json")
public ResponseEntity<List<SimpleVO>> getInfo(@RequestBody Map<String,Object> map) {
List<SimpleVO> list = new ArrayList<>();
list.add(new SimpleVO((int)map.get("num"),(String)map.get("name"),LocalDateTime.now()));
return ResponseEntity.ok(list);
}
}