1. 개요

이 사용방법(예제)에서는 REST 아키텍처 내에서 자주 사용하는 두 가지 중요한 HTTP 메서드인 PUT 및 POST를 살펴봅니다. 개발자 가 RESTful 웹 서비스를 설계하는 동안 때때로 이 두 가지 방법 중 하나를 선택하는 데 어려움을 겪는다는 것은 비밀이 아닙니다 . 따라서 Spring Boot에서 RESTful 애플리케이션을 간단하게 구현하여 이 문제를 해결할 것입니다.

2. PUT 대 POST 딜레마

일반적인 REST 아키텍처 에서 클라이언트는 리소스를 생성, 검색, 수정 또는 삭제하기 위해 HTTP 메서드 형식의 요청을 서버에 보냅니다. PUT과 POST를 모두 사용하여 리소스를 생성할 수 있지만 의도된 애플리케이션 측면에서 둘 사이에는 상당한 차이가 있습니다.

RFC 2616 표준 에 따르면 , Request-URI로 식별되는 기존 리소스의 하위 항목으로 동봉된 엔터티를 서버가 수락하도록 요청하려면 POST 메서드를 사용해야 합니다. 이는 POST 메서드 호출이 리소스 컬렉션 아래에 자식 리소스를 생성함을 의미합니다.

반대로, 제공된 Request-URI 아래 동봉된 엔터티를 서버가 저장하도록 요청하려면 PUT 메서드를 사용해야 합니다. 요청 URI가 서버의 기존 리소스를 가리키는 경우 제공된 엔터티는 기존 리소스의 수정된 버전으로 간주됩니다. 따라서 PUT 메서드 호출은 새 리소스를 생성하거나 기존 리소스를 업데이트합니다 .

메서드 간의 또 다른 중요한 차이점은 PUT은 멱등 메서드인 반면 POST는 그렇지 않다는 것 입니다. 예를 들어 PUT 메서드를 여러 번 호출하면 동일한 리소스가 생성되거나 업데이트됩니다. 반대로 여러 POST 요청은 동일한 리소스를 여러 번 생성하게 합니다.

3. 샘플 신청

PUT과 POST의 차이점을 보여주기 위해 Spring Boot 를 사용하여 간단한 RESTful 웹 애플리케이션을 생성합니다 . 응용 프로그램은 사람들의 이름과 주소를 저장합니다.

3.1. 메이븐 의존성

먼저 Spring Web, Spring Data JPA 및 메모리 내 H2 데이터베이스에 대한 의존성을 pom.xml 파일에 포함해야 합니다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

3.2. 도메인 엔터티 및 리포지토리 인터페이스

먼저 도메인 개체를 생성하여 시작하겠습니다. 주소록 의 경우 개인의 주소 정보를 저장하는 데 사용할 Address 라는 Entity 클래스를 정의합니다 . 간단하게 하기 위해 Address 엔터티 에 name , citypostalCode 의 세 필드를 사용합니다 .

@Entity
public class Address {

    private @Id @GeneratedValue Long id;
    private String name;
    private String city;
    private String postalCode;

    // constructors, getters, and setters
}

다음 단계는 데이터베이스에서 데이터에 액세스하는 것입니다. 간단히 하기 위해 Spring Data JPA의  JpaRepository를 활용합니다. 이렇게 하면 추가 코드를 작성하지 않고도 데이터에서 CRUD 기능을 수행할 수 있습니다.

public interface AddressRepository extends JpaRepository<Address, Long> {
}

3.3. REST 컨트롤러

마지막으로 애플리케이션에 대한 API Endpoints을 정의해야 합니다. 클라이언트의 HTTP 요청을 소비하고 적절한 응답을 다시 보낼 RestController 를 생성합니다 .

여기서는 새 주소를 생성 하고 데이터베이스에 저장하기 위한 @ PostMapping 과 요청 URI를 기반으로 주소록의 내용을 업데이트하기 위한 @PutMapping 을 정의합니다. URI를 찾을 수 없으면 새 주소를 만들어 데이터베이스에 저장합니다.

@RestController
public class AddressController {

    private final AddressRepository repository;

    AddressController(AddressRepository repository) {
        this.repository = repository;
    }

    @PostMapping("/addresses")
    Address createNewAddress(@RequestBody Address newAddress) {
        return repository.save(newAddress);
    }

    @PutMapping("/addresses/{id}")
    Address replaceEmployee(@RequestBody Address newAddress, @PathVariable Long id) {

        return repository.findById(id)
            .map(address -> {
                address.setCity(newAddress.getCity());
                address.setPin(newAddress.getPostalCode());
                return repository.save(address);
            })
            .orElseGet(() -> {
                return repository.save(newAddress);
            });
    }
    //additional methods omitted
}

3.4. cURL 요청

이제 cURL을 사용하여 서버에 샘플 HTTP 요청을 보내 개발된 애플리케이션을 테스트할 수 있습니다.

새 주소를 만들기 위해 데이터를 JSON 형식으로 묶고 POST 요청을 통해 보냅니다.

curl -X POST --header 'Content-Type: application/json' \
    -d '{ "name": "John Doe", "city": "Berlin", "postalCode": "10585" }' \ 
    http://localhost:8080/addresses

이제 생성한 주소의 내용을 업데이트하겠습니다. URL에서 해당 주소 의 ID 를 사용하여 PUT 요청을 보냅니다 . 이 예에서는 방금 만든 주소 의 도시우편 번호 섹션을 업데이트합니다. id =1 로 저장되었다고 가정합니다 .

curl -X PUT --header 'Content-Type: application/json' \
  -d '{ "name": "John Doe", "city": "Frankfurt", "postalCode": "60306" }' \ 
  http://localhost:8080/addresses/1

4. 결론

이 기사에서는 HTTP 메서드 PUT과 POST 간의 개념적 차이점에 대해 설명했습니다. 또한 RESTful 애플리케이션 개발을 위해 Spring Boot 프레임워크를 사용하여 이러한 메서드를 구현하는 방법을 배웠습니다.

결론적으로 새로운 리소스를 생성하려면 POST 방식을 사용하고, 기존 리소스를 업데이트하려면 PUT 방식을 사용해야 합니다.

항상 그렇듯이 이 기사의 코드는 GitHub에서 사용할 수 있습니다 .

REST footer banner