inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

173만명의 커뮤니티!! 함께 토론해봐요.

개발환경세팅에서 npm run serve 명령어 입력 시 오류

해결됨

웹소켓/STOMP 채팅서비스(spring, vue, redis)

안녕하세요 ! 개발환경세팅에서 선생님이 하시는 과정을 그대로 따라 갔는데 npm run serve 명령어 입력 시 밑에 오류가 뜹니다. 검색해보니 pnpm을 설치하라고 하는데 선생님과 똑같이 진행 했는데 오류가 뜨는 이유가 뭔지 궁금해서 질문글 남깁니다. 오류 내용: ERROR Error: The project seems to require pnpm but it's not installed. Error: The project seems to require pnpm but it's not installed.

  • spring-boot
  • websocket
  • stomp-websocket
  • pubsub
  • vue-3
김태우 댓글 1 좋아요 0 조회수 208

섹션 6. '이전메시지조회' 강의에서 질문 있습니다.

해결됨

웹소켓/STOMP 채팅서비스(spring, vue, redis)

안녕하세요 선생님 ! 섹션 6. 이전 메시지 조회 강의에서 질문 있습니다. 1. 선생님 코드의 getChatHistory() 메서드에서 chatParticipants를 chatRoom으로 조회해서 for문을 돌면서 현재 로그인한 멤버가 chatParticipants에 있는지 확인하고 있는데, findByChatRoomAndMember 메서드를 통해 참여자인지 확인해도 로직에 상관이 없을까요 ? 2. 현재 로직은 getHistory 메서드가 실행되면 해당 참여자가 채팅방에 참여하기 전의 메시지들까지 전부 표시될것 같은데, 참여자가 채팅방에 참여한 후 부터의 메시지만 보여주고 싶으면 참여시간을 따로 저장한 다음 findByChatRoomAndCreatedTimeGreaterThanEqualOrderByCreatedTimeAsc( ChatRoom chatRoom, LocalDateTime participatedTime); 이런식으로 코드를 짜면 될까요 ? 좋은 방법인지 모르겠습니다. 선생님 코드 public List<ChatMessageDto> getChatHistory(Long roomId){ // 내가 해당 채팅방의 참여자가 아닐경우 에러 ChatRoom chatRoom = chatRoomRepository.findById(roomId).orElseThrow(()-> new EntityNotFoundException("room cannot be found")); Member member = memberRepository.findByEmail(SecurityContextHolder.getContext().getAuthentication().getName()).orElseThrow(()->new EntityNotFoundException("member cannot be found")); List<ChatParticipant> chatParticipants = chatParticipantRepository.findByChatRoom(chatRoom); boolean check = false; for(ChatParticipant c : chatParticipants){ if(c.getMember().equals(member)){ check = true; } } if(!check)throw new IllegalArgumentException("본인이 속하지 않은 채팅방입니다."); // 특정 room에 대한 message조회 List<ChatMessage> chatMessages = chatMessageRepository.findByChatRoomOrderByCreatedTimeAsc(chatRoom); List<ChatMessageDto> chatMessageDtos = new ArrayList<>(); for(ChatMessage c : chatMessages){ ChatMessageDto chatMessageDto = ChatMessageDto.builder() .message(c.getContent()) .senderEmail(c.getMember().getEmail()) .build(); chatMessageDtos.add(chatMessageDto); } return chatMessageDtos; }

  • spring-boot
  • websocket
  • stomp-websocket
  • pubsub
  • vue-3
김태우 댓글 2 좋아요 0 조회수 90

섹션6. '채팅메시지 저장' 강의에서 질문 있습니다

해결됨

웹소켓/STOMP 채팅서비스(spring, vue, redis)

안녕하세요. 선생님 섹션6. '채팅메시지 저장' 강의에서 질문 있습니다. 7:50 부터 사용자별로 읽음 여부 저장을 구현하실때 chatParticipantRepository에서 chatRoom을 통해 participants list를 가져오도록 구현하셨는데 조금 다르게 하고 싶어서 질문 드립니다. 저희 엔티티 구성할때 ChatRoom entity에 <List>chatParticipants 필드를 만들었으니까 여기서 해당 채팅 룸의 participants를 가져와도 상관이 없을까요 ?

  • spring-boot
  • websocket
  • stomp-websocket
  • pubsub
  • vue-3
김태우 댓글 2 좋아요 0 조회수 118

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

해결됨

RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기

동일한 메시지를 여러 서비스에서 처리하는 것을 pub sub 구조로 이해하였는데요, 알림이라는 하나의 서비스에서 처리한다면 pub sub 구조로 설계할 필요가 없는 걸까요?

  • java
  • spring-boot
  • jpa
  • msa
  • websocket
  • rabbitmq
Jerry 댓글 2 좋아요 0 조회수 190

섹션3. JWT토큰생성 부분에서 질문 있습니다.

해결됨

웹소켓/STOMP 채팅서비스(spring, vue, redis)

안녕하십니까 선생님 ! 섹션3. JWT토큰생성 강의에서 작성하신 createToken 메서드를 보면 헤더를 따로 설정하지 않는데 JJWT 라이브러리가 SECRET_KEY를 참고하여 헤더를 설정해주는건지, 아니면 기본 설정 값이 들어가는 것인지 궁금합니다. createToken 메서드 : public String createToken(String email, String role){ Claims claims = Jwts.claims ().setSubject(email); claims.put("role", role); Date now = new Date(); String token = Jwts.builder() .setClaims(claims) .setIssuedAt(now) .setExpiration(new Date(now.getTime()+expiration*60*1000L)) .signWith(SECRET_KEY) .compact(); return token; }

  • spring-boot
  • websocket
  • stomp-websocket
  • pubsub
  • vue-3
김태우 댓글 2 좋아요 0 조회수 176

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

해결됨

RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기

@Bean public SimpleMessageListenerContainer container(ConnectionFactory connectionFactor, MessageListenerAdapter listenerAdapter) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactor); container.setQueueNames(QUEUE_NAME); container.setMessageListener(listenerAdapter); return container; } @Bean public MessageListenerAdapter listenerAdapter(Receiver receiver) { return new MessageListenerAdapter(receiver, "receiveMessage"); // Receiver의 메소드명 } 안녕하세요. 좋은 강의해주셔서 감사합니다. 만약 하나의 큐에서 여러 컨슈머를 통해 동시에 여러개를 소비하고자한다면 Receiver를 추가해서 새롭게 MessageLisnterAdaper 빈을 추가하는걸까요? 어떤식으로 하는것인지 궁금합니다. 여러큐와 거기에 따른 여러 컨슈머 구성시에는 어떤식으로 환경설정하면 될까요? 감사합니다.

  • java
  • spring-boot
  • jpa
  • msa
  • websocket
  • rabbitmq
댓글 2 좋아요 0 조회수 177

깃허브 step11 브랜치

해결됨

RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기

Slack 관련된거 같은데, 강의에는 나와있지 않네요 ! step11은 혼자 공부하면 되는걸까요 ?

  • java
  • spring-boot
  • jpa
  • msa
  • websocket
  • rabbitmq
jerry 댓글 1 좋아요 0 조회수 121

섹션6. 메시지 읽음처리, 채팅방 나가기, 11분 25초

해결됨

웹소켓/STOMP 채팅서비스(spring, vue, redis)

안녕하세요 선생님, 섹션6. 메시지 읽음처리, 채팅방 나가기, 11분 25초 쯤에 findByChatRoomAndMember(chatRoom, member); 코드로 모든 readStatus를 가져와서 읽음 처리를 하는 것으로 보입니다. 읽지 않음 상태의 readStatus만 가져와서 읽음 상태로 바꿔주어도 상관이 없을까요 ? 좋은 강의 정말 감사합니다.

  • spring-boot
  • websocket
  • stomp-websocket
  • pubsub
  • vue-3
김태우 댓글 2 좋아요 0 조회수 133

프런트쪽을 vue를 사용하지 않고도 구현 가능할까요??

해결됨

웹소켓/STOMP 채팅서비스(spring, vue, redis)

안녕하세요 ㅎㅎ 채팅 시스템이 있는 프로젝트를 구현하고 싶어서 강의 수강중에 있습니다 :) 현재 진행중인 프로젝트 구조는 msa 구조로 프런트-게이트웨이-유레카-백엔드 이런식으로 있고 프런트쪽은 html+js+spring feignClient로 이루어져 있습니다. 다른 프레임워크를 사용하지 않고 html과 js로만 구현이 가능케 해야하는데 vue를 사용하지 않고도 강의에서 다루고 있는 채팅 시스템을 문제없이 구현이 가능한지 궁금해서 여쭤봅니다!!

  • spring-boot
  • websocket
  • stomp-websocket
  • pubsub
  • vue-3
신현섭 댓글 2 좋아요 0 조회수 187

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

미해결

RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기

안녕하세요. 예시 학습 중에 DeadLetterQueue 수동 재시도 관련해서 질문있습니다. http 호출 이후에 추가적으로 DLQConsumer가 호출되지는 않는데, 처리 후 RabbitMQ 콘솔 확인해보니 DLQ에 unacked 한 건 이 남아 있었습니다. 제 생각에는 DLQConsumer에서 정상적으로 메시지 소비했으면 마찬가지로 ack 처리 해줘야 하는게 아닌가 싶은데, DLQ에 unacked 상태로 남기는게 의도된 경우가 있을수 있는건지 궁금합니다. order_completed_queue에서는 모두 처리되서 메시지가 보이지 않습니다. 예시 코드 @Component @RequiredArgsConstructor public class OrderDLQConsumer { private final RabbitTemplate rabbitTemplate; @RabbitListener(queues = RabbitMQConfig.DLQ) public void process(String message) { System.out.println("DLQ Message Received: " + message); try { String fixMessage = "success"; rabbitTemplate.convertAndSend( RabbitMQConfig.ORDER_EXCHANGE, "order.completed.shipping", fixMessage ); System.out.println("DLQ Message Sent: " + fixMessage); } catch (Exception e) { System.err.println("### [DLQ Consumer Error] " + e.getMessage()); } } }

  • java
  • spring-boot
  • jpa
  • msa
  • websocket
  • rabbitmq
이진우 댓글 2 좋아요 0 조회수 187

NotificationMessage가 필요한 이유 질문

해결됨

RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기

학습중 궁금한 것은 언제든 문의 하세요. 질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다. 추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다. 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
jerry 댓글 2 좋아요 0 조회수 132

Event Loop 관련 질문드립니다.

해결됨

실전! FastAPI 활용(비동기)

Event Loop에서 질문이 있습니다. 저는 await task()을 하면 작업 큐에 등록된 후 차례가 되면 실행이 되는 것으로 이해를 하였는데 그러면 다음과 같은 코드에서, import asyncio async def inner_task(): print(f"inner_task 시작") await asyncio.sleep(1) print(f"inner_task 완료") return "inner 결과" async def outer_task(n): print(f"outer_task {n} 시작") results = await inner_task() print(f"outer_task {n} 완료") return results async def main(): await asyncio.gather(outer_task(1), outer_task(2), outer_task(3)) asyncio.run(main()) 먼저 큐에 등록된 outer_task들이 먼저 동작을 하는 것으로 예상을 하였지만 먼저 들어간 outer_task보다 내부의 inner_task가 먼저 동작을 하였습니다. 하지만 outer_task에 gather을 사용하여 여러 task를 await하면, 모든 outer_task 이후에 작동을 하는 데 혹시 작동원리가 다를까요?

  • python
  • FastAPI
  • websocket
  • asyncio
  • pubsub
yoonjong.kim 댓글 2 좋아요 0 조회수 117

서비스 구동하며 테스트와 디버깅하기 - 1 에서 기동하는 방법

해결됨

Spring Boot를 활용하여 채팅 플랫폼 만들어보기

서비스 구동하며 테스트와 디버깅하기 - 1에서 기동하는 방법을 알려주실 수 있을까요?? 강의에서 갑자기 포트번호가 왜 3000으로 설정되어 나오는지도 모르겠고, start.sh로 실행시켜서 localhost:7002로 하면 이렇게 나옵니다... /register 이건 어디서 설정하는 건가요?? 대체 뭐가 문제인걸까요..ㅠㅠ

  • mysql
  • spring-boot
  • jpa
  • jwt
  • websocket
cloverj0 댓글 2 좋아요 0 조회수 147

강의 듣기 전 질문

해결됨

웹소켓/STOMP 채팅서비스(spring, vue, redis)

프로젝트에서 IOT와 결합한 게임을 만들 예정인데, 실시간 통신인 Websocket이 필요하다고 해서 강의를 급하게 결제하였습니다. 여기에서는 실시간 채팅을 구현하는 걸로 보이는데 혹시 여기 내용을 공부하면 프로젝트에 실시간 통신 방식에서도 활용할 수 있을까요? 실시간 방 생성이나 IOT 현물과의 통신에서 WebSocket을 이용할거 같습니다.

  • spring-boot
  • websocket
  • stomp-websocket
  • pubsub
  • vue-3
edwin.dkim 댓글 1 좋아요 0 조회수 116

jwt 인증, 검증 질문입니다.

미해결

웹소켓/STOMP 채팅서비스(spring, vue, redis)

안녕하세요. jwt 11 버전 설명해주시면서 생성과 검증에 대한 궁금증이 생기는데요. 생성을 위해서는 base64로 인코딩 된 값을 디코더 하신 뒤 SecretKeySpec을 이용한 뒤 HS512로 암호화 하셨는데요. 검증 부분에서는 base64로 인코딩 된 값(디코더와 SecretKeySpec가 이루어지지 않은 채로)으로 토큰 검증 및 claims를 추출하는데 이 부분에서 문제가 없는 걸까요?

  • spring-boot
  • websocket
  • stomp-websocket
  • pubsub
  • vue-3
sw 댓글 2 좋아요 0 조회수 176

소켓 메모리낭비

미해결

웹소켓/STOMP 채팅서비스(spring, vue, redis)

안녕하세요. 강의를 보고 소켓이 연결될 때 로그를 남겨봤는데, 살펴보니 이유 없이 소켓 연결이 많이 생성되어 있는 것을 확인했습니다. 이런 경우 선생님께서는 어떻게 해결하셨나요? 소켓 메모리 낭비를 해결하셨다고 들었던 것 같아서 여쭤봅니다.

  • spring-boot
  • websocket
  • stomp-websocket
  • pubsub
  • vue-3
우유소보루 댓글 2 좋아요 0 조회수 152

MySQLConfig 관련 질문있습니다.

해결됨

Spring Boot를 활용하여 채팅 플랫폼 만들어보기

선생님께서 말씀을 조금 두루뭉술하게 해주셔서인지 ㅠㅠ 다들 궁금해 하시는거같은데 저또한 궁금한 부분들이 있습니다. JPA에서 처음부터 트랜잭션 매니저 구현체로 JpaTransactionManager 를 사용하지 않고 auth쪽은 DataSourceTransactionManager 를 사용한건 왜 그런건가요? AuthService#createUser() 부분에서는 일반 JDBC 기반의 DataSourceTransactionManager 를 사용하셨더라구요. 이러한 경우 영속성 컨텍스트에서 Entity들의 생명주기까지는 관리가 안되는걸로 알고 있습니다. Lazy Loading이나 Dirty Check 등.. 채팅관련 트랜잭션 설정할때에는 구체적으로 어떤 메커니즘에 의해 어떤 문제가 발생할 수 있는지 명확히 알려주실 수 있을까요? 제가 몇 번 돌려서 듣긴 했는데 느낌이 STOMP 통신 특성상 발생되는 이슈라고 이해는 한 것 같은데 그게 구체적으로 어떠 어떠한 이유로 오류가 발생한다?혹은 할수도 있다? 는것인지 이해를 못했습니다. 확실히 무조건 오류가 발생을 한다는걸까요? 그리고 그 원인은 무엇일까요? 단순히 JPA를 이용한 비즈니스 로직을 작성할때는 JpaTransactionManager 가 관리하는 트랜잭션 내에서 작성하자. 그리고 그러기 위해서 createChatTransacationMansger 를 사용하자. 라고 이해해도 될까요? JpaRepository 구현체인 SimpleJpaRepository 에는 기본적으로 save() 에는 트랜잭션이 걸려 있지만 저장 이후에 Entity 조작하는 로직이 있다면 동작하지 않게 되니까요.. 혹시 일반적인 JPA 환경과 별개로 STOMP를 통한 웹소켓 통신 환경에서의 JPA 트랜잭션 처리에 대해 특이사항이 있었던거라면 자세히 설명좀 부탁드려도 될까요? 예를 들어 일반 MVC 프레임웍의 http 통신 환경일때는 스레드 또한 톰캣의 스레드를 사용하지만 STOMP는 환경이 달라서 뭔가 신경써야 할게 있다든지..? 감사합니다.

  • mysql
  • spring-boot
  • jpa
  • jwt
  • websocket
dlsrksrhk 댓글 2 좋아요 0 조회수 183

subscribe와 publish시 인증

해결됨

웹소켓/STOMP 채팅서비스(spring, vue, redis)

현재 코드에 if (StompCommand.CONNECT==accessor.getCommand()){ System.out.println("connect 요청 시 토큰 유효성 검증"); String bearerToken = accessor.getFirstNativeHeader("Authorization"); String token= bearerToken.substring(7); Connect 시에만 인증을 요구하는데 Stomp 연결 이후 publish와 subscribe 시에는 STOMP에서 인증이 자동으로 되는건가요? 아니면 현재 코드에서 작성하지 않은 것인가요?

  • spring-boot
  • websocket
  • stomp-websocket
  • pubsub
  • vue-3
심심이 댓글 2 좋아요 0 조회수 164

스탭4 질문드립니다

미해결

RabbitMQ를 이용한 비동기 아키텍처 한방에 해결하기

안녕하세요, 스탭4 news 스크립트 코드가 궁금해 질문드립니다. 우선 영상처럼 curl -X POST " http://localhost:8080/news/api/publish?newsType=ja " curl -X POST " http://localhost:8080/news/api/publish?newsType=sp " curl -X POST " http://localhost:8080/news/api/publish?newsType=vu " 컬로 3번 찌르면 아래 사진과 같이 응답값이 찍히는데요 스크립트 부분에서 connect 함수 실행시 현재 선택한 const newsType = document.getElementById("newsType").value; (java선택) 값이 java이라 subscribeToNews(newsType); 이부분에 subscription = stompClient.subscribe( /topic/java, function (message) { alert(message.body); addMessageToDiv(message.body); }); 이렇게 /topic/java만 subscribe 할텐데 어떻게 spring , vue가 나왔는지 궁금합니다. curl 요청 -> restController -> publisher 에서 publishMessage 메서드를 통해 fanout으로 bindingBuilder가 설정된 큐에 send -> 클라이언트(html)에서 stomp를 이용해 구독 로직인것같은데 클라이언트(html)에서 /topic/java만 구독한상태에서 다른 vue, spring을 받은지 궁금합니다

  • java
  • spring-boot
  • jpa
  • msa
  • websocket
  • rabbitmq
나마스테 댓글 3 좋아요 0 조회수 195

인기 태그

인프런 TOP Writers

주간 인기글