Fullstack-Study-241204-250625

커리큘럼(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의 메시지 컨버터

1. @RequestBody

  • 클라이언트(주로 웹 브라우저나 모바일 앱)에서 보낸 HTTP 요청의 본문(body) 데이터를 Java 객체로 변환
  • 클라이언트에서 JSON 형식으로 데이터를 보내면, 그 데이터를 Java의 객체로 변환하여 컨트롤러 메서드의 파라미터로 받을 수 있음
  • 주로 POST, PUT요청에서 사용

2. @ResponseBody

  • Java 객체를 HTTP 응답 본문에 포함된 데이터로 변환하여 클라이언트에게 전달
  • Java 객체를 JSON이나 XML로 변환해서 응답 본문에 담아서 클라이언트에게 전달할 수 있음
  • 주로 GET 요청에서 사용되며, 클라이언트가 서버로부터 JSON, XML, 텍스트 등을 요청할 때 사용
  • @RestController@Controller@ResponseBody를 합친 기능
  • 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 서버의 응답을 미리 확인하는 요청
  • 소비자(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);
    }
}