PUT 방식은 HTTP 메서드 중 하나로, 리소스를 생성하거나 업데이트할 때 사용됩니다. 주로 RESTful API에서 특정 리소스를 완전히 대체하거나 수정할 때 사용됩니다.
주요 특징
- 전체 업데이트:
- PUT 요청은 클라이언트가 서버에 특정 리소스의 전체 데이터를 보내 해당 리소스를 완전히 대체하거나 새로 생성하는 요청입니다. 즉, 리소스의 일부가 아닌 전체 데이터를 전송하여 갱신합니다.
- 멱등성:
- PUT 요청은 멱등성을 가집니다. 즉, 동일한 요청을 여러 번 보내도 결과가 동일합니다. 예를 들어, 동일한 데이터를 PUT 요청으로 여러 번 보내도 리소스 상태는 변하지 않습니다.
- 리소스 식별:
- PUT 요청은 URL을 통해 업데이트할 리소스를 명확히 식별합니다. 예를 들어, /users/1 URL로 PUT 요청을 보내면, ID가 1인 사용자를 업데이트하거나, 해당 리소스가 존재하지 않으면 새로 생성합니다.
요청 데이터
**PUT 방식**은 HTTP 메서드 중 하나로, **리소스를 생성하거나 업데이트**할 때 사용됩니다. 주로 RESTful API에서 **특정 리소스를 완전히 대체하거나 수정**할 때 사용됩니다.
### **주요 특징**
- **전체 업데이트**:
- **PUT 요청**은 클라이언트가 서버에 특정 리소스의 **전체 데이터를 보내** 해당 리소스를 **완전히 대체**하거나 **새로 생성**하는 요청입니다. 즉, 리소스의 일부가 아닌 전체 데이터를 전송하여 갱신합니다.
- **멱등성**:
- **PUT 요청**은 **멱등성**을 가집니다. 즉, 동일한 요청을 여러 번 보내도 결과가 동일합니다. 예를 들어, 동일한 데이터를 PUT 요청으로 여러 번 보내도 리소스 상태는 변하지 않습니다.
- **리소스 식별**:
- **PUT 요청**은 **URL**을 통해 **업데이트할 리소스**를 명확히 식별합니다. 예를 들어, `/users/1` URL로 PUT 요청을 보내면, ID가 1인 사용자를 업데이트하거나, 해당 리소스가 존재하지 않으면 새로 생성합니다.
> **요청 데이터**
>
package com.tenco.demo_v1.dto;
import java.util.List;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
@Data
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserDTO {
private String name;
private Integer age;
//@JsonProperty("car_list")
private List<CarDTO> carList;
// 비 정적 내부 클래스
class CarDTO {
private String name;
//@JsonProperty("car_number")
private String carName;
}
}
PutApiController 생성
package com.tenco.demo_v1.controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import com.tenco.demo_v1.dto.UserDTO;
@RestController // IoC (싱글톤 패턴으로 관리 됨 )
public class PutApiController {
/**
* 주소설계
* http://localhost:8080/put/demo1/100
*
* @return JSON
*/
@PutMapping("/put/demo1/{id}")
public UserDTO putMethodName(@PathVariable(name = "id") String id,
@RequestBody UserDTO userDTO) {
System.out.println("id : " + id);
System.out.println("userDTO " + userDTO.toString());
// 메세지 컨버터 동작 (UserDTO) ->> JSON 반환을 해서 ---> 클라이언트에 응답처리 한다.
return userDTO;
}
// @PutMapping("/put/demo1/{id}")
// public UserDTO putMethodName(@PathVariable(name = "id") String id) {
// System.out.println("id : " + id);
// // System.out.println("userDTO " + userDTO.toString());
// // 메세지 컨버터 동작 (UserDTO) ->> JSON 반환을 해서 ---> 클라이언트에 응답처리 한다.
// return null;
// }
}
UserDTO 수정하기
package com.tenco.demo_v1.dto;
import java.util.List;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;
import lombok.Getter;
import lombok.ToString;
@Data
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class UserDTO {
private String name;
private Integer age;
//@JsonProperty("car_list")
private List<CarDTO> carList;
// 비 정적(static) 내부 클래스 (x)
// 스프링 부트 DTO 설계시 내부 클래스는 static 내부 클래스로 만들자
@Getter // 반드시 있어야 한다. !!!
@ToString
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
static class CarDTO {
private String name;
//@JsonProperty("car_number")
private String carName;
}
}
'Spring boot > 개념 공부' 카테고리의 다른 글
스프링 부트 DB 접근 기술 ORM (1) | 2024.10.01 |
---|---|
DELETE 방식에 이해 및 실습 (1) | 2024.09.27 |
전략 패턴 (1) | 2024.09.27 |
어댑터 패턴 (2) | 2024.09.27 |
팩토리 패턴 (0) | 2024.09.27 |