드디어 API 생성을 시작하였다,,!
제품 재고 관리 시스템에서 메인이라고 할 수 있는 👜제품👜에 대한 등록 API를 생성해보았다
{
"name": "귀여운한라봉",
"categoryName": "과일",
"price": 10000,
"stock": 20
}
제품 등록
을 목표로 삼았기에, category 테이블에 하나의 sample 카테고리를 등록해 놓은 뒤 개발을 진행하였다. @PostMapping
public ResponseEntity<Object> create(
@RequestBody @Valid ProductInput productInput,
Errors errors) {
if (errors.hasErrors()) {
return new ResponseEntity<>(errorUtil.getErrorMessages(errors), HttpStatus.BAD_REQUEST);
}
productService.createProduct(productInput);
return new ResponseEntity<>(HttpStatus.CREATED);
}
public void createProduct(ProductInput productInput) {
Product existProduct = productRepository.findByName(productInput.getName());
if (existProduct != null) {
throw new ResponseStatusException(HttpStatus.CONFLICT, "409: PRODUCT ALREADY EXIST");
}
String lastProductCode = productRepository.findLastProductCode();
if (lastProductCode == null) {
lastProductCode = "product_0";
}
int sequence = Integer.parseInt(lastProductCode.split("_")[1]);
String newProductCode = "product_" + (sequence + 1);
Category existCategory = categoryRepository.findByName(productInput.getCategoryName());
if (existCategory == null) {
throw new ResponseStatusException(HttpStatus.CONFLICT, "404: CATEGORY NOT FOUND");
}
Product product = Product.builder().productCode(newProductCode).category(existCategory)
.name(productInput.getName()).price(productInput.getPrice()).stock(productInput.getStock())
.img(productInput.getImg()).barcode(productInput.getBarcode())
.description(productInput.getDescription()).build();
productRepository.save(product);
}
public class ProductInput {
@NotBlank(message = "제품 명은 반드시 있어야 합니다")
@Pattern(regexp = "^.{4,29}$", message = "사용자 명은 5자 이상 30자 미만이어야 합니다.")
private String name;
@NotNull(message = "카테고리는 반드시 하나 선택해야 합니다")
private String categoryName;
@NotNull(message = "가격은 반드시 있어야 합니다")
private BigDecimal price;
@NotNull(message = "재고 수량은 반드시 있어야 합니다")
private int stock;
private String img;
private String barcode;
private String description;
}
@Repository
public interface CategoryRepository extends CrudRepository<Category, String> {
Category findByName(String name);
}
@Repository
public interface ProductRepository extends CrudRepository<Product, String> {
Product findByName(String name);
@Query("SELECT MAX(p.productCode) FROM Product p")
String findLastProductCode();
}
Postman Result
Database(PostgreSQL Result)
기본적인 API 하나를 구현하고 나니 필요한 👑개선이 필요한 사항👑들이 눈에 더 보이기 시작했다.
,,,많다
혼자 API 개발의 전체 flow를 돌려 보니 놓쳤던 부분들이 많이 발견되는 것 같다
차근차근 진행해나가면서 성장했으면 좋겠다
화이팅이다 😊😊