백엔드 개발58 #057. 쿼리개선: 피드 페이지 로직 개선 문제상황 커뮤니티 피드가 느려서 호출하는 로직에 개선이 필요했다. 문제와 해결 (1) 피드에 필요한 레시피, 베이커리 정보 조회 수정 피드는 여러 종류의 글들이 한 번에 보인다. 이 중에서 일반 글(질문글, 잡담글)과 다르게 베이커리 리뷰, 레시피 리뷰는 베이커리과 레시피 데이터를 불러와야한다. 기존에는 피드를 쭉 보면서 매번 데이터를 불러왔다. 그러다보니 매번 베이커리와 레시피를 조회하기 위해 DB와 커넥션을 맺고 통신 하는 과정이 필요했고 특히 DB 섭이 미국에 있다보니 이 과정의 비용이 컸다. AS_IS val post: Page = postRepository.findAll( pageData.before, pageRequest, ) // post를 순회하며 type이 bakeryReview 이거나 .. 2023. 8. 25. #056. 리팩터링: 멀티스레드 환경에서 null 제거 이해하기 (Smart cast to 'xx' is impossible, because 'xxx' is a mutable property that could have been changed by this time) 문제 일반적으로 node 개발을 할 때는 어떤 값이 있는 지 확인하기 위해서 일반적으로 아래와 같이 if 문으로 분기를 나눈다. file이 없다는 것을 확인하고 나면 그 아래에는 file 값이 존재하는 경우에 대해서만 처리한다. 이게 가능한 이유는 node가 싱글스레드를 지원하기 때문이다. 하나의 스레드가 작업하기 때문에 위에서 아래의 흐름으로 위에서 null을 제거하면 아래에서는 이를 반영해 타입추론을 할 수 있다. async function doSomethingWithFile(fileId: number) { const file = await this.fileQueryRepository.findOne(fileId); if (!file) { throw Error({ message: '존재하지 않는 파일입.. 2023. 8. 14. #055. 리팩터링: Promise 객체 다루기 Node가 싱글 스레드로 비동기 처리하는 방법 libuv(리버브)는 이벤트 루프를 기반으로 비동기 I/O를 지원하는 다중 플랫폼 C 라이브러리이다. nodeJS의 비동기 논블로킹인데, 이러한 비동기 논블로킹 작업을 위해 libuv를 사용한다. 리버브는 I/O 관련 블로킹 작업을 처리하여 이벤트 루프(싱글 스레드)가 blocking되지 않게 한다. I/O 관련된 작업(http, Database CRUD, filesystem) 등 블로킹 되는 작업들을 백그라운드(OS 커널 혹은 libuv의 thread pool)에서 수행하고, 이를 비동기 콜백함수로 이벤트 루프에 전달한다. 이렇게 블로킹 되는 작업을 넘기는 것을 'offloading(오프로딩)' 이라고 한다 이벤트 루프는 싱글 스레드이고, 블로킹 I/O 관.. 2023. 8. 13. #054. 코프링: spring-event 로 pub-sub 알림 시스템 만들기 신규 유저 또는 유저가 작성한 컨텐츠가 있으면 이를 디스코드 알림으로 받고 싶어 자동화 시스템을 구성했다. 이전 에러 알림 자동화 작업(링크)을 하면서 클라우드 플레어 워커가 디스코드 웹훅을 관리하도록 설정했기 때문에 스프링이 클라우드 플레어를 보고 워커가 이를 디스코드 웹훅 모양으로 만들어주도록 했다. 이벤트를 어떻게 발생시킬 지 고민을 했는데, - 어드민 성격이어서 알림은 핵심적인 로직 또는 실행이 보장 할 필요는 없다. - 회원가입 로직은 알림을 publish만 하고 이벤트를 받고, 처리하는 로직은 이벤트와 관련된 모듈이 처리한다. (pub-sub구조) - 알림 보내기를 동기적으로 처리할 필요는 없다. 이 조건들을 만족시키는 적정 기술로 sprinb event가 있어 사용했다. spring-even.. 2023. 7. 29. #052. 쿼리 개선: subquery가 원하는 인덱스를 타지 않는 경우 🚗 문제 상황레거시 코드를 새로운 코드로 옮기는 작업을 하면서, 기존 쿼리의 효율성을 파악하기 위해 실행계획을 찍어보는데 독특한 상황이 있었다. 쿼리1 은 IN 절로 subquery를 사용하고 있고-- 쿼리1: SELECT "id" FROM "courses" WHERE (("status" = 'publish' AND "published_at" < now() AND "deleted_at" IS NULL) AND "exposure" = true AND "id" IN (SELECT "course_id" FROM "instructors" WHERE "user_id" = 743661234 AND "type" = 'main'));쿼리 2는 subquery를 실행시킨 결과를 사용해 쿼리를 실행한다.-- 쿼리2: SELE.. 2023. 7. 20. #051. 자동화: cloudflare worker+ sentry + discord 웹훅으로 알림 시스템 개념(다이어그램) 기존에 모니터링 도구로 sentry를 사용하고 있었는데, 알림을 제때 확인하는 것이 쉽지 않아 discord로 알림을 받을 수 있게 구성했다. (슬랙은 유료라..)적용(1) sentry에서 오는 json 훅 확인하기 먼저 sentry에서 웹훅으로 보내는 알림의 json 모양을 알아야 해서 아래의 웹훅 사이트를 이용해 json 필드들을 확인했다. (1) 웹훅 사이트에서 웹훅을 받을 주소를 확인한다.웹훅 사이트: https://webhook.site/#!/9723359f-6f36-41a7-830b-e9aec78bb207/b2e4dfee-cc03-4a64-b061-00f9203304cf/1 이 주소를 센트리 settings -> 웹훅에 붙여넣으면 sentry -> 웹훅 사이트로 알림을 보낸다.. 2023. 7. 19. 이전 1 2 3 4 5 ··· 10 다음