inflearn logo
강의

講義

知識共有

RabbitMQ を使用した非同期アーキテクチャを一気に解決する

NotificationMessage가 필요한 이유 질문

解決済みの質問

110

jerry

投稿した質問数 3

0

학습중 궁금한 것은 언제든 문의 하세요.

질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다.

추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다.


  1. Pub-Sub 모델을 이용한 실시간 알림 part2에 질문이 있습니다 !

 

package com.example.messagequeue.step2.step2;

public class NotificationMessage {
    private final String message;

    public NotificationMessage() {
        message = "";
    }

    public NotificationMessage(String message) {
        this.message = message;
    }

    public String getMessage(){
        return message;
    }
}

짊여기에서 NotificationMessage DTO를 만들어주셧는데, 뭐 때문에 만드신걸까요 ?

직렬화, 역직렬화와 관련이 있는거 같은데, 잘 이해가 안되네요 ㅎㅎ

답변 주시면 감사드리겠습니다 !

java spring-boot jpa msa websocket rabbitmq

回答 2

0

codevillain

안녕하세요. 수강자님

 

일반적으로 실무에서 다른 레이어(혹은 다른 서비스)에 전송할 때 자료형의 나열식의 구조 보다는 좀 더 구조화된 DTO 형태의 객체(MQ에서는 Payload 라고 하거나 xxxMessage 라고 칭합니다) 를 전송하는게 일반적인 케이스입니다.

 

단순히 문자열 "ABCD" 보다는 JSON 형태의 { title : "ABCD"} 와 같이 명시적으로 의미가 있는 형태로 필드를 정의해서 보내는것이 개발 스펙상 명확하고, MQ 뒷단에서 받는 이(개발자)가 다른이가 될 가능성이 있기 때문에 스키마 형태(필드:값) 의 데이터 값을 보내는 것이 테스트, 디버깅에도 유용하다고 할 수 있습니다.

그래서 MQ나 다른 미들웨어들도 내부적으로는 JSON을 파싱하는 컨버터 등을 기본적으로 내재하거나, Spring에서 제공하는 Converter (Jackson2Json) 를 써서 변환하는 형태로 개발을 하게 됩니다. 즉, 타입 안정성, 변수의 의미나 구조의 명확성 때문에 가급적 객체(DTO, Message, Payload) 형태로 보내는 것을 추천합니다.

이런 구조에서는 직렬화/역직렬화 (다음 강좌에 설명을 하고 있습니다) 의 개념도 같이 공부해두면 도움이 되겠습니다.

 

감사합니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다. 김제림님.

NotificationMessage와 같은 Data Transfer Object(DTO)를 사용하는 이유를 설명드리겠습니다.

DTO와 직렬화/역직렬화

  1. DTO의 역할: DTO는 주로 데이터를 전송하기 위한 객체로, 데이터 구조를 명확하게 표현하기 위해 사용됩니다. NotificationMessage라는 클래스는 메시지를 객체로 캡슐화하여 필요한 데이터를 안전하게 전송하거나 받을 수 있도록 해줍니다.

  2. 직렬화와 역직렬화: 이 클래스가 Jackson이나 다른 JSON 라이브러리에서 직렬화 및 역직렬화될 때, 기본 생성자가 필요합니다. 직렬화/역직렬화 과정은 Java 객체를 JSON 형식으로 변환하거나 그 반대의 과정이며, 기본 생성자가 있어야 라이브러리가 객체 생성 시 초기화를 올바르게 처리할 수 있습니다. 이러한 변환 과정에서 각 필드를 올바르게 매핑하기 위해 DTO가 사용됩니다.

  3. 불변성 유지: 위 코드에서 필드를 final로 정의함으로써 불변성을 유지하려고 하는데, 이는 객체가 한번 설정되면 그 상태가 변하지 않도록 하기 위함입니다. 이는 멀티스레드 환경에서 안전성을 높이고, 코드의 예측 가능성을 증가시킵니다.

이 DTO는 메시지의 구조와 내용을 쉽게 정의하고, Java와 JSON 간의 변환 과정을 단순화하기 위해서 사용됩니다. 따라서 직렬화 및 역직렬화가 필요한 상황에서 NotificationMessage 같은 구조는 자주 사용됩니다.

이와 비슷한 주제로 더 많은 정보와 유사한 질문 답변을 확인하려면 아래 링크를 참고하세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

16 강의 메세지 retryCount의 의도

0

23

2

step 4 - fanout 관련 질문

0

69

2

dlx dlq 설정 관련

0

65

1

동적 큐 이름 설정 방법 및 SimpleRabbitListenerContainerFactory의 재정의에 따른 Retry 설정 미적용 관련 질문입니다.

0

100

1

강의 자료 관련

0

85

2

인증 에러

0

83

2

RabbitMQ에서의 트랙잭션 메시징 질문

0

110

2

Producer/Consumer 단위

0

71

2

안녕하세요 섹션2. 12번 강의에서 질문 있습니다.

0

84

2

안녕하세요 "섹션2 8. Consumer간 작업 분배" 에서 질문 있습니다.

0

91

2

컨슈머 서버 질문드립니다

0

81

2

DLQ 관련 질문

0

131

2

알림은 왜 pub sub 구조로 설계하나요?

0

150

2

Receiver를 여러개 하려면 어떻게하나요?

0

141

2

깃허브 step11 브랜치

0

99

1

DLQ 재시도 로직 처리후 DLQ에 unacked 1건이 남는거에 대해서

0

152

2

스탭4 질문드립니다

0

155

3

생성자 질문드립니다

0

107

2

Pub/Sub & WebSocket 활용한 실시간 알림

0

216

2

채팅 방식 질문입니다!

0

140

2

강의와 살짝 무관하지만.. MQ에 대한 질문이 있습니다!

0

209

1

챕터18 retry yml 강의 부분 질문

0

190

2

tutorial-step4 질문

0

150

2

pub/sub, producer/consumer 차이

0

266

2