Spring Boot: POST , PUT, PATCH Method 요청 받기

김아무개·2023년 5월 3일
0

Spring Boot 🍃

목록 보기
5/95
post-custom-banner

POST , PUT , PATCH 요청은
HTTP 메세지의 Body 부분에 붙어서 날라오기 때문에,
RequestBody 어노테이션을 사용하며, 이것들은 선언 메서드 이름만 다를뿐 사용 형식은 같다.


+ Request / Response 헷갈릴때

Request는 클라이언트에서 서버로 값을 보내달라고 요청하는 것이기 때문에 Request로써 존재하는 것.
Response는 서버클라이언트의 요청에 대한 응답을 보내는 것이기 때문에 Response로써 존재한다.


+ JSON과 JAVA DTO 변수명 규칙이 다를 때 대응 방법

마지막 예제 참고! (사용 코드만 적어둠)

  1. class 위에 @JsonNaming 어노테이션을 사용하면
    Object Mapper라는 모듈이 동작할 때 해당 클래스 변수명을 JsonNaming에 지정한 형식으로 해석해서 값을 받아온다.

    	// 스네이크 표기법으로 변수명 일괄 해석
       @JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
    	class CarDTO {
    		...
    	}
  2. 변수 명 위에 @JsonProperty 어노테이션을 사용하면
    해당 변수만 JsonProperty어노테이션에 지정한 값으로 해석해서 값을 받아온다.

    	class CarDTO {
       	@JsonProperty("car_number")
    		private String CarNumber;
    	}

경로 변수를 받는 방법은 GET Method의 @PathVariable과 같음


Post 요청으로 들어오는 키-값이 뭔지 제대로 알지 못하는 경우

@RestController
@RequestMapping("/api/post")
public class PostApiController {

    // 이렇게 PostMapping 어노테이션에 경로 지정을 안해주면
    // class 부분의 requestMapping 어노테이션 경로로 post 요청시 이리로 들어옴
    @PostMapping // localhost:8888/api/post
    public void post(@RequestBody Map<String, Object> requestData) {
        requestData.forEach((s, o) -> {
            System.out.println("key : " + s);
            System.out.println("val : " + o.toString());
        });
    }

}


Post 요청값 Json으로 받기

1.

GET Method에서 QueryParameter를 DTO로 받을 때는 어노테이션을 안붙여도 가능했는데,
POST Method에서는 @RequestBody 어노테이션을 붙여줘 값을 받아온다.

2.

자바에서 DTO에 선언한 변수 이름과 , JSON으로 들어오는 변수 이름의 표기 형식이 다른 경우.
이럴 때는 자바의 DTO 파일에서 해당되는 변수에 @JsonProperty("JSON에 표기된 이름") 으로 적어주면 된다.
만약 , @JsonProperty로 변수 이름을 맞춰주지 않는다면 값을 받아오지 못한다.

@RestController
@RequestMapping("/api/post")
public class PostApiController {

    @PostMapping("/dto") // localhost:8888/api/post/dto
    public void dto(@RequestBody PostRequestDTO dto) {
        System.out.println(dto.toString());
    }

}

데이터 DTO 생성

class PostRequestDTO {
    private String name;
    private int year;
    private String address;

    @JsonProperty("phone_number")
    private String phoneNumber;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "PostRequestDTO{" +
                "name='" + name + '\'' +
                ", year=" + year +
                ", phoneNumber='" + phoneNumber + '\'' +
                ", address='" + address + '\'' +
                '}';
    }
}


POST 요청 데이터에서 Header에 숨겨온 값과 Body의 JSON값 받기

@RestController
@RequestMapping("/api/post")
public class PostApiController {

    @PostMapping("/req") // localhost:8888/api/post/req
    public String createReq(
    	@RequestBody CreateRequest req, 
        @RequestHeader(name = "user_id") String userId ) {
        return req.toString() + ", " + userId;
    }
}

dataDTO 생성

class CreateRequest {
    private String id;
    private Integer amount;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public Integer getAmount() {
        return amount;
    }

    public void setAmount(Integer amount) {
        this.amount = amount;
    }

    @Override
    public String toString() {
        return "CreateRequest{" +
                "id='" + id + '\'' +
                ", amount=" + amount +
                '}';
    }
}


PUT 요청 데이터에서 JSON 값 가져오는데, 객체가 2개일 때 예시

@RestController
@RequestMapping("/api/put")
public class PutController {

    @PutMapping("/json")
    public PutDTO put(@RequestBody PutDTO dto) {
        return dto;
    }
}

Dto 객체 1

@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
class PutDTO {
    private String name;
    private int abc;
    private List<CarDTO> carList;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAbc() {
        return abc;
    }

    public void setAbc(int abc) {
        this.abc = abc;
    }

    public List<CarDTO> getCarList() {
        return carList;
    }

    public void setCarList(List<CarDTO> carList) {
        this.carList = carList;
    }

    @Override
    public String toString() {
        return "PutDTO{" +
                "name='" + name + '\'' +
                ", abc=" + abc +
                ", carList=" + carList +
                '}';
    }
}

DTO 객체 2

@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
class CarDTO {
    private String name;
    private String carNum;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCarNum() {
        return carNum;
    }

    public void setCarNum(String carNum) {
        this.carNum = carNum;
    }

    @Override
    public String toString() {
        return "CarDTO{" +
                "name='" + name + '\'' +
                ", carNum='" + carNum + '\'' +
                '}';
    }
}

profile
Hello velog! 
post-custom-banner

0개의 댓글