REST API - GET, POST, PUT, DELETE

      의미 CRUD 역동성 안정성 Path
    Variable
    Query
    Parameter
    DataBody
    GET 리소스 취득 R O O O O X
    POST 리소스 생성, 추가 C X X O O
    PUT 리소스 갱신, 생성 C / U O X O O
    DELETE 리소스 삭제 D O X O O X
    HEAD 헤더 데이터 취득 - O O - - -
    OPTIONS 지원하는 메소드 취득 - O - - - -
    TRACE 요청메시지 반환 - O - - - -
    CONNECT 프록시 동작의 터널 접속으로 변경  - X - - - -

     

     

    ✅ GET 방식

    package com.example.rest_api.model;
    
    import lombok.Data;
    
    @Data
    public class BookQueryParam {
        private String category;
        private String issuedYear;
        private String issuedMonth;
        private String issuedDay;
    }

     

     

     

    - Lombok 클래스

    : getter, setter 메소드를 자동적으로 생성해주는 어노테이션

       
    @NoArgsConstructor 기본 생성자를 만들어주는 어노테이션
    @AllArgsConstructor 모든 필드 값을 사용하는 생성자를 만들어주는 어노테이션
    @RequiredArgsConstructor final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 만들어주는 어노테이션
    @Data @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor를 모두 사용할 수 있다.

     

     

     

    - Path Variable

    : 주소 내에 정보를 전달하는 방법

    ex) https://www.foo.bar/user-id/100

          https://www.foo.bar/user-id/100/card-id/200

    package com.example.rest_api.controller;
    
    //RestApiController.java
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/api") //api 주소로 받음
    public class RestApiController {
    
        @GetMapping(path = "/hello")
        public String hello() {
            var html = "<html> <body> <h1> Spring Boot </h1> </body> </html>";
            return html;
        }
    
    
        //http://localhost:8080/api/echo/hello
    
        //Get 메서드로 받음
        //path 사이 중괄호는 받을 메서드
        @GetMapping(path = "/echo/{messagee}/age/{age}/is-man/{isMan}")
        public String echo(
                //메시지 변수 같이 입력 불가능하면 name 지정해주기
                @PathVariable(name = "message") String msg,
    
                //String 타입 변수 외에 다른 타입 받아보기
                @PathVariable int age,
                @PathVariable boolean isMan
        ) {
            System.out.println("echo message: " + msg);
            System.out.println("age message: " + age);
            System.out.println("isMan message: " + isMan);
    
            //TODO 대문자로 변환해서 RETURN
            return msg.toUpperCase();
        }
    }

     

     

     

     

    - Query Parameter

    : 특정 정보의 필터링을 걸 때 사용한다.

    (?로 시작하고, 이어주는 형태는 &로 묶어준다)

    ex) https://www.foo.bar/book?user-id=100&category=IT

     

    //RestApiController.java
    
    @RestController
    @RequestMapping("/api") //api 주소로 받음
    public class RestApiController {
    	
        // http://localhost:8080/api/book?category=IT&issuedYear=2023&issued-month=01&issued_day=31
        @GetMapping(path = "/book")
        public void queryParam(
        	@RequestParam String category,
            @RequestParam String issuedYear,
            @RequestParam(name = "issued-month") String issuedMonth,
            @RequestParam String issued_day
        ){
        	System.out.println(category);
            System.out.println(issuedYear);
            System.out.println(issuedMonth);
            System.out.println(issued_day);
        	
        }
        
        //객체를 통해 파싱하는 방법
        @GetMapping(path = "/book2")
        public void queryParamDto(
        	@RequestParam String category,
            @RequestParam String issuedYear,
            @RequestParam(name = "issued-month") String issuedMonth,
            @RequestParam String issued_day
        ){
        	System.out.println(category);
            System.out.println(issuedYear);
            System.out.println(issuedMonth);
            System.out.println(issued_day);
        	
        }
    }

     

     

     

     

     

     

     

     

     


    ✅ POST 방식

    : HTTP Body에서 정보를 전달 받을 수 있음.

     

    - RequestBody

    package com.example.rest_api.model;
    
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class BookRequest {
    
        private String name;
        private String number;
        private String category;
    }
    package com.example.rest_api.controller;
    
    
    import com.example.rest_api.model.BookRequest;
    import com.example.rest_api.model.UserRequest;
    import org.apache.catalina.User;
    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;
    
    @RestController
    @RequestMapping("/api")
    public class PostApiController {
    
        //Post 방식은 디폴트가 객체이다.
        @PostMapping("/post")
        public BookRequest post(
                //body로 들어오는 객체를 해당 변수에 매핑
                @RequestBody BookRequest bookRequest
        ){
            System.out.println(bookRequest);
            return bookRequest;
        }
    
        //TODO 사용자의 이름, 전화번호, 이메일을 받는 POST Method
        @PostMapping("/user")
        public void user(
                @RequestBody UserRequest userRequest
        ){
            System.out.println(userRequest);
        }
    }

     

     

    - json

     

    ✔️ 형태

    key : value

       "name" : Spring Boot",

       "number" : 100",

       "category" : JAVA"

    }

     

    ✔️ json으로 받을 수 있는 값

    String : 문자

    Number : 숫자 (소수점, int double, float)

    Boolean: true / false

    {} : Object

     

     

     

     

     

     

     

     

     

     


    ✅ PUT 방식

    → 주로 갱신할 때 많이 사용함

    package com.example.rest_api.model;
    
    import com.fasterxml.jackson.annotation.JsonManagedReference;
    import com.fasterxml.jackson.databind.PropertyNamingStrategies;
    import com.fasterxml.jackson.databind.PropertyNamingStrategy;
    import com.fasterxml.jackson.databind.annotation.JsonNaming;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    //Json 문자 파싱
    @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
    public class UserRequest {
        private String userName;
        private Integer userAge;
        private String email;
        private Boolean isKorean;
    }
    package com.example.rest_api.controller;
    
    import com.example.rest_api.model.UserRequest;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.web.bind.annotation.PutMapping;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @Slf4j //log
    @RestController
    @RequestMapping("/api")
    public class PutApiController {
    
        @PutMapping("/put")
        public void put(
                @RequestBody
                UserRequest userRequest
        ){
            log.info("Request: {}", userRequest);
        }
    
    }

     

     

     

    ✅ DELETE 방식

     

     

    댓글