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는 양방향 통신
- 기존의 @Controller는 return에 Model을 담아서 뷰에 전달하는 방식으로 사용
- REST API는 서버간 통신을 위한 Controller
- @RestController는 return에 처리하는 데이터를 조금 다른 타입으로 처리하는 형식
- 객체(데이터)를 반환할 수도 받을수도 있음
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 파라미터 사용
- HTTP 응답 데이터 생성
- 컨트롤러에서 @ResponseBody나 HttpEntity로 값 반환
어노테이션 기능 @RestController Controller가 rest방식임을 명시(Controller + ResponseBody) @ResponseBody 뷰 리졸버로 전달하는게 아니라 데이터를 요청한 화면으로 전달함을 명시(RestController에는 이미 포함) @PathVariable URL경로에 파라미터를 줄 수도 있으며, URL경로의 있는 값을 추출할 때 사용 @RequestBody JSON데이터를 자동으로 바인딩 처리
작업 전송방식 URL형식 등록 POST /reply/등록 조회 GET /reply/{id} 수정 PUT /reply/{id} 제이슨타입 삭제 DELETE /reply{id} 옵션(서버의 응답확인) OPTIONS 서버의 응답을 미리 확인하는 요청
- 보내는 데이터 형식은 JSON형식 혹은 Form형식 사용
- REST API의 데이터 형식 제어
- 소비자(consumers)
- 보내는 데이터는 반드시 선언한 타입
- 제공자(produces)
- 서버에서 제공하는 데이터는 선언한 타입
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); } }