분류 전체보기
-
JPQL 방식으로 JPA 쿼리 메서드 직접 정의하기카테고리 없음 2023. 1. 30. 00:21
Message 중, Type이 Enter이거나 Quit인 Message이면서 특정 roomId 값을 갖는 Message만 가져오기 // services/GetChattingMessagesService.java // 방법 1: JPA 쿼리 메서드 이름으로 지정 List eventMessages = chattingMessageRepository .findAllByRoomIdAndTypeOrRoomIdAndType( roomId, ChattingMessageType.ENTER, roomId, ChattingMessageType.QUIT ); // 방법 2: 쿼리 명령어를 직접 정의 List eventMessages = chattingMessageRepository .findAllByRoomIdAndEventT..
-
Java에서 Stream Collection을 다른 Collection으로 변환하기Today I Learned 2023. 1. 28. 00:46
Primitive 타입의 배열에 원소를 하나 더 넣어 길이가 1 늘어난 배열로 만드는 방법으로 배열 -> 컬렉션 -> 배열의 방법을 생각함 배열 -> 컬렉션으로 변환하기 위해 Arrays.stream(배열).boxed().toList()로 변환했음 문제는 이렇게 변환한 컬렉션은 요소를 추가하거나 제거할 수 없음 .toList() 불변성을 갖는 List를 반환 .collect(Collectors.toList()) List를 반환, 가변 .collect(Collectors.toCollection(ArrayList::new)) new Collection을 반환 (ArrayList 대신 다른 Collection이 들어갈 수 있음), 가변
-
TCP 통신과 UDP 통신의 차이점Today I Learned 2023. 1. 27. 18:03
(1) TCP 통신과 UDP 통신의 차이점 TCP 통신과 UDP 통신은 OSI 7 Layer 중 Transport Layer에서 사용되는 프로토콜이다. TCP 통신은 클라이언트와 서버가 연결된 상태에서 데이터를 주고받는 '연결 지향적'인 프로토콜이라는 특징이 있습니다. 3-way Handshaking 과정을 통해 연결을 설정하고 4-way Handshaking 과정을 통해 연결을 해제합니다. 데이터의 흐름 제어나 혼잡 제어가 가능하지만, UDP보다는 속도가 느리다는 단점이 있습니다. UDP 통신은 연결을 위해 할당되는 논리적인 경로가 없고, 각각의 패킷이 다른 경로로 전송되는 독립적인 '비연결형' 프로토콜입니다. UDP는 연결을 설정하고 해제하는 과정이 존재하지 않고, TCP보다 속도가 빠르며 네트워크 ..
-
WebSocket 동작 테스트하기Today I Learned 2023. 1. 26. 15:43
전체 플로우 - https://rieckpil.de/write-integration-tests-for-your-spring-websocket-endpoints/ messageConverter - https://stackoverflow.com/questions/41604828/how-to-use-and-customize-messageconversionspring-websocket-client awaitility - https://github.com/awaitility/awaitility/wiki/Getting_started 트러블슈팅 - Connect, Subscribe 여부 확인: https://velog.io/@gkdud583/StompSession-메시지-전달-안되는-문제 >> WebSocketEve..
-
-
git cherry-pick 명령어로 다른 브랜치의 커밋 내역 가져오기Today I Learned 2023. 1. 23. 23:07
상황은 이렇다. main branch에서 원격 branch인 origin/main을 추적하는 새로운 작업 branch를 분기했다. 작업을 진행한 뒤 commit하고, 작업 브랜치를 리모트의 origin에 push했다. Github 프로젝트 Repository에서 Pull Request된 branch를 원격의 main에 merge했다. 로컬에서 원격의 branch 내역을 main에 반영하지 않고, 작업 브랜치에서 계속 작업을 진행했다. commit은 하지 않았다. 추가로 작업을 진행한 로컬의 현재 브랜치는 원격에서는 이미 merge되었기 때문에 push할 경우 예상하지 못한 문제가 발생할 것이 염려되었다. 따라서 원격의 main을 로컬의 main에 반영하면서도 지금 작업하고 있던 내역을 새로운 작업 브랜치..
-
WebSocket을 이용한 실시간 채팅 구현하기 3-1: 브라우저 화면을 닫을 때 퇴장 메시지 전송하기Today I Learned 2023. 1. 21. 20:49
// 1. 채팅 li 컴포넌트 Key 중복 문제 해결 // 1-1. key에 메시지 내용을 쓰고 있었는데, 동일한 사용자가 들어왔다 나갔다를 반복하면 // 메시지 로그 상태에 동일한 형태의 '나갔습니다' '들어왔습니다'가 쌓여서 문제를 일으키고 있었음 // 1-2. 따라서 메시지에 new Date().toLocaleTimeString()을 추가해서 해결을 시도 // 근데 이러면 빠르게 같은 내용의 메시지를 보낼 때 key의 중복을 막지 못한다. // 1-3. 서버에서 메시지의 id를 부여하게 하기 // 서버에 messageIdGenerator를 생성하고, id를 부여해 해결 // 프로젝트에서는 message 객체가 id를 갖게 하는 식으로 해결될듯 // 2. unsubscribe할 때 undefined ..
-
WebSocket을 이용한 실시간 채팅 구현하기 3: STOMPToday I Learned 2023. 1. 21. 20:45
WebSocket을 이용한 실시간 채팅 구현 기록은 다음의 네 단계에 걸쳐 작성할 예정이다. WebSocket을 이용한 실시간 채팅 구현 1: 서버 WebSocket을 이용한 실시간 채팅 구현 2: 클라이언트 WebSocket을 이용한 실시간 채팅 구현 3: STOMP WebSocket을 이용한 실시간 채팅 구현 4: 프로젝트에 적용하기 기존에 작성했던 WebSocket을 이용해 구현한 간단한 실시간 채팅 애플리케이션을 STOMP 프로토콜을 적용해 통신하는 방식으로 리팩터링을 진행했다. 작업 코드는 다음의 링크에서 확인할 수 있다. 추후 프로젝트에 적용할 것을 염두에 두어 클라이언트에서는 전역 상태 관리 Layer를 추가했고, 서버에서는 동작을 처리하는 Layer 계층을 분리했다. GitHub - hsj..