@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의 활용
- 디버깅: 클라이언트와 서버 간 통신 문제를 파악하는 데 도움.
- 예외 처리: 각 상태 코드에 맞는 응답 처리를 구현하여 사용자 경험을 개선.
- 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 를 만들어보게 된다.
'Spring Boot (+ RESTful)' 카테고리의 다른 글
RESTful 웹 서비스 구축 - @ControllerAdvice / @ExceptionHandler (1) | 2025.01.02 |
---|---|
RESTful 웹 서비스 구축 - @PutMapping / @DeleteMapping (0) | 2025.01.01 |
RESTful 웹 서비스 구축 - @PostMapping / @RequestBody / swagger (0) | 2024.12.30 |
RESTful 웹 서비스 구축 - @PrePersist / DTO 구분 (Entity, Payload, View) (2) | 2024.12.24 |
RESTful 웹 서비스 구축 - @RestController / MySQL / Swagger-ui (1) | 2024.12.23 |