관리 메뉴

코딩하는 락커

[Spring Boot를 이용한 RESTful Web Services 개발] 13~15강 본문

🍃 Spring/🌱 Spring Boot를 이용한 RESTful Web Service

[Spring Boot를 이용한 RESTful Web Services 개발] 13~15강

락꿈사 2022. 2. 6. 18:04

User Controller - POST HTTP Method

  •  HTTP Method 중에서 Post를 처리할 수 있도록 @PostMapping("url") 어노테이션 사용
  • 클라이언트로부터 post method를 통해서 추가하고자 하는 메소드를 user domain 타입으로 받기
  • Post, Put등 클라이언트로부터 Form data 타입이 아닌 json, xml등 오브젝트 형태의 데이터를 받기 위해서 매개변수 타입에 @RequestBody 선언해줘야 함
  • 클라이언트에서 전달하는 데이터 포맷에 일치하는 필드의 값을 매개변수 클래의 값과 매핑시켜서 저장
@PostMapping("/users")
public void createUser(@RequestBody User user){ //전달받고자 하는 데이터가 RequestBody 형식의 역할을 함을 의미
    User savedUser = service.save(user);
}

사용자 등록을 위해 POST Method로 /users URI 호출하여 데이터 전달
결과를 확인하기 위해 GET Method로 /users URI 호출

HTTP Status Code 제어

  • 응답코드 값을 제어하기 위해서 Servlet URI Component build 클래스 사용
  • 요청된 사용자 추가 후, 어떤 URI를 통해서 추가된 리소스 확인할 수 있는지도 반환 (이때 반환된 리소스로 상세 정보를 확인할 수 있음)
public ResponseEntity<User> createUser(@RequestBody User user){ //반환하는 값이 User 클래스 값임
    User savedUser = service.save(user);

    URI location = ServletUriComponentsBuilder.fromCurrentRequest()// 현재 가지고 있는 Request 값을 사용한다는 의미
            .path("/{id}")// 반환할 때 URI 뒤에 /{id}를 추가
            .buildAndExpand(savedUser.getId()) //{id}에 savedUser.getId()값을 넣어줌
            .toUri(); //위 모든 것을 URI형태로 변환

    return ResponseEntity.created(location).build(); //위 location을 빌드해서 반환함
}

사용자 등록을 위해 POST Method로 /users URI 호출하여 데이터 전달하자 status coder가 201로 변경된 것 확인
Key값 location을 확인해보니 id가 포함된 URI가 전달된 것을 확인할 수 있음
location의 value값인 URI를 GET Method로 요청하자 정상적으로 사용자의 상세 정보가 반환된 것 확인

 

HTTP Status Code 제어를 위한 Exception Handling

존재하지 않는 id 100의 사용자를 요청했는데 status code 200ok를 발생

  • 존재하지 않는 데이터를 클라이언트가 요청했을 경우 200ok가 아니라 다른 Status Code를 발생시키기
@GetMapping("/users/{id}")
public User retrieveUser(@PathVariable int id){
    User user = service.findOne(id);
    if (user == null){
        throw new UserNotFoundException(String.format("ID[%s] not found", id));
    }
    return user;
}
package com.example.restfulwebservice.user;

public class UserNotFoundException extends RuntimeException { //실행시 발생하는 오류로 처리
    public UserNotFoundException(String message) {
        super(message); //생성자는 부모 클래스로부터 전달받은 메시지로 처리
    }
}

id 100번의 존재하지 않는 사용자를 요청하자 500번 status code를 발생시킴

 

 
  • HTTP Status Code 오류
    • 2XX : 요청 성공
    • 4XX : 클라이언트 요청 오류
    • 5XX : 서버 오류
  • 500번대는 서버 오류이므로 500번대 오류 말고 다른 오류를 발생시키기
  • @ResponseStatus(NOT_FOUND) 어노테이션을 선언하여 404번 오류 발생시키기
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(HttpStatus.NOT_FOUND)
public class UserNotFoundException extends RuntimeException { 
    public UserNotFoundException(String message) {
        super(message); 
    }
}

id 100번의 존재하지 않는 사용자를 요청하자 404번 status code를 발생시킴

 

Comments