안녕하세요 ! 개발환경세팅에서 선생님이 하시는 과정을 그대로 따라 갔는데 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.
안녕하세요 선생님 ! 섹션 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; }
@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 빈을 추가하는걸까요? 어떤식으로 하는것인지 궁금합니다. 여러큐와 거기에 따른 여러 컨슈머 구성시에는 어떤식으로 환경설정하면 될까요? 감사합니다.
안녕하세요 선생님, 섹션6. 메시지 읽음처리, 채팅방 나가기, 11분 25초 쯤에 findByChatRoomAndMember(chatRoom, member); 코드로 모든 readStatus를 가져와서 읽음 처리를 하는 것으로 보입니다. 읽지 않음 상태의 readStatus만 가져와서 읽음 상태로 바꿔주어도 상관이 없을까요 ? 좋은 강의 정말 감사합니다.
안녕하세요 ㅎㅎ 채팅 시스템이 있는 프로젝트를 구현하고 싶어서 강의 수강중에 있습니다 :) 현재 진행중인 프로젝트 구조는 msa 구조로 프런트-게이트웨이-유레카-백엔드 이런식으로 있고 프런트쪽은 html+js+spring feignClient로 이루어져 있습니다. 다른 프레임워크를 사용하지 않고 html과 js로만 구현이 가능케 해야하는데 vue를 사용하지 않고도 강의에서 다루고 있는 채팅 시스템을 문제없이 구현이 가능한지 궁금해서 여쭤봅니다!!
안녕하세요. 예시 학습 중에 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()); } } }
학습중 궁금한 것은 언제든 문의 하세요. 질문을 최대한 자세히 남겨주시면 반드시 답변 드리도록 하겠습니다. 추가로 알고 싶은 내용도 요청해주시면 강의 자료를 업데이트 해서 제공할 예정입니다. 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를 만들어주셧는데, 뭐 때문에 만드신걸까요 ? 직렬화, 역직렬화와 관련이 있는거 같은데, 잘 이해가 안되네요 ㅎㅎ 답변 주시면 감사드리겠습니다 !
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 이후에 작동을 하는 데 혹시 작동원리가 다를까요?
서비스 구동하며 테스트와 디버깅하기 - 1에서 기동하는 방법을 알려주실 수 있을까요?? 강의에서 갑자기 포트번호가 왜 3000으로 설정되어 나오는지도 모르겠고, start.sh로 실행시켜서 localhost:7002로 하면 이렇게 나옵니다... /register 이건 어디서 설정하는 건가요?? 대체 뭐가 문제인걸까요..ㅠㅠ
프로젝트에서 IOT와 결합한 게임을 만들 예정인데, 실시간 통신인 Websocket이 필요하다고 해서 강의를 급하게 결제하였습니다. 여기에서는 실시간 채팅을 구현하는 걸로 보이는데 혹시 여기 내용을 공부하면 프로젝트에 실시간 통신 방식에서도 활용할 수 있을까요? 실시간 방 생성이나 IOT 현물과의 통신에서 WebSocket을 이용할거 같습니다.
안녕하세요. jwt 11 버전 설명해주시면서 생성과 검증에 대한 궁금증이 생기는데요. 생성을 위해서는 base64로 인코딩 된 값을 디코더 하신 뒤 SecretKeySpec을 이용한 뒤 HS512로 암호화 하셨는데요. 검증 부분에서는 base64로 인코딩 된 값(디코더와 SecretKeySpec가 이루어지지 않은 채로)으로 토큰 검증 및 claims를 추출하는데 이 부분에서 문제가 없는 걸까요?
선생님께서 말씀을 조금 두루뭉술하게 해주셔서인지 ㅠㅠ 다들 궁금해 하시는거같은데 저또한 궁금한 부분들이 있습니다. 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는 환경이 달라서 뭔가 신경써야 할게 있다든지..? 감사합니다.
현재 코드에 if (StompCommand.CONNECT==accessor.getCommand()){ System.out.println("connect 요청 시 토큰 유효성 검증"); String bearerToken = accessor.getFirstNativeHeader("Authorization"); String token= bearerToken.substring(7); Connect 시에만 인증을 요구하는데 Stomp 연결 이후 publish와 subscribe 시에는 STOMP에서 인증이 자동으로 되는건가요? 아니면 현재 코드에서 작성하지 않은 것인가요?
안녕하세요, 스탭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을 받은지 궁금합니다