Today I Learned
-
Flyway를 이용해 데이터베이스 테이블 변경 사항 관리하기Today I Learned 2023. 5. 5. 22:04
이전에 프로젝트를 진행하는 과정에서 쉽지 않았던 것들 중 하나로 Entity를 변경한 후 서버를 실행시켰을 때 데이터베이스에 해당 Entity의 변동사항들을 일일이 적용시켜줘야 했었던 것이 있었다. 예를 들어 다음과 같은 Entity가 있다고 치면, @Entity public class Semester { @Id @GeneratedValue private Long id; private String name; private Boolean finalized; // constructors // ... } H2 로컬에는 이런 식으로 테이블이 생성되었다. 구현을 진행하는 과정에서 Entity의 이름을 변경하거나, column 이름을 변경하면 당연히 생성되어 있는 테이블에 변경사항이 자동적으로 반영되겠거니 생각했었..
-
JPA에서 QueryDSL을 사용해 Join이 필요한 쿼리 수행하기Today I Learned 2023. 5. 4. 02:11
JPA를 이용해 두 개 이상의 테이블을 Join한 뒤, 조건에 맞는 Column을 쿼리하려면 쿼리 메서드를 어떻게 작성해야 할까? 이전에 개인 프로젝트를 진행할 때 모든 채팅 메시지 Entity 중 특정 채팅방의 입, 퇴장 메시지만을 선별해 쿼리해야 하는 상황이 있었는데, 그때는 어떻게든 조건을 만족시키는 쿼리 메서드 네이밍을 하거나, JPQL 문법에 맞는 쿼리문을 작성해 직접 쿼리를 정의하는 방법을 사용했었다. 어떻게든 만들어낸 쿼리 메서드를 살펴보자. List findAllByRoomIdAndTypeOrRoomIdAndType(Long roomId, ChattingMessageType enter, Long sameRoomId, ChattingMessageType quit); 한 눈에 봐도 명칭이 너무..
-
Java에서 객체의 equals를 오버라이딩할 때 hashCode를 같이 오버라이딩하는 이유 (프로그래머스 삼총사 풀이)Today I Learned 2023. 3. 8. 00:16
프로그래머스 코딩테스트 연습문제 '삼총사'를 풀이하면서 Java 객체의 equals와 hashCode 메서드를 오버라이딩해야 하는 이슈가 있었고, 그 과정을 통해 알게 된 equals를 오버라이딩할 때 일반적으로 hashCode를 같이 오버라이딩하는 이유를 정리했다. 다음의 링크들에서 문제와 문제풀이를 위해 고려한 접근법을 확인할 수 있다. 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr GitHub - hsjkdss228/daily-coding-dojo: 주간 코딩 도장 문제 풀이 저장소 주간 코딩 도장 문제 풀이 저장소. Contribute to hsj..
-
React에서 컴포넌트가 unmount되었을 때 특정 동작 수행 여부 테스트하기Today I Learned 2023. 2. 26. 20:47
@testing-library/react를 이용하는 경우 @testing-library/react 에서 제공하는 render 함수는 반환형으로 여러 콜백 함수들을 제공, 해당 함수들을 필요한 테스트에 사용할 수 있음. 그 중 여기서 사용해볼 것은 unmount() 실시간 채팅 컴포넌트 창이 화면에서 사라질 때, 상태 관리 Store에 정의한 클라이언트와 서버의 연결을 해제하는 disconnect()를 호출하는지 테스트할 것임 컴포넌트가 unmount될 때 수행하는 로직은 다음과 같이 useEffect 구문 내에 정의해놓을 수 있음 useEffect 내에서 콜백 함수를 반환시키고, 해당 콜백 함수 내에 수행시킬 동작을 정의 // src/components/chatting-room/ChattingRoomMe..
-
p, pre 태그에서 문단 속성 조정하기, TextArea에서 키보드의 Enter 키를 눌렀을 때 HandleSubmit을 수행하게 하기Today I Learned 2023. 1. 30. 04:14
줄바꿈 p 태그에서는 word-break 속성을 이용 pre 태그에서는 white-space 속성을 이용 미묘한 높낮이 조정하기는 어떻게 하지? (말로 설명해야...) line-height: 글자 위아래 간 간격 Enter handleSubmit References - https://ddorang-d.tistory.com/69 - https://htglss.tistory.com/31 - https://stackoverflow.com/questions/47809282/submit-a-form-when-enter-is-pressed-in-a-textarea-in-react
-
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..