Spring/Toy
4. Kafka > API + Producer 생성
haleylog
2025. 4. 29. 15:56
4. Kafka 메세지 전송 용 API 및 Producer 생성
4.1. API 에서 사용 될 Request / Response DTO 생성
- API Request 와 Kafka 메세지로 사용 될 DTO
package com.toy.dto;
import com.toy.entity.Order;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(description = "주문 등록 Request")
public class OrderRequestDto {
@Schema(description = "주문 번호")
private String orderNumber;
@Schema(description = "상품 ID")
private Long productId;
@Schema(description = "사용자 ID")
private String userId;
@Schema(description = "수량")
private int quantity;
}
- API Response 에서 사용 될 DTO
package com.toy.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@Getter
@Builder
@Schema(description = "API 공통 Response")
public class ApiResponseDto {
@Schema(description = "성공여부")
private boolean result;
@Schema(description = "메세지")
private String message;
}
4.2. 주문 등록 API에 사용 될 Controller, Service 생성
- Controller
package com.toy.controller;
import com.toy.dto.ApiResponseDto;
import com.toy.dto.OrderRequestDto;
import com.toy.service.OrderService;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/orders")
public class OrderController {
private final OrderService orderService;
@Operation(summary = "주문")
@PostMapping
public ResponseEntity<ApiResponseDto> order(@RequestBody OrderRequestDto order) {
return ResponseEntity.ok(orderService.order(order));
}
}
- Service Class
package com.toy.service;
import com.toy.dto.ApiResponseDto;
import com.toy.dto.OrderRequestDto;
import com.toy.kafka.OrderProducer;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class OrderService {
private final OrderProducer orderProducer;
public ApiResponseDto order(OrderRequestDto order) {
orderProducer.sendOrder(order);
return ApiResponseDto.builder()
.result(true)
.message("주문 등록 요청 성공")
.build();
}
}
728x90
4.3. Producer 생성
KafkaTemplate<K,V>.send(topic, value);
- K: key 타입
- V: value 타입
- topic: 메세지 토픽 지정
- value: 메세지 내용 전달 value
package com.toy.kafka;
import com.toy.dto.OrderRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class OrderProducer {
private static final String TOPIC = "orders";
private final KafkaTemplate<String, Object> kafkaTemplate;
public void sendOrder(OrderRequestDto order) {
kafkaTemplate.send(TOPIC, order);
}
}
4.4. API 호출
Swagger UI (혹은 Postman 등) 활용하여 API 호출
4.5. Kafka 메세지 확인
Docker 컨테이너의 Kafka CLI 를 활용하여 Kafka 메세지 정상 전송 확인
PS D:\workspace\toy> docker exec -it kafka kafka-console-consumer --bootstrap-server localhost:9092 --topic orders --from-beginning
{"orderNumber":"order_001","productId":100,"userId":"haley","quantity":1}
Processed a total of 1 messages
728x90
반응형