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
반응형