Skip to content

Commit caa3336

Browse files
feat: 채팅내역 저장 기능구현
1 parent 54ed115 commit caa3336

File tree

11 files changed

+265
-4
lines changed

11 files changed

+265
-4
lines changed

build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ repositories {
2222
}
2323

2424
dependencies {
25+
//mongodb
26+
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
27+
2528
implementation 'org.springframework.boot:spring-boot-starter-amqp'
2629
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
2730
implementation 'org.springframework.boot:spring-boot-starter-web'
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.github.messageconsumer.collection;
2+
3+
import lombok.*;
4+
import org.springframework.data.annotation.Id;
5+
import org.springframework.data.mongodb.core.mapping.Document;
6+
7+
import java.util.HashMap;
8+
import java.util.Map;
9+
10+
@Getter
11+
@Setter
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@Builder
15+
@Document(collection = "chat")
16+
public class Chat {
17+
@Id // MongoDB ObjectId
18+
private String chatId;
19+
20+
private String customRoomId;
21+
22+
private Long sellerId;
23+
24+
private Long productId;
25+
26+
private Long userId;
27+
28+
private String shopName;
29+
30+
private String userName;
31+
32+
private Map<Integer, Map<String, String>> chats;
33+
34+
35+
public Map<Integer, Map<String, String>> getChats() {
36+
if (chats == null) {
37+
chats = new HashMap<>(); // 빈 Map을 초기화
38+
}
39+
return chats;
40+
}
41+
}
42+

src/main/java/com/github/messageconsumer/config/RabbitMQConfig.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@
2424
public class RabbitMQConfig {
2525
public static final String EXCHANGE_NAME = "exchange";
2626
// 여러 개의 큐와 라우팅 키를 리스트로 관리
27-
public static final List<String> QUEUE_NAMES = Arrays.asList("postCart", "putCart", "postOrder", "putOrder", "postPayment", "putPayment");
28-
public static final List<String> ROUTING_KEYS = Arrays.asList("postCart", "putCart", "postOrder", "putOrder", "postPayment", "putPayment");
27+
public static final List<String> QUEUE_NAMES = Arrays.asList("postCart", "putCart", "postOrder", "putOrder", "postPayment", "putPayment", "postRoom", "postChat1", "postChat2", "postChat3", "postChat4", "postChat5");
28+
public static final List<String> ROUTING_KEYS = Arrays.asList("postCart", "putCart", "postOrder", "putOrder", "postPayment", "putPayment", "postRoom", "postChat", "postChat", "postChat", "postChat", "postChat");
29+
2930

3031
@Value("${rabbitmq.host}")
3132
private String rmqHost;
@@ -59,6 +60,7 @@ public List<Queue> queues() {
5960
}
6061
return queues;
6162
}
63+
6264
@Bean
6365
public List<Binding> bindings(List<Queue> queues, DirectExchange exchange) {
6466
// 바인딩들을 생성하고 리스트로 반환
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.github.messageconsumer.dto;
2+
3+
import lombok.*;
4+
5+
import java.util.Map;
6+
@Getter
7+
@Setter
8+
@AllArgsConstructor
9+
@NoArgsConstructor
10+
@Builder
11+
public class ChatRmqDto {
12+
private String customRoomId;
13+
private Integer messageTag;
14+
private String sender;
15+
private String content;
16+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.github.messageconsumer.dto;
2+
3+
import lombok.*;
4+
5+
@Getter
6+
@Setter
7+
@AllArgsConstructor
8+
@NoArgsConstructor
9+
@Builder
10+
public class RoomRmqDto {
11+
private String customRoomId;
12+
private Long sellerId;
13+
private String shopName;
14+
private Long userId;
15+
private String userName;
16+
private Long productId;
17+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.github.messageconsumer.repository;
2+
3+
import com.github.messageconsumer.collection.Chat;
4+
import org.bson.types.ObjectId;
5+
import org.springframework.data.mongodb.repository.MongoRepository;
6+
7+
import java.util.Optional;
8+
9+
public interface ChatRepository extends MongoRepository<Chat, ObjectId> {
10+
Optional<Chat> findByCustomRoomId(String customRoomId);
11+
}

src/main/java/com/github/messageconsumer/service/cart/CartConsumerService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public void postCartQueue(CartRmqDto cartRmqDto, Message message, Channel channe
4343

4444
// 재시도 제한 설정
4545
int maxRetries = 3; // 최대 재시도 횟수 설정
46-
Integer retries = (Integer) message.getMessageProperties().getHeader("x-retries");
46+
Integer retries = (Integer) message.getMessageProperties().getHeaders().getOrDefault("x-retries", 0);
4747

4848
if (retries < maxRetries) {
4949
// 재시도 횟수 증가
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
package com.github.messageconsumer.service.chat;
2+
3+
import com.github.messageconsumer.collection.Chat;
4+
import com.github.messageconsumer.dto.CartRmqDto;
5+
import com.github.messageconsumer.dto.ChatRmqDto;
6+
import com.github.messageconsumer.dto.RoomRmqDto;
7+
import com.github.messageconsumer.entity.Cart;
8+
import com.github.messageconsumer.entity.Product;
9+
import com.github.messageconsumer.entity.User;
10+
import com.github.messageconsumer.repository.ChatRepository;
11+
import com.rabbitmq.client.Channel;
12+
import lombok.RequiredArgsConstructor;
13+
import lombok.extern.slf4j.Slf4j;
14+
import org.springframework.amqp.core.Message;
15+
import org.springframework.amqp.rabbit.annotation.RabbitListener;
16+
import org.springframework.stereotype.Service;
17+
18+
import java.io.IOException;
19+
import java.time.LocalDateTime;
20+
import java.util.HashMap;
21+
import java.util.Map;
22+
import java.util.Optional;
23+
24+
@Slf4j
25+
@RequiredArgsConstructor
26+
@Service
27+
public class ChatConsumerService {
28+
private final ChatRepository chatRepository;
29+
private final PostChatService postChatService;
30+
31+
@RabbitListener(queues = "postRoom", containerFactory = "rabbitListenerContainerFactory")
32+
public void postRoom(RoomRmqDto roomRmqDto, Message message, Channel channel) throws IOException {
33+
try {
34+
Optional<Chat> chat = chatRepository.findByCustomRoomId(roomRmqDto.getCustomRoomId());
35+
if (chat.isPresent()) {
36+
// 이미 존재하는 경우 아무것도 하지 않고 성공 처리
37+
log.info("Chat already exists for customRoomId: " + roomRmqDto.getCustomRoomId());
38+
} else {
39+
// 존재하지 않는 경우 새로운 Chat 객체 생성 및 저장
40+
Chat newChat = Chat.builder()
41+
.customRoomId(roomRmqDto.getCustomRoomId())
42+
.sellerId(roomRmqDto.getSellerId())
43+
.shopName(roomRmqDto.getShopName())
44+
.userId(roomRmqDto.getUserId())
45+
.userName(roomRmqDto.getUserName())
46+
.productId(roomRmqDto.getProductId())
47+
.build();
48+
chatRepository.save(newChat);
49+
log.info("New Chat created for customRoomId: " + roomRmqDto.getCustomRoomId());
50+
}
51+
52+
} catch (Exception e) {
53+
log.error("Error processing cart message: " + e.getMessage(), e);
54+
55+
// 재시도 제한 설정
56+
int maxRetries = 3; // 최대 재시도 횟수 설정
57+
Integer retries = (Integer) message.getMessageProperties().getHeaders().getOrDefault("x-retries", 0);
58+
59+
if (retries < maxRetries) {
60+
// 재시도 횟수 증가
61+
retries++;
62+
message.getMessageProperties().setHeader("x-retries", retries);
63+
64+
// 일정 시간 후 재시도
65+
long delayMillis = 5000; // 5초 대기
66+
message.getMessageProperties().setExpiration(String.valueOf(delayMillis));
67+
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
68+
} else {
69+
// 최대 재시도 횟수를 초과하면 메시지를 버립니다.
70+
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
71+
log.error("Max retries exceeded. Discarding message.");
72+
}
73+
}
74+
}
75+
76+
@RabbitListener(queues = "postChat1", containerFactory = "rabbitListenerContainerFactory")
77+
public void postChat1(ChatRmqDto chatRmqDto, Message message, Channel channel) throws IOException {
78+
postChatService.postChat(chatRmqDto, message, channel);
79+
}
80+
81+
@RabbitListener(queues = "postChat2", containerFactory = "rabbitListenerContainerFactory")
82+
public void postChat2(ChatRmqDto chatRmqDto, Message message, Channel channel) throws IOException {
83+
postChatService.postChat(chatRmqDto, message, channel);
84+
}
85+
86+
@RabbitListener(queues = "postChat3", containerFactory = "rabbitListenerContainerFactory")
87+
public void postChat3(ChatRmqDto chatRmqDto, Message message, Channel channel) throws IOException {
88+
postChatService.postChat(chatRmqDto, message, channel);
89+
}
90+
@RabbitListener(queues = "postChat4", containerFactory = "rabbitListenerContainerFactory")
91+
public void postChat4(ChatRmqDto chatRmqDto, Message message, Channel channel) throws IOException {
92+
postChatService.postChat(chatRmqDto, message, channel);
93+
}
94+
@RabbitListener(queues = "postChat5", containerFactory = "rabbitListenerContainerFactory")
95+
public void postChat5(ChatRmqDto chatRmqDto, Message message, Channel channel) throws IOException {
96+
postChatService.postChat(chatRmqDto, message, channel);
97+
}
98+
99+
100+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.github.messageconsumer.service.chat;
2+
3+
import com.github.messageconsumer.collection.Chat;
4+
import com.github.messageconsumer.dto.ChatRmqDto;
5+
import com.github.messageconsumer.repository.ChatRepository;
6+
import com.rabbitmq.client.Channel;
7+
import lombok.RequiredArgsConstructor;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.springframework.amqp.core.Message;
10+
import org.springframework.stereotype.Service;
11+
12+
import java.io.IOException;
13+
import java.util.HashMap;
14+
import java.util.Map;
15+
16+
@Slf4j
17+
@RequiredArgsConstructor
18+
@Service
19+
public class PostChatService {
20+
private final ChatRepository chatRepository;
21+
22+
public void postChat(ChatRmqDto chatRmqDto, Message message, Channel channel) throws IOException {
23+
try {
24+
// customRoomId에 해당하는 Chat document 조회
25+
Chat chat = chatRepository.findByCustomRoomId(chatRmqDto.getCustomRoomId())
26+
.orElse(Chat.builder().customRoomId(chatRmqDto.getCustomRoomId()).build()); // 없으면 새로운 Chat document 생성
27+
28+
Map<String, String> newMessage = new HashMap<>();
29+
newMessage.put("sender", chatRmqDto.getSender()); // 발신자 설정
30+
newMessage.put("content", chatRmqDto.getContent()); // 메시지 내용 설정
31+
int messageTag = chatRmqDto.getMessageTag();
32+
int maxMessageTag = chat.getChats().keySet().stream()
33+
.mapToInt(Integer::intValue)
34+
.max()
35+
.orElse(0);
36+
if(maxMessageTag > messageTag ){
37+
messageTag = maxMessageTag + 1;
38+
}
39+
chat.getChats().put(messageTag, newMessage);
40+
chatRepository.save(chat);
41+
42+
43+
} catch (Exception e) {
44+
log.error("Error processing cart message: " + e.getMessage(), e);
45+
46+
// 재시도 제한 설정
47+
int maxRetries = 3; // 최대 재시도 횟수 설정
48+
Integer retries = (Integer) message.getMessageProperties().getHeaders().getOrDefault("x-retries", 0);
49+
50+
if (retries < maxRetries) {
51+
// 재시도 횟수 증가
52+
retries++;
53+
message.getMessageProperties().setHeader("x-retries", retries);
54+
55+
// 일정 시간 후 재시도
56+
long delayMillis = 5000; // 5초 대기
57+
message.getMessageProperties().setExpiration(String.valueOf(delayMillis));
58+
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
59+
} else {
60+
// 최대 재시도 횟수를 초과하면 메시지를 버립니다.
61+
channel.basicReject(message.getMessageProperties().getDeliveryTag(), false);
62+
log.error("Max retries exceeded. Discarding message.");
63+
}
64+
}
65+
}
66+
}

src/main/java/com/github/messageconsumer/service/order/OrderCosumerService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public void putOrderQueue(OrderRmqDto orderRmqDto, Message message, Channel chan
107107

108108
// 재시도 제한 설정
109109
int maxRetries = 3; // 최대 재시도 횟수 설정
110-
Integer retries = (Integer) message.getMessageProperties().getHeader("x-retries");
110+
Integer retries = (Integer) message.getMessageProperties().getHeaders().getOrDefault("x-retries", 0);
111111

112112
if (retries < maxRetries) {
113113
// 재시도 횟수 증가

0 commit comments

Comments
 (0)