> For the complete documentation index, see [llms.txt](https://kopens.gitbook.io/plantpulse-platform/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kopens.gitbook.io/plantpulse-platform/developer/api-manual/product-service.md).

# 15. Product 서비스

`client.product()` 으로 접근합니다. 제품(Product)의 CRUD와 카운트를 제공합니다.

## 15.1 메서드 일람

| 메서드                                    | 반환 타입                         | HTTP   | 엔드포인트                         |
| -------------------------------------- | ----------------------------- | ------ | ----------------------------- |
| `create(ProductRequestV5)`             | `ProductResponseV5` 또는 `null` | POST   | `/api/v5/product`             |
| `update(product_id, ProductRequestV5)` | `ProductResponseV5` 또는 `null` | PUT    | `/api/v5/product/{id}`        |
| `delete(product_id)`                   | `boolean`                     | DELETE | `/api/v5/product/{id}`        |
| `get(product_id)`                      | `ProductResponseV5` 또는 `null` | GET    | `/api/v5/product/{id}`        |
| `list()`                               | `List<ProductResponseV5>`     | GET    | `/api/v5/product`             |
| `exists(product_id)`                   | `boolean`                     | GET    | `/api/v5/product/{id}/exists` |
| `count()`                              | `long`                        | GET    | `/api/v5/product/count`       |

## 15.2 ProductRequestV5 / ProductResponseV5

| 필드                    | 타입     | 설명                |
| --------------------- | ------ | ----------------- |
| `product_id`          | String | 제품 ID (PK)        |
| `product_name`        | String | 제품명               |
| `site_id`             | String | 소속 사이트            |
| `description`         | String | 설명                |
| `external_product_id` | String | 외부 시스템(ERP) 제품 ID |
| `product_code`        | String | 제품 코드 (SKU)       |
| `category`            | String | 카테고리              |
| `unit_of_measure`     | String | 측정 단위 (EA, KG 등)  |

## 15.3 사용 예시

### 제품 생성

```java
import plantpulse.api.v5.dto.request.ProductRequestV5;
import plantpulse.api.v5.dto.response.ProductResponseV5;

ProductRequestV5 req = new ProductRequestV5();
req.setProduct_id("PROD_A001");
req.setProduct_name("반도체 칩 A");
req.setSite_id("SITE_DJ");
req.setProduct_code("SKU-A001");
req.setCategory("반도체");
req.setUnit_of_measure("EA");
req.setExternal_product_id("ERP_P001");
req.setDescription("8nm 공정 반도체 칩");

ProductResponseV5 created = client.product().create(req);
```

### 조회

```java
ProductResponseV5 p = client.product().get("PROD_A001");
boolean exists      = client.product().exists("PROD_A001");
long total          = client.product().count();
```

### 카테고리별 그룹핑

```java
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

Map<String, List<ProductResponseV5>> byCategory = client.product().list().stream()
        .collect(Collectors.groupingBy(ProductResponseV5::getCategory));

byCategory.forEach((cat, items) ->
    System.out.printf("%s: %d개%n", cat, items.size()));
```

### 수정 / 삭제

```java
ProductRequestV5 update = new ProductRequestV5();
update.setProduct_id("PROD_A001");
update.setProduct_name("반도체 칩 A (v2)");
update.setSite_id("SITE_DJ");
update.setProduct_code("SKU-A001");
update.setUnit_of_measure("EA");
client.product().update("PROD_A001", update);

client.product().delete("PROD_A001");
```

## 다음 단계

* [Order 서비스](/plantpulse-platform/developer/api-manual/order-service.md) — 작업지시에 제품 할당
