REST API - GET, POST,PUT,DELETE

yoonhyojin·2024년 6월 5일

Java

목록 보기
2/2
post-thumbnail

사용환경

  • Intelli J - Java
  • postman

[프로젝트 생성]

[Dependency]

🤔 용어 정리

  • Path Variable: 주소 내에 정보를 전달하는 방법
    • 단점: 주소가 노출되기 때문에 주소의 변경 위험이 있음
  • Query Parameter: 특정 정보의 필터링을 걸 때 사용
    • ?로 시작하고, 이어주는 형태는 &으로 묶어준다.
      - 객체로 받기(변수의 내용이 많을 때 코드의 양을 줄여줄 수 있음)
      - 직접 파싱하기
  • Data Body: HTTP body로 데이터를 전달하여 외부 주소에 해당 데이터가 노출되어지지 않아 안전성 및 보안성이 높음

🧐 JSON

  • json에서 다룰 수 있는 데이터의 형태
    => key : value 형태
    - String: 문자
    - Number: 소수점 포함한 숫자(int, double, float과 같은 데이터타입을 구분하지 않음)
    - Boolean: true/false
    - []: array (배열에 담긴 타입은 동일해야함, array안에 object가 들어갈 수 있음)
    - {}: obiect

  • json을 표현하는 방식

    • snack case: 모든 글자를 소문자, 구분해야하는 부분은 언더바(user_name, user_age)
      => json은 int가 아닌 Integer를 사용해야함.(기본 int는 default값이 0이기 때문)
      => @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
    • camel case: 시작은 소문자, 구분해야하는 부분은 대문자(userName, userAge)

🎈 GET method

  • 의미: 리소스 취득
  • 데이터 전달 방법: Path Variable 가능, Query Parameter 가능, DataBody 불가능
  • 멱등성 O, 안정성 O
    [RetApiController]
package org.example.restapi.controller;

import org.example.restapi.controller.model.BookQueryParam;
import org.springframework.web.bind.annotation.*;

//클라이언트가 서버에 요청을 하기 위해서는 진입점의 주소를 작성해주어야 함: controller
@RestController
@RequestMapping("/api")  // 받을 주소 지정 즉, api로 시작되는 주소는 아래 controller로 요청을 받음
public class RestApiController {

    //http://localhost:8080/api/hello
    @GetMapping(path= "/hello")
    public String hello() {
        return "hello spring boot";
    }

    //http://localhost:8080/api/출력하고자 하는 메세지 입력
    @GetMapping(path = "/echo/{message}")
    //public String echo(@PathVariable(name = "message") String msg // path 변수 이름과 같지 않은 경우 name으로 매칭시킬 이름을 지정해주면 됨
    public String echo(@PathVariable String message){
        System.out.println("echo message :"+message);
        return message;
    }

    //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(name = "issued_day") String issuedDay
    ){
        System.out.println(category);
        System.out.println(issuedYear);
        System.out.println(issuedMonth);
        System.out.println(issuedDay);
    }

    //http://localhost:8080/api/book2?category=IT&issuedYear=2023&issuedMonth=01&issuedDay=31
    @GetMapping(path = "/book2")
    public void queryParamDto(
            BookQueryParam bookQueryParam
    ){
        System.out.println(bookQueryParam);
    }
}

[BookQueryParam]

package org.example.restapi.controller.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data //lombok -> 기본 생성자와 getter, setter 자동 생성됨
@AllArgsConstructor //전체 파라미터를 가진 생성자 (대신 기본 생성자가 삭제됨)
@NoArgsConstructor //기본 생성자 생성
public class BookQueryParam {
    private String category;
    private String issuedYear;
    private String issuedMonth;
    private String issuedDay;
}

🎈 POST method

  • 의미: 리소스 생성, 추가
  • 데이터 전달 방법: Path Variable 가능, Query Parameter 가능하지만 적절하지 않음, DataBody 가능
  • 멱등성 X, 안정성 X
{
  "key1" : "value1",
  "key2" : "value2",
  "key3" : "value3",
}

[PostApiController]

package org.example.restapi.controller;

import org.example.restapi.model.BookRequest;
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 {

    // http://localhost:8080/api/post
    @PostMapping("/post") //post 방식은 default가 객체로 받아야함
    public BookRequest post(
            @RequestBody BookRequest bookRequest
            //@RequestBody는 POST, PUT 방식에서 HTTP BODY로 들어오는 데이터를 해당 객체에 매핑을 해줌을 의미함
    ) {
        System.out.println(bookRequest);
        return bookRequest;  // postman의 Body에서 서버의 응답을 확인 할 수 있음, return 하는 타입에 따라 content-type이 바뀜
    }
}

[BookRequest]

package org.example.restapi.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;
}

[postman]

🎈 PUT method

  • 의미: 리소스 갱신, 생성(갱신이 기본형태이고, 해당 리소스가 없으면 생성 => POST와의 차이점)
  • 데이터 전달 방법: Path Variable 가능, Query Parameter 가능하지만 적절하지 않음, DataBody 가능
  • 멱등성 O, 안정성 X

[PutApiController]

package org.example.restapi.controller;

import lombok.extern.slf4j.Slf4j;
import org.example.restapi.model.UserRequest;
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 back
@RestController
@RequestMapping("/api")
public class PutApiController {
    @PutMapping("/put")
    public void put(
            @RequestBody UserRequest userRequest
    ){
        log.info("Request: {}", userRequest); // 중괄호는 뒤에 있는 객체(userRequest)가 매핑이 되며, tostring()이 호출이 됨
    }
}

[UserRequest]

package org.example.restapi.model;

import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserRequest {
    private String name;
    private int age;
    private String email;
    private Boolean isKorean;
    //private boolean isKorean; //is_korean
    //private 타입의 boolean은 default 값이 false임
    //is 시리즈는 boolean형을 뜻하기 때문에, set method가 setIsKorean이 아닌 setKorean으로 생성됨
    //해결방법: 대문자로 시작하는 Boolean 사용
}

🎈 DELETE method

  • 의미: 리소스 삭제
  • 데이터 전달 방법: Path Variable 가능, Query Parameter 가능, DataBody 불가능
  • 멱등성 O, 안정성 X
package org.example.restapi.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

@Slf4j

@RestController //클라이언트가 서버에 요청을 하기 위해서는 진입점의 주소를 작성해주어야 함: controller
@RequestMapping("/api")  // 받을 주소 지정 즉, api로 시작되는 주소는 아래 controller로 요청을 받음
public class RestApiController {
    
    @DeleteMapping(path = {"/user/{name}/delete","/user/{name}/del"})
    // ("/delete")와 (path = {"/delete","/del"}) 둘다 가능 -> 후자는 경로를 여러개 넣을 수 있음
    public void delete(
            @PathVariable String name
    ){
        log.info("user-name: {}", name );
    }
}
profile
내가 보려고 정리하는 블로그📝

0개의 댓글