[RabbitMQ] JSON Message Format 사용하기 - 1

반응형

이번 글에서는 RabbitMQ에서 사용하는 메세지 포맷인 JSON에 대해 알아보도록 하겠습니다.

0. 왜 JSON을 사용하는가?

RabbitMQ는 메세지 Format으로 어떠한 String 형식도 허용합니다. 하지만 이러한 자유도 때문에 오히려 Publisher와 Consumer 사이에 불필요한 자원을 낭비하게 됩니다.

만약 특정 Publihser가 본인만 사용하는 Format으로 Message를 발행할 경우, Consumer는 해당 Message Format을 해석해 사용하기 위한 비용을 소모해야 합니다.

따라서 이러한 낭비를 막고, 비즈니스 로직에 더욱 집중하기 위해 가장 보편적이로 널리 쓰이는 JSON Format으로 메시지 규격을 통일하는 것 입니다. JSON은 대부분의 언어에서 Create 및 Parse를 위한 라이브러를 제공하기 때문에 더욱 유용하게 사용할 수 있습니다.

JSON 라이브러리 중 Jackson과 Gson이 유명하며 이번 실습에서는 Jackson을 사용하도록 하겠습니다.

Jackson을 사용하면 아래와 같이 Object는 JSON Format으로 Serialize 할 수 있으며, 반대로 JSON Format의 String을 Object 형식으로 Deserialize 할 수 있습니다.

image.png

1. Jackson 사용하기

Spring Boot에서 Jackosn를 사용하기 위해 build.gradle에 dependecny를 추가해야 합니다.

Producer Applciation과 Consumer Application 양 쪽 모두 build.gradle 파일에 아래와 같은 dependency를 추가해줍니다.

image.png

implementation 'com.fasterxml.jackson.core:jackson-core:2.9.8'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8'
implementation 'com.fasterxml.jackson.core:jackson-annotations:2.9.8'

2. Entity

이번에는 JSON 포맷으로 Serialize 할 Entity를 생성해보겠습니다.

아래와 같이 Employee Entity를 생성하고, 생성자와 Getter/Setter는 @Lombok을 사용해 구현했습니다.

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Employee {

    private String employeeId;

    private String name;

    private LocalDate birthDate;
}

3. Producer

Entity 객체를 Message로 Publish 하는 Producer를 생성하겠습니다.

@Service
public class EmployeeJsonProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    private ObjectMapper objectMapper = new ObjectMapper();

    public void sendMessage(Employee emp){

        try {
            String json = objectMapper.writeValueAsString(emp);
            rabbitTemplate.convertAndSend("q.employee", json);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
    }

}

Entity 객체를 Message로 Publish 하기 위해선 객체를 JSON String으로 변환하는 Serialize 과정을 거쳐야합니다.

Spring boot에서는 이를 ObjectMapper를 사용해 구현할 수 있습니다. writeValueAsString() 메서드를 사용해 획득한 JSON String은 rabbitTemplate을 통해 "q.employee" Queue로 Message를 Publish 합니다.

image.png

4. Producer Application

이제 Producer Application에서 앞서 생성한 producer에 Employee 객체를 생성해 넘겨주면 됩니다.

@SpringBootApplication
public class RabbitmqProducerApplication implements CommandLineRunner {


    @Autowired
    private EmployeeJsonProducer rabbitmqProducer;

    public static void main(String[] args) {
        SpringApplication.run(RabbitmqProducerApplication.class, args);
    }

    @Override
    public void run(String... args) {
        Employee emp = new Employee("minho", "test", LocalDate.now());
        rabbitmqProducer.sendMessage(emp);
    }
}

Queue에서 Message를 확인해보면 Employee 객체가 JSON String 형식으로 변환되어있는것을 확인할 수 있습니다.

image.png

5. Consumer

Consumer는 반대로 JSON String형식의 Message를 Entity 객체로 Deserialize 해야합니다.

image.png

consumer project에도 변환할 Entity 객체인 Employee 클래스를 생성합니다. 이 Entity의 구조는 Producer Application의 Entity 구조와 동일해야합니다.

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class Employee {

    private String employeeId;

    private String name;

    private LocalDate birthDate;
}

Producer와 반대로 ObjectMapper 클래스를 사용해서 JSON String 값을 Employee 객체로 아래와 같이 Deserialize 할 수 있습니다.

Consumer

@Service
public class RabbitmqConsumer {

    private Logger log = LoggerFactory.getLogger(RabbitmqConsumer.class);

    ObjectMapper objectMapper = new ObjectMapper();

    @RabbitListener(queues = "q.employee")
    public void listen(String message){
        try {
            Employee emp = objectMapper.readValue(message , Employee.class);
            log.info("Employee is {} ", emp);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

참고 자료 : https://www.udemy.com/course/rabbitmq-java-spring-boot-for-system-integration/


추천서적

 

RabbitMQ 따라잡기:AMQP 기반의 오픈소스 메시지 브로커

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

댓글

Designed by JB FACTORY