Key PPPPOINT!
- application.yml 속성 정의 방법
- spring.cloud.stream.function.definition
- Spring Cloud Stream에서 사용할 함수(빈)의 이름 정의
- 아래 bindings 속성 순서 상관 X
;
로 구별
- spring.cloud.stream.bindings
- 함수들이 어떤 토픽을 구독할 것인지 정의
- 토픽명 선언 패턴
- 함수 이름과 토픽 이름을 연결하기 위해 기본적으로
함수명-in-0
이라는 패턴 사용
- Spring Cloud Stream의 기본 규칙이며, 이 규칙에 따라 함수와 토픽을 자동으로 연결할 수 있음
paperViewConsumer
함수를 사용하려면 토픽 이름을 ‘paperViewConsumer-in-0’으로 선언해야함.
- 이렇게 하면 Spring Cloud Stream은 ‘paperViewConsumer-in-0’ 토픽으로 메세지가 오면 paperViewConsumer 함수를 호출하여 메세지 처리
코드 작성
- gradle에 의존성 추가
// spring cloud stream
implementation 'org.springframework.cloud:spring-cloud-starter-stream-rabbit'
implementation 'org.springframework.boot:spring-boot-starter-amqp'
- 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
- 이벤트 생성 (지금은 DB insert용)
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
public class PaperViewEvent {
private Integer paperSn;
private String ipAddress;
private Paper paper;
}
- spring cloud stream에 사용될 Bean을 생성하기 위해 Config class 생성
@EnableBinding, @StreamListener 사용은 deprecated
- 함수형으로 변경
@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!!!!!!!!!!!!!!!!!!!!!!!!!");
};
}
}
- 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()
);
}