CUD 서버를 띄우다 - CQRS 도입기

윤태호·2023년 5월 8일
0

Spring Boot와 MSK연동!

저번 글에서 MSK의 연결 여부 및 동작 여부를 Kafka Client를 통해서 확인해 보았습니다.
이번 글에서는 CUD Spring Boot를 구축함과 동시에 데이터 동기화를 위해 CUD에 저장되는 데이터들을 Reading Server로 넘기기 위한 작업을 진행하고자 합니다.
사용한 기술 스택 및 Framework 입니다.

  • Spring boot 3.x.x
  • mariadb
  • Docker
  • EC2
  • JPA
  • MSK

Dependency & application.yml 설정

이제 기존의 Server역할을 넘어 Kafka와 연동하여 비동기 이벤트 처리를 하기 위해 설정들이 필요합니다.
먼저 Dependency를 설정해줍시다. 필자는 아래와 같이 설정하였습니다.

추가적으로 application.yml 파일도 작성합시다. 이 파일에서는 topic과 producer, consumer에 대한 설정을 명시합니다.

Config 작성

이제부터 Topic 및 Producer,Consumer를 Bean객체로 활용하기 위해 Config를 작성해줍니다.
1. Topice Config 작성

위 코드를 보시면 Topic에 대한 이름과 그리고 Partition 및 Replication 수를 설정하고 Kafka Admin을 토픽 생성과 MSK와 연결을 설정합니다.
그 후 선언하고자하는 Topic을 NewTopic으로 선언합니다.


  1. Producer Config 작성


    위의 Config 클래스를 보시면, Producer에서 필요한 설정들을 무선 application.yml에서 @Value를 통해 받아와 변수로 선언합니다. 여기에는 Ack, retry 횟수 등을 선언합니다.
    그 후 ProducerFactory를 통해 전달하고자 하는 메세지를 @Bean으로 선언함과 동시에 설정 조건을 추가합니다.
    마지막으로는 kafkaTemplate를 Bean으로 선언해 send 등 데이터 전송에 필요한 메소드를 활용할 준비를 합니다.

  1. Consumer Config 작성
  • Consumer Config는 이전 Config들과 다르게 @EnadbleKafka라는 어노테이션을 추가해줬는데요. Consumer Service에서 @KafkaListner를 통해 불러올 Consumer 빈을 활용하는데 그 때 Kafka가 SpringBoot의 Config를 볼 수 있게 설정합니다.
  • Consumer도 이전 Config와 같이 연결한 Kafka url과 설정들을 선언하고, ConsumerFactory를 Bean으로 만들고 설정들을 추가해줍니다.
  • 마지막으로 CocurrentKafkaListnerContainerFactory는 멀티스레드 방식의 컨슈머입니다.

쉽게 설명하면 Factory로 붙어있는 것들은 어떠한 생성자(Producer),소비자(Consumer)를 선언하는 것이고, 그 다음 그것들을 어떻게 생성하고 소비할지를 선언하는 것입니다. 그래서 Factroy 이 후 또 다른 Bean들이 Factory를 주입 받아 사용합니다.

DTO 및 Entity 작성

CUD 서버에서 진행하고자 하는 역할은 CUD Database에 CUD 명령들을 처리해 저장하고 응답으로 DTO를 통해 Kafka에 메세지로 넘겨주고자 하는 것이기에 Entity와 DTO를 작성해줍니다.

이 class는 Request DTO로서 CUD 작업을 위한 데이터를 전달하는 클래스입니다.

이 class는 CUD 작업을 처리 후 Kafka에 전달하고자하는 데이터를 담은 클래스입니다. 그래서 위의 Config들을 보면 ResponseMan 객체로 전달합니다.

마지막으로는 Database와 맵핑되는 Entity클래스 입니다.

Service 작성

먼저 Producer Service부터 작성하겠습니다.


코드를 살펴보시면 Database에 저장하는 처리와 Kafkatemplate를 통해 이벤트를 보내는 두 번의 처리가 발생하는 것을 볼 수 있습니다.


이제 Consumer Service를 작성하겠습니다.

Consumer Service는 @KafkaListner를 통해 어떤 토픽을 읽어낼 것이고 GroupId와 properties를 설정합니다. 그리고 추가적인 설정들은 Consumer Confing에서 Bean으로 등록했던 Factory를 통해서 설정합니다.

Docker File 작성

이제 모든 것을 작성을 완료했다면,EC2 환경에서 Spring boot를 Run 시켜야하기에 Docker File을 작성하여 Docker Hub에 올려줍시다!!!!!

Test 결과

위의 Test 결과처럼 Postman으로 Post요청을 보내면 제대로 된 응답과 함께 EC2d에서 Spring boot Log를 보면 Consumer가 제대로 읽어내는 것을 볼 수 있습니다.

글을 마치며

이번에는 CUD 서버를 위한 Spring boot를 제작하고 제대로 동작하는지 확인하는 글을 적었습니다.
실제로는 Consumer가 같은 Spring boot 서버일리는 없습니다. Test를 위해 작성해본 것입니다!!!!
다음 글에서는 이제 Consumer로 동작하는 ELK 스택에 대해 시작을 해볼 예정입니다. 아직 부족한 글이지만 읽어주셔서 감사합니다.

profile
성장하는것을 제일 즐깁니다.

0개의 댓글