Key PPPPOINT!

  1. application.yml 속성 정의 방법
    1. spring.cloud.stream.function.definition
      1. Spring Cloud Stream에서 사용할 함수(빈)의 이름 정의
      2. 아래 bindings 속성 순서 상관 X
      3. ; 로 구별
    2. spring.cloud.stream.bindings
      1. 함수들이 어떤 토픽을 구독할 것인지 정의
      2. 토픽명 선언 패턴
        1. 함수 이름과 토픽 이름을 연결하기 위해 기본적으로 함수명-in-0 이라는 패턴 사용
        2. Spring Cloud Stream의 기본 규칙이며, 이 규칙에 따라 함수와 토픽을 자동으로 연결할 수 있음
        3. paperViewConsumer 함수를 사용하려면 토픽 이름을 ‘paperViewConsumer-in-0’으로 선언해야함.
        4. 이렇게 하면 Spring Cloud Stream은 ‘paperViewConsumer-in-0’ 토픽으로 메세지가 오면 paperViewConsumer 함수를 호출하여 메세지 처리
      • 그러나 사용자 정의 규칙 사용 가능

코드 작성

  1. gradle에 의존성 추가
// spring cloud stream
implementation 'org.springframework.cloud:spring-cloud-starter-stream-rabbit'
implementation 'org.springframework.boot:spring-boot-starter-amqp'
  1. application.yml에 속성 추가
spring:
	cloud:
    stream:
      function:
        definition: paperViewConsumer;paperDownloadConsumer;itemViewConsumer
      bindings:
        paperViewConsumer-in-0:
          destination: paperViewCountTopic
        paperDownloadConsumer-in-0:
          destination: paperDownloadCountTopic
        itemViewConsumer-in-0:
          destination: itemViewCountTopic
  1. 이벤트 생성 (지금은 DB insert용)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class PaperViewEvent {
    private Integer paperSn;
    private String ipAddress;
    private Paper paper;
}
  1. spring cloud stream에 사용될 Bean을 생성하기 위해 Config class 생성
@Configuration
public class StreamConfig {

		@Bean
    public Consumer<PaperViewEvent> paperViewConsumer() {
        return paperView -> {
            // paperView 처리 로직
            System.out.println("PAPER VIEW!!!!!!!!!!!!!!!!!!!!!!!!!");
        };
    }

    @Bean
    public Consumer<PaperDwldEvent> paperDownloadConsumer() {
        return paperDownload -> {
            // paperDownload 처리 로직
            System.out.println("DWLD!!!!!!!!!!!!!!!!!!!!!!!!!");
        };
    }

    @Bean
    public Consumer<ItemViewEvent> itemViewConsumer() {
        return itemView -> {
            // itemView 처리 로직
            System.out.println("ITEM VIEW!!!!!!!!!!!!!!!!!!!!!!!!!");
        };
    }

}
  1. message 요청
private final StreamBridge streamBridge;

@GetMapping("/detail/{paperSn}")
public ResponseEntity<ResponseDto<PaperViewResponseDto>> detail(
        @Parameter(name = "paperSn", description = "논문 순번", required = true) @PathVariable Integer paperSn
        , HttpServletRequest request
) {
    PaperViewResponseDto response = paperCmmnService.getPaperDetail(paperSn);

		// paper 조회수 증가시키는 message 요청
    PaperViewEvent event = PaperViewEvent.builder()
            .paperSn(paperSn)
            .ipAddress(request.getRemoteAddr())
            .build();
    streamBridge.send("paperViewConsumer-in-0", event);

    return ResponseEntity.ok().body(
            ResponseDto.<PaperViewResponseDto>builder()
                    .data(response)
                    .message("success")
                    .build()
    );
}