Spring Boot (+ RESTful)

RESTful 웹 서비스 구축 - @GetMapping / responseCode

wy-family 2024. 12. 31. 23:27

@PostMapping 을 했고, 여기서는 @GetMapping 을 할것.

 

// 전체 목록 보여주기
    @GetMapping(value = "/books", produces = "application/json")
    @ApiResponse(responseCode = "200", description = "List of books")
    @Operation(summary="List book API")
    public List<BookViewDTO> books(){
        List<BookViewDTO> books=new ArrayList<>();
        for(Book book : bookService.findAll()){
            books.add(new BookViewDTO(book.getId(), book.getSubject(), book.getPrice(), book.getAuthor(),
                    book.getPage(), book.getCreatedAt()));
        }
        return books; // JSON Array :[{    },{    }…]
    }

    // 특정 목록 보여주기
    @GetMapping(value = "/books/{id}", produces = "application/json")
    @ApiResponse(responseCode = "200", description = "id에 해당하는 책정보를 출력")
    @Operation(summary="book id API")
    public ResponseEntity<?> findById(@PathVariable Long id){
        Optional<Book> optionalBook=bookService.findById(id);
        Book book;
        if(optionalBook.isPresent()){
            book=optionalBook.get();
        }else{
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
        }
        BookViewDTO bookViewDTO=new BookViewDTO(book.getId(), book.getSubject(), book.getPrice(),
                book.getAuthor(), book.getPage(), book.getCreatedAt());
        return ResponseEntity.ok(bookViewDTO);
    }

@GetMapping(value = "/books", produces = "application/json")

여기서, value = 라는 건 굳이 안 적어도 되지만, 명시하게 되면 가독성이 좋아진다.

produces = "application/json" 도 굳이 안 적어도 되지만

swagger에 응답 타입이 무엇인지 알려주기 위해서, 가독성이 좋게 하기 위해서 쓴다.

 

@ApiResponse 에 쓰인 responseCode 에 대해서 간단하게 공부를 해보겠다.

HTTP Response Code(응답 코드)는 클라이언트가 서버에 요청(Request)을 보낸 후, 서버가 이를 처리한 결과를 클라이언트에 알려주는 3자리 숫자 코드입니다. 이 코드는 서버의 응답 상태와 요청의 성공 여부를 나타냅니다. 크게 5가지 범주로 나뉘며, 각 범주마다 의미가 다릅니다.


1. 1xx (정보 응답)

  • 의미: 요청을 받았으며, 이를 처리 중임을 나타냅니다.
  • 주요 코드:
    • 100 Continue: 요청의 일부를 성공적으로 받았으며, 계속 진행하라는 의미.
    • 101 Switching Protocols: 프로토콜 전환 요청이 수락되었음을 나타냄.

2. 2xx (성공 응답)

  • 의미: 요청이 성공적으로 처리되었음을 나타냅니다.
  • 주요 코드:
    • 200 OK: 요청이 성공적으로 처리되었음.
    • 201 Created: 요청이 성공적으로 처리되었으며, 새로운 리소스가 생성되었음.
    • 204 No Content: 요청이 성공적으로 처리되었으나, 응답 본문이 없음.

3. 3xx (리다이렉션)

  • 의미: 요청 완료를 위해 추가적인 작업이 필요함.
  • 주요 코드:
    • 301 Moved Permanently: 요청한 리소스가 영구적으로 이동되었음.
    • 302 Found: 요청한 리소스가 임시적으로 다른 위치로 이동되었음.
    • 304 Not Modified: 클라이언트가 요청한 리소스가 수정되지 않았으므로, 캐시된 버전을 사용하라는 의미.

4. 4xx (클라이언트 에러)

  • 의미: 클라이언트 요청에 문제가 있어 처리되지 않음을 나타냅니다.
  • 주요 코드:
    • 400 Bad Request: 잘못된 요청으로 인해 서버가 이해할 수 없음.
    • 401 Unauthorized: 인증이 필요하며, 인증 정보가 없거나 잘못됨.
    • 403 Forbidden: 요청이 서버에서 거부됨 (권한 문제).
    • 404 Not Found: 요청한 리소스를 찾을 수 없음.

5. 5xx (서버 에러)

  • 의미: 서버 측 문제로 인해 요청을 처리하지 못했음을 나타냅니다.
  • 주요 코드:
    • 500 Internal Server Error: 서버에서 처리 중 알 수 없는 오류가 발생함.
    • 501 Not Implemented: 서버에서 요청된 기능이 구현되지 않음.
    • 503 Service Unavailable: 서버가 요청을 처리할 준비가 되지 않음 (과부하, 유지보수 등).

💡 Response Code의 활용

  1. 디버깅: 클라이언트와 서버 간 통신 문제를 파악하는 데 도움.
  2. 예외 처리: 각 상태 코드에 맞는 응답 처리를 구현하여 사용자 경험을 개선.
  3. RESTful 설계: RESTful API의 응답 상태를 명확히 하기 위해 필수적.

 

 


우선, application.yml 에서, ddl-auto: create 라고 되어 있기 때문에, 전에 저장했던 데이터는 다 사라지고 새로운 table 을 만들게 된다. run 을 해보고 나서, swagger도 들어가서 확인을 해보자.

아무런 데이터가 없을 때에 get 해보고, post 방식으로 데이터 저장한 뒤에 다시 get 을 해보자.

GET - /api/books (전체 목록 가져오기) 를 try it out / execute 를 해보자.

 

Code 200 으로, 성공은 했지만, 데이터가 하나도 없기 때문에 [ ] 이 나온다.

데이터를 넣기 위해서는 POST 를 해야 한다. 

 

Code 200 으로 제대로 저장이 되었다.

GET 을 해보자.

 

성공했다.

그리고 Response body 를 제대로 확인해보자.

Server response, 서버가 응답을 해준 응답코드값 200과 JSON 데이터, [ { }, { }, .... ] 의 ArrayList 형태임을 알 수 있다.

POST 방식으로 또 하나의 데이터를 넣어보겠다. 그리고 나서 GET 으로 전체 목록을 가져와보겠다.

 

자, 이제 특정 레코드를 얻어오는 걸 해보자.

특정 레코드를 얻어오려면, id 값을 입력을 해야 한다.

그러므로, swagger API 가 그걸 잘 파악을 하고 있기 때문에 입력하라는 칸이 있는 것!

지금은 id 1 과 2가 들어가있으므로, 1 을 입력해서, id 값을 넘겨주도록 하자.

id 값을 1, 2 가 아닌 없는 값을 입력해보자.

 

여기까지가 @GetMapping 이었다.

다음에 @PutMapping, @DeleteMapping 을 해보면, 가장 일반적인 CRUD 의 RESTful API 를 만들어보게 된다.