Today I Learned
-
-
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..
-
Java에서 단일 Key, Value 쌍 사용하기: Map.Entry<K, V>Today I Learned 2023. 1. 20. 01:24
프로그래머스 레벨 3 해시 문제 '베스트앨범'을 풀면서 사용한 Map.Entry Interface에 대해 정리했다. Map.Entry Map 타입의 인터페이스를 구현한 구현체에 대해 entrySet() 메서드를 호출하는 경우, 구현체에 포함되어 있는 [Key, Value] 쌍 전체를 포함하는 Set 컬렉션을 반환받을 수 있다. Map genresAndPlaySums = Map.of( "jazz", 1200, "classic", 5000, "k-pop", 2500, "j-pop", 300 ); Set entries = genresAndPlaySums.entrySet(); cf. docs.oracle.com에 따르면, 이렇게 얻은 Map.Entry들은 해당 Map의 항목에 대한 참조로써 사용될 수 있다고 한..
-
2023년 1월 8일Today I Learned 2023. 1. 8. 12:38
Jest 특정 입력 컴포넌트가 disabled인지 확인하고 싶을 때에는 toHaveAttribute와 closest를 Test에서 사용할 수 있음 expect(screen.getByPlaceholderText('선택된 장소 이름') .closest('input')).toBeDisabled(); expect(screen.getByPlaceholderText('선택된 장소 주소') .closest('input')).toBeDisabled(); reference - https://stackoverflow.com/questions/56593840/check-that-button-is-disabled-in-react-testing-library msw에서 PathVariable을 받는 API 요청의 순서를 유의하..
-
2023년 1월 7일Today I Learned 2023. 1. 7. 12:53
enum public enum PlaceRegistrationStatus { REGISTERED("등록"), UNREGISTERED("미등록"); private String registrationStatus; PlaceRegistrationStatus() { } PlaceRegistrationStatus(String registrationStatus) { this.registrationStatus = registrationStatus; } public String value() { return registrationStatus; } } References - https://velog.io/@jhbae0420/enum-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0 - https://gi..
-
2023년 1월 6일Today I Learned 2023. 1. 6. 23:15
JPA Specification JpaSpecificationExecutor // repositories/PlaceRepository.java public interface PlaceRepository extends JpaRepository, JpaSpecificationExecutor { Optional findByInformationName(String placeName); } Specification 객체 // specifications/PlaceSpecification.java public class PlaceSpecification { public static Specification likeInformationName( String informationName ) { return new Spe..