묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨웹소켓/STOMP 채팅서비스(spring, vue, redis)
개발환경세팅에서 npm run serve 명령어 입력 시 오류
안녕하세요 !개발환경세팅에서 선생님이 하시는 과정을 그대로 따라 갔는데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.
-
해결됨웹소켓/STOMP 채팅서비스(spring, vue, redis)
섹션 6. '이전메시지조회' 강의에서 질문 있습니다.
안녕하세요 선생님 !섹션 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;}
-
해결됨웹소켓/STOMP 채팅서비스(spring, vue, redis)
섹션6. '채팅메시지 저장' 강의에서 질문 있습니다
안녕하세요. 선생님섹션6. '채팅메시지 저장' 강의에서 질문 있습니다.7:50 부터 사용자별로 읽음 여부 저장을 구현하실때chatParticipantRepository에서 chatRoom을 통해 participants list를 가져오도록 구현하셨는데 조금 다르게 하고 싶어서 질문 드립니다.저희 엔티티 구성할때 ChatRoom entity에 <List>chatParticipants 필드를 만들었으니까 여기서 해당 채팅 룸의 participants를 가져와도 상관이 없을까요 ?
-
해결됨웹소켓/STOMP 채팅서비스(spring, vue, redis)
섹션3. JWT토큰생성 부분에서 질문 있습니다.
안녕하십니까 선생님 !섹션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; }
-
해결됨웹소켓/STOMP 채팅서비스(spring, vue, redis)
섹션6. 메시지 읽음처리, 채팅방 나가기, 11분 25초
안녕하세요 선생님,섹션6. 메시지 읽음처리, 채팅방 나가기, 11분 25초 쯤에 findByChatRoomAndMember(chatRoom, member); 코드로 모든 readStatus를 가져와서 읽음 처리를 하는 것으로 보입니다.읽지 않음 상태의 readStatus만 가져와서 읽음 상태로 바꿔주어도 상관이 없을까요 ?좋은 강의 정말 감사합니다.
-
해결됨웹소켓/STOMP 채팅서비스(spring, vue, redis)
프런트쪽을 vue를 사용하지 않고도 구현 가능할까요??
안녕하세요 ㅎㅎ 채팅 시스템이 있는 프로젝트를 구현하고 싶어서 강의 수강중에 있습니다 :)현재 진행중인 프로젝트 구조는 msa 구조로 프런트-게이트웨이-유레카-백엔드 이런식으로 있고 프런트쪽은 html+js+spring feignClient로 이루어져 있습니다. 다른 프레임워크를 사용하지 않고 html과 js로만 구현이 가능케 해야하는데 vue를 사용하지 않고도 강의에서 다루고 있는 채팅 시스템을 문제없이 구현이 가능한지 궁금해서 여쭤봅니다!!
-
해결됨웹소켓/STOMP 채팅서비스(spring, vue, redis)
강의 듣기 전 질문
프로젝트에서 IOT와 결합한 게임을 만들 예정인데, 실시간 통신인 Websocket이 필요하다고 해서 강의를 급하게 결제하였습니다. 여기에서는 실시간 채팅을 구현하는 걸로 보이는데 혹시 여기 내용을 공부하면 프로젝트에 실시간 통신 방식에서도 활용할 수 있을까요? 실시간 방 생성이나 IOT 현물과의 통신에서 WebSocket을 이용할거 같습니다.
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
jwt 인증, 검증 질문입니다.
안녕하세요. jwt 11 버전 설명해주시면서 생성과 검증에 대한 궁금증이 생기는데요.생성을 위해서는 base64로 인코딩 된 값을 디코더 하신 뒤 SecretKeySpec을 이용한 뒤 HS512로 암호화 하셨는데요. 검증 부분에서는 base64로 인코딩 된 값(디코더와 SecretKeySpec가 이루어지지 않은 채로)으로 토큰 검증 및 claims를 추출하는데 이 부분에서 문제가 없는 걸까요?
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
소켓 메모리낭비
안녕하세요. 강의를 보고 소켓이 연결될 때 로그를 남겨봤는데, 살펴보니 이유 없이 소켓 연결이 많이 생성되어 있는 것을 확인했습니다.이런 경우 선생님께서는 어떻게 해결하셨나요?소켓 메모리 낭비를 해결하셨다고 들었던 것 같아서 여쭤봅니다.
-
해결됨웹소켓/STOMP 채팅서비스(spring, vue, redis)
subscribe와 publish시 인증
현재 코드에 if (StompCommand.CONNECT==accessor.getCommand()){ System.out.println("connect 요청 시 토큰 유효성 검증"); String bearerToken = accessor.getFirstNativeHeader("Authorization"); String token= bearerToken.substring(7); Connect 시에만 인증을 요구하는데Stomp 연결 이후 publish와 subscribe 시에는 STOMP에서 인증이 자동으로 되는건가요? 아니면 현재 코드에서 작성하지 않은 것인가요?
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
안녕하세요 리프레시 토큰을 사용하면 대략적으로 어떤 점이 바뀌게 되는건가요??
안녕하세요 강사님. 혹시 Refresh Token 을 사용하면 프론트엔드 코드에서 대략적으로 어떤 점이 바뀌게 되는건가요?
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
실시간 메시지 읽지 않음 표시 SSE 질문 드립니다.
읽지 않은 메시지 표시를 SSE로 한번 구현 해보라고 하셨는데, 웹소켓이나 stomp를 써도 상관 없나요?토큰 정보는 상황에 따라 저장 위치(쿠키 or 로컬스토리지)를 다르게 개발 하나요?그렇다면 통상 실무에서는 토큰 정보를 어디에 저장 하는지 그리고 몇 가지 예시 좀 부탁 드립니다.
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
세션이 종료되는데 이유를 찾지 못하겠습니다..
채팅방 목록 메뉴에서 참여하기를 눌렀을때 connect sessiond IDnubkqe0atotal session1subscribe 검증sub 토큰 검증 완료Destination: /topic/1roomId: 1Hibernate: select cr1_0.id,cr1_0.created_time,cr1_0.is_group_chat,cr1_0.name,cr1_0.updated_time from chat_room cr1_0 where cr1_0.id=?disconnect sessiond IDnubkqe0atotal session0서버에서 세션 종료 감지: nubkqe0a세션이 자동으로 종료됩니다..당연히 채팅 메세지도 화면에 안나오는데토큰 검증은 StompWebSocketConfig 에서 다 되는 것 같은데... 잘모르겠습니다의심가는 로직이 있으신가요 ?
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
로컬 스토리지에 토큰 저장하는 방식 질문입니다!
보통 토큰을 로컬 스토리지에 저장하나요?그러면 명시적으로 로그아웃을 누르지 않는이상은클라이언트가 로컬스토리지 비우는 방식을 사용해서 토큰을 초기화 하지는 않을 것 같은데혹시 강의에서 로컬 스토리지 말고 쿠키 같은 것에 저장하는 내용이 뒤에서 나오나요?안나온다면 어떤식으로 처리해야하나요?서버에서 토큰을 내려보내줄때 쿠키에 담아서 내려보내주어야 하는건가요 ?
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
강사님 질문있습니다~
http,websocket의 비교라는 챕터에서는(12:07)처음에 http 요청으로 연결을 맺는다라고 하셨는데순수웹소켓-백엔드 강의에서는 (6:20)http 요청이 아니기 때문에 컨트롤러에서 안받고 핸들러에서 받는다고 하셨는데중요한 개념인 것 같아서 어떻게 이해하면 될까요?검색해보니까 처음에 연결은 http 요청에 get이 맞고 헤더에 웹소켓 요청이라는 정보가 있으므로 http 요청과는 구분된다라는 정보가 있는데 잘 모르겠어요~
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
강사님 프로젝트 디렉토리 구조에 대해서 질문있어요!
보통 contoller service repository 이렇게 폴더 두고 그 안에서 여러개의 MemerConrollerChatController이런식으로 나누는 것만 봐서chat과 member 디렉토리를 나누고그 안에서 다시 controller 디렉토리하고 만드는방법을 처음 써보는데요~저는 강사님 방법이 더 좋은데 보통 어떻게 사용하나요? 특별히 강사님 처럼 디렉토리 나눈 이유가 있을까요 ??
-
해결됨웹소켓/STOMP 채팅서비스(spring, vue, redis)
싱글톤 객체 질문있습니다.
@Bean public PasswordEncoder makePassword() { return PasswordEncoderFactories.createDelegatingPasswordEncoder(); }이거를 싱글톤 객체로 만들어주셨는데요그런데String encodedPassword = passwordEncoder.encode(memberSaveReqDto.getPassword()); 이부분을 static 으로 두고 참조변수를 사용해서 사용하는 것과 어떤 차이가 있나요?찾아보니 전역변수는 static 이니까 메모리에 미리 올라가고 싱글톤은 사용할떄 올라가는 장점이 있다고 하는데 이 예시는 어차피 클래스 초기화될 때 생성되니까 그런 장점이 없을 것 같은데...궁금합니다.
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
메시지 저장순서에 대한 질문입니다.
안녕하세요 수업을 바탕으로 프로젝트 적용중입니다.프론트에서 채팅입력하면 백엔드의 연결된 소켓에서 이를 redis 로 publish 하고 이때 같이 채팅메시지를 db에 저장하는 방식으로 구현했습니다.나중에 채팅방에 다시 입장하는 경우 채팅 저장 날짜를 기반으로 일부 가져오려하니 초까지 같은 경우 순서가 엉키는 현상이 발생하는데 auto_increment 로 저장한 pk 를 순서로 가져와도 될까요?redis 는 싱글스레드이지만 websocket 가 병렬처리되면 결국 pk 순서가 실제 순서를 보장할 수 있을까요?
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
채팅 메시지 저장에 관한 질문입니다.
채팅 메시지를 보낼 때마다 db에 접근해서 저장하는 방식이면 디스크 io 작업이 굉장히 잦아질 거 같은데보통 이런 경우에는 redis 를 쓴다면 redis에 저장해두었다가 스케줄링같은 방식으로 한번에 db에 저장하는 방식을 사용하는 걸까요?
-
미해결웹소켓/STOMP 채팅서비스(spring, vue, redis)
stomp관련 질문입니다.
현재 메세지만 redis에 저장해서 공통적으로 사용되는 것으로 생각하는데 사용자의 연결정보는 각각의 서버가 가지고 있고 redis에서 메세지가 발행되는 경우 각각의 서버에서 연결된 사용자에게 메세지를 전달한다고 이해하면 될까요?