본문 바로가기

공부27

[BE] SSE 재연결과 관련된 시간 이것저것 테스트하던 중, 가장 기본적인... 재연결 로직이 정상적으로 동작하지 않는 것을 확인했다. SSE 연결은 클라이언트에서 요청을 보내고 (빨간색 화살표), 서버는 해당 연결을 OS에 반환하지 않고 유지하는 기법이다.서버에서 클라이언트로 메시지를 보내야 할 때, 보관하고 있던 응답으로 클라이언트에 메시지를 전송한다.초록색은 서버에서 complete가 실행되는 순간이다. 서버는 연결 종료를 통보하고, 클라이언트는 재연결을 요청한다.이와 관련된 시간을 설정해줘야 한다. 1. timeoutSseEmitter는 연결이 끊어졌지만 유지되고 있는 좀비 연결을 방지하기 위해 Timeout 시간을 설정할 수 있다.서버는 설정된 시간이 지난 SseEmitter를 처리한다. private SseEmitter.. 2025. 6. 12.
[BE] 알림 기능 리팩토링 - 분산 환경 지원을 위한 Redis 추가 단순한 기능만 만들려고 했는데, 자꾸 뭔가가 늘어난다.user1이 server1에서 SSE 연결이 맺어졌다.이 경우 Emitter 객체는 Server1의 인스턴스 내부에서 관리되고 있다.그런데 다중화된 서버에서는 User1의 파일 업로드 요청이 Server2로 전달되는 경우가 있다.지금 내 로직 구조에서는 이 경우 사용자에게 알림을 보낼 방법이 없다. 그래서 두 가지 방법을 생각해봤다.1. SseEmitter 객체 그 자체, 혹은 내부의 Connection 정보를 DB나 Redis 등에 저장했다가, 메시지가 오면 해당 객체를 복원하거나 꺼내와서 쓸 수는 없는가? 2. Pub/Sub 구조를 이용한 메시지 발행과 수신으로 모든 서버에서 자신이 보관하고 있는 연결 중 해당 사용자가 있으면 응답 전송 1번은 아.. 2025. 6. 10.
[BE] 알림 기능 리팩토링 - 단일 책임 원칙 단일 책임의 원칙(Single Responsiblity Principle, SRP) - 하나의 클래스는 단 하나의 책임만 가져야 한다. SRP는 클래스의 '변경'에 효과적으로 대응하기 위해 만들어진 원칙이다.하나의 클래스가 위의 로직처럼 여러 가지의 책임을 갖고 있으면 다음과 같은 문제가 발생할 수 있다.높은 결합도 - 한 책임의 변경이 다른 책임에 영향을 미칠 수 있다. 낮은 응집도 - 서로 관련 없는 코드들이 섞여 있어 코드를 이해하기 어렵다. 어려운 테스트 - 하나의 기능을 테스트하기 위해 다른 기능과 관련된 불필요한 설정이 필요하다.코드 재사용성 낮음 - 여러 책임이 섞여 있어 원하는 기능만 떼어내어 사용하기 어렵다.팀 협업이 어려움 - 여러 개발자가 동일한 코드를 수정하면 충돌(Merge Com.. 2025. 6. 10.
[React] 참조 동일성 리액트 컴포넌트의 리렌더링이 발생하는 조건은 내가 알기로는 3가지이다. 1. 부모 컴포넌트가 리렌더링 되는 경우, return 부분이 재호출되면서 자식 컴포넌트로 리렌더링 대상이 된다. - 이 경우 React.Memo로 감싼 컴포넌트는 리렌더링 대상에서 제외된다.2. 부모 컴포넌트에게 전달받은 props이 변하는 경우, 해당 상태값을 전달받은 자식 컴포넌트도 리렌더링 대상이 된다.3. 자신의 상태(State)가 변하는 경우, 리렌더링 대상이 된다. - useMemo, useCallback으로 2-3의 리렌더링 조건에서 내부의 변수, 함수를 제외할 수 있다. - react-query에서 data 값이 변하는 경우 역시 내부 상태가 변하는 것으로 간주한다. 리액트를 공부하면 리렌더링 조건은 항상 강조되는 .. 2025. 6. 8.
[모니터링] APM & Distributed Tracing 오늘 새벽까지 ELK Stack을 맥북에 설치하고 열심히 갖고 놀아보았다.모니터링 시스템은 올해 초 시스템 분석설계 수업을 들으면서 가장 만들어보고 싶었던 내용 중 하나였다.더 정확하게는 자료흐름도를 공부하며 자료흐름을 추적할 수 있는 시스템이 존재하면 좋겠다고 생각해왔다. 예를 들어 내가 포트폴리오로 만든 동영상 플랫폼 중 파일 업로드는 아래와 같은 구조를 갖고 있다. 1. 사용자가 웹에서 파일을 업로드한다.2. 백엔드 서버가 사용자의 업로드 요청을 처리한다. 1) 동영상의 ID를 만들어 사용자에게 반환한다. (DB에 해당 ID로 내용을 저장한다.) 2) 동영상을 서버로 수신한다. 3) 임시 위치에 동영상을 저장한다. 4) DB에 파일 업로드 처리를 저장한다. 5) 사용자에게 저장 성공 메시지.. 2025. 6. 7.