학습 중인 내용이므로 오류가 있을 수 있습니다.
도서 생성, 대출, 반납 API 구현하기
요구사항 : 도서관 책 등록
API 스펙
Http Method : POST
Http Path : /book
Http Body : JSON
{
"name" : String // 책 이름
}
결과 반환 X
book 테이블 생성하고, book 객체 만들어 엔티티 연결하고, Repository, Controller, Service, DTO 생성하자.
CREATE TABLE book (
id bigint auto_increment,
name varchar(255),
primary key (id)
);
domain 패키지에 만들었다.
@Entity
public class Book {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id = null;
@Column(nullable = false)
private String name;
protected Book() {} // JPA를 위한 기본생성자
public Book(String name) {
if (name == null || name.isBlank()) {
throw new IllegalArgumentException(String.format("잘못된 name(%s)이 들어왔습니다.", name));
}
this.name = name;
}
}
JPA를 사용하기 위해 기본생성자를 만들어줬다.
JPA를 활용해야 하기 때문에 JpaRepository 를 extends 한다.
public interface BookRepository extends JpaRepository<Book, Long> {
}
DTO = 프로세스 간에 데이터를 전달하는 객체
public class BookCreateRequest {
private String name;
public String getName() {
return name;
}
}
@RestController
public class BookController {
private final BookService bookService;
public BookController(BookService bookService) {
this.bookService = bookService;
}
@PostMapping("/book")
public void saveBook(@RequestBody BookCreateRequest request) {
bookService.saveBook(request);
}
}
POST API 이기 때문에, @RequestBody로 받은 값을 DTO 객체에 넣어 가져온 뒤, bookService를 통해 객체를 전달하여 저장한다. 그럼 Service를 만들어 보자.
@Service
public class BookService {
private final BookRepository bookRepository;
public BookService(BookRepository bookRepository) {
this.bookRepository = bookRepository;
}
@Transactional
public void saveBook(BookCreateRequest request) {
bookRepository.save(new Book(request.getName()));
}
}
BookRepository는 JpaRepository를 상속받았기 때문에 save라는 메서드가 이미 존재한다. 따라서
새로운 객체인 Book 을 저장하기 위해 new Book 으로 객체를 생성하고 파라미터 값을 DTO 객체에서 받은 name 을 넣어주도록 한다.
도서 저장을 위한 API 로직 구현이 완성되었다.