본문 바로가기
💻 뚝딱뚝딱/북북클럽

[개발일지 #017] 북(Book) 도메인 API 구현 및 테스트

by 뚜루리 2025. 4. 29.
728x90
320x100

🎯 오늘의 목표

  • 북(Book) 도메인 API 구현

⚙️ 진행한 작업

  • (Book) 도메인 API 구현 
  • (Book) 도메인 API 테스트

 


🛠️ 개발내용

📌 북(Book) 컨트롤러 생성

package ddururi.bookbookclub.domain.book.controller;

import ddururi.bookbookclub.domain.book.dto.BookRequest;
import ddururi.bookbookclub.domain.book.dto.BookResponse;
import ddururi.bookbookclub.domain.book.service.BookService;
import ddururi.bookbookclub.global.common.ApiResponse;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

/**
 * 책 관련 API 컨트롤러
 * - 등록
 */
@RestController
@RequestMapping("/api/books")
@RequiredArgsConstructor
public class BookController {

    private final BookService bookService;

    /**
     * 책 등록 API
     * @param request 책 등록 요청 데이터
     * @return 등록된 책 정보
     */
    @PostMapping
    public ResponseEntity<ApiResponse<BookResponse>> createBook(
            @RequestBody @Valid BookRequest request
    ) {
        BookResponse bookResponse = bookService.createBook(request);
        return ResponseEntity.ok(ApiResponse.success(bookResponse));
    }
}

 

 

📌 BookRequest 생성

package ddururi.bookbookclub.domain.book.dto;

import jakarta.validation.constraints.NotBlank;
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
 * 책 등록 요청 DTO
 */
@Getter
@NoArgsConstructor
public class BookRequest {

    @NotBlank(message = "제목은 비어 있을 수 없습니다.")
    private String title;

    @NotBlank(message = "저자는 비어 있을 수 없습니다.")
    private String author;

    private String publisher;
    private String isbn;
    private String thumbnailUrl;
}

 

 

📌 BookResponse 생성

package ddururi.bookbookclub.domain.book.dto;

import ddururi.bookbookclub.domain.book.entity.Book;
import lombok.Getter;

@Getter
public class BookResponse {

    private final Long id;
    private final String title;
    private final String author;
    private final String publisher;
    private final String isbn;
    private final String thumbnailUrl;

    public BookResponse(Book book) {
        this.id = book.getId();
        this.title = book.getTitle();
        this.author = book.getAuthor();
        this.publisher = book.getPublisher();
        this.isbn = book.getIsbn();
        this.thumbnailUrl = book.getThumbnailUrl();
    }
}

 


[포스트맨으로 테스트하기]

📌 책등록 API

URL http://localhost:8080/api/books
Method POST
Headers Content-Type: application/json
Body 타입 raw (JSON)

Body :

{
  "title": "클린코드",
  "author": "로버트 C. 마틴",
  "publisher": "인사이트",
  "isbn": "9788966260959",
  "thumbnailUrl": "https://example.com/cleancode.jpg"
}

 

[테스트 결과 : 성공]

728x90
320x100