๊ด€๋ฆฌ ๋ฉ”๋‰ด

์ฝ”์ง„๋‚จ

TIL 17๋ฒˆ์งธ ๋ณธ๋ฌธ

TIL

TIL 17๋ฒˆ์งธ

woojin126 2022. 1. 4. 04:13

๐Ÿ‘ ์˜ค๋Š˜ ํ•œ ๊ฒƒ

โ— OSI 7 ๊ณ„์ธต ํŒŒ์•…

โ— Redis Pub / Sub ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ”„๋ง๋ถ€ํŠธ์—์„œ Publisher , Subcribe , Topic ๋ถ€๋ถ„ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

โ— ํ˜„์žฌ ํ˜‘์—…์ค‘์ธ ํ”„๋กœ์ ํŠธ ๋ฌดํ•œ ๋Œ€๋Œ“๊ธ€ ์—์„œ ๊ฐ’์ด ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  NULL์ด ์ฐํžˆ๋Š” ํ˜„์ƒ ํ”ฝ์Šค

โ— ์•Œ๊ณ ๋ฆฌ์ฆ˜ 2๋ฌธ์ œ ํ’€๊ธฐ

 

 

๋ฉ”์„ธ์ง€๋ฅผ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜, ์ž…์žฅํ•˜๊ฒŒ๋˜๋ฉด RedisPublisher.publish ๋กœ ๋ฐœํ–‰

 

@RequiredArgsConstructor
@Controller
public class ChatController {

    private final RedisPublisher redisPublisher;
    private final ChatRoomRepository chatRoomRepository;

    /**
     * websocket "/pub/chat/message"๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฉ”์‹œ์ง•์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
     */
    @MessageMapping("/chat/message")
    public void message(ChatMessage message) {
        if (ChatMessage.MessageType.ENTER.equals(message.getType())) {
            chatRoomRepository.enterChatRoom(message.getRoomId());
            message.setMessage(message.getSender() + "๋‹˜์ด ์ž…์žฅํ•˜์…จ์Šต๋‹ˆ๋‹ค.");
        }
        // Websocket์— ๋ฐœํ–‰๋œ ๋ฉ”์‹œ์ง€๋ฅผ redis๋กœ ๋ฐœํ–‰ํ•œ๋‹ค(publish)
        redisPublisher.publish(chatRoomRepository.getTopic(message.getRoomId()), message);
    }
}

 

์œ„์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ฉ”์„ธ์ง€๋ฅผ ํ•ด๋‹น Redis์˜ ํ† ํ”ฝ์ฑ„๋„์— ๋ฐœํ–‰์„ํ•˜๋ฉด 

@RequiredArgsConstructor
@Service
public class RedisPublisher {

    private final RedisTemplate<String,Object> redisTemplate;

     public void publish(ChannelTopic topic, ChatMessage message){
         redisTemplate.convertAndSend(topic.getTopic(),message);
     }
}
* Redis์—์„œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœํ–‰(publish)๋˜๋ฉด ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋˜ onMessage๊ฐ€ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
@Slf4j
@RequiredArgsConstructor
@Service
public class RedisSubscriber implements MessageListener {

    private final ObjectMapper objectMapper;
    private final RedisTemplate redisTemplate;
    private final SimpMessageSendingOperations messagingTemplate;

    /**
     * Redis์—์„œ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœํ–‰(publish)๋˜๋ฉด ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋˜ onMessage๊ฐ€ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•œ๋‹ค.
     */
    @Override
    public void onMessage(Message message, byte[] pattern) {
        try {
            // redis์—์„œ ๋ฐœํ–‰๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„ deserialize
            String publishMessage = (String) redisTemplate.getStringSerializer().deserialize(message.getBody());
            // ChatMessage ๊ฐ์ฑ„๋กœ ๋งตํ•‘
            ChatMessage roomMessage = objectMapper.readValue(publishMessage, ChatMessage.class);
            // Websocket ๊ตฌ๋…์ž์—๊ฒŒ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ Send
            messagingTemplate.convertAndSend("/sub/chat/room/" + roomMessage.getRoomId(), roomMessage);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
    }
}

 

Stomp ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽธํ•œ์ ์€ ๊ฐ๊ฐ ๋ฉ”์„ธ์ง€๋ฅผ ์ „์†กํ•˜๋Š” ๋งค์ฒด, ๋ฐ›๋Š” ๋งค์ฒด์˜ ์—ญํ• ์ด ์ •ํ•ด์ ธ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. (PUB/SUB) 

(๋ธŒ๋กœ์ปค๋ผ๋Š” ์ค‘๊ฐ„ ๋งค๊ฐœ์ฒด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์œจ ํ•  ์ˆ˜์žˆ์Œ ํ˜„์žฌ ์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” REDIS ๊ฐ€ ๋ธŒ๋กœ์ปค๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด๋จ)

 

 

๐Ÿคฆ‍ ๊ทผ ๋ช‡์ผ๊ฐ„ ์ฒ˜์Œ ์ ‘ํ•ด๋ณด๋Š” Socket ์ด๋ผ๋Š” ๊ฐœ๋…๊ณต๋ถ€๋ฅผ ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋А๋ผ ์ •์‹ ์ด์—†๋‹ค.. ์–ด๋–ค ์ผ์ด๋˜ ์ฒ˜์Œ์€ ํ•ญ์ƒ ํž˜๋“  ๊ฒƒ ๊ฐ™๋‹ค. ์›๋ž˜ ๋ช‡์ผ ์ „ ๊นŒ์ง€ socket์ด๋ผ๋Š” ๋‹จ์–ด์กฐ์ฐจ ๋ชฐ๋ž๋Š”๋ฐ ํ˜„์žฌ ํ”„๋กœ์ ํŠธ์— ์ ์šฉ ํ•  ์ผ์ด ์ƒ๊ฒจ ๊ธ‰ํ•˜๊ฒŒ ๊ณต๋ถ€์ค‘์ด๋‹ค. 

์›๋ž˜ ์šฐ๋ฆฌ๊ฐ€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋˜ HTTP ํŠน์ง•์€ ๋ฐ˜์ด์ค‘ ํ†ต์‹ ์œผ๋กœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ ํ•˜๊ณ  ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•„ ์‘๋‹ต์„ํ•˜๋ฉด 

์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๋Š” Statelessํ•œ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. 

ํ•˜์ง€๋งŒ ์ฑ„ํŒ…๊ธฐ๋Šฅ์€ ์ด๋ ‡๊ฒŒ ํ•œ๋ฒˆ ์‚ฌ์ดํด์„๋Œ๊ณ  ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๊ณ ๋ฅผ ๋ฌดํ•œ ๋ฐ˜๋ณตํ•˜๋ฉด ํฐ ์ž์› ์†ํ•ด์ด๋‹ค. ์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ๋‚˜์˜จ ํ”„๋กœํ† ์ฝœ์ด Socket์ธ๋ฐ, ์ „์ด์ค‘ ํ†ต์‹ ์ด์ž, Statefulํ•˜๋ฉฐ ์ฒ˜์Œ Socket ์—ฐ๊ฒฐ์„ ํ•  ๋•Œ ๋นผ๊ณ ๋Š” ํ•ญ์ƒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ์ƒํƒœ์˜ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. (์ฑ„ํŒ…์— ์ ํ•ฉํ•œ) ์ผ๋ฐ˜ ์†Œ์บฃ๋งˆ์ € ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ•ด ์Šคํ”„๋ง์ „์šฉ Socket์ธ SockJs๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ  ์ด์— ์ฑ„ํŒ…๊ธฐ๋Šฅ์„ ์กฐ๊ธˆ๋” ๋ฐœ์ „์‹œํ‚ค๊ณ  ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ์œ„ํ•œ Stomp๋ฅผ ์‚ฌ์šฉํ•ด์„œ Pub/Sub ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

'TIL' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

TIL 19์ผ์ฐจ  (0) 2022.01.07
TIL 18๋ฒˆ์งธ  (0) 2022.01.05
TIL 16๋ฒˆ์งธ  (0) 2022.01.01
TIL 15๋ฒˆ์งธ  (0) 2021.12.30
TIL 14๋ฒˆ์งธ  (0) 2021.12.29