트러블 슈팅12 캘린더 조회 Redis를 활용해 성능 개선하기 캘린더 조회 Redis를 활용해 성능 개선하기 1. 증상 LounGe 서비스는 캘린더에서 본인의 일정도 추가할 수 있으면서 가입되어 있는 그룹의 일정도 캘린더에서 함께 보여준다. 이는 많은 그룹에 가입되어 있으면 많은 일정을 한 번에 불러와 서비스에서 가장 부하가 쉽게 걸릴 곳으로 예상을 했다. 많은 데이터를 조회하기 때문에 성능 저하가 가장 빈번하게 일어남 2. 해결방법 사과 그룹과 망고 그룹이 있다. 사과 그룹에는 100명의 인원이 가입되어 있고 망고에는 10명의 인원이 가입되어 있다. 만약 두 개의 그룹 일정이 같다면 사과는 한 사람이 한 번씩 일정을 확인하더라도 망고보다 90번의 그룹 일정을 추가적으로 더 불러오는 것이다. 그렇다면 사과라는 그룹의 일정은 캐시에 저장하여 데이터 베이스와의 통신 횟.. 트러블 슈팅 2023. 3. 27. Overfetching 성능 개선 최종 프로젝트 성능 개선 1. 증상 DB에서 불필요한 데이터를 받아오는 Overfetching 문제가 있었다. 이 사소한 문제 하나로도 성능에 차이가 생기지 않을까라는 의문이 들었다. 필요한 칼럼만 select로 가져오면 유의미한 성능에 변화가 있을까?? Overfetching으로 인한 성능 저하 2. 해결방안 쿼리를 수정하여 불필요한 데이터를 최소화 시키면 성능 면에서 좋은 결과를 얻을 수 있을 거라고 판단하여 쿼리 수정 작업 진행 조회 시 필요한 칼럼만을 select하여 불필요한 데이터를 최소화 위와 같은 코드를 QueryBulider를 사용하는 로직으로 바꾸고자 했다. Repository에서 find를 QueryBulider로 바꿔보았다. 정상적으로 기능이 작동되는 걸 확인했다. 이제 각각 쿼리를 .. 트러블 슈팅 2023. 3. 24. 검색을 기능 개선을 위한 Elastic Search사용 검색을 기능 개선을 위한 Elastic Search사용 1. 증상 기존의 검색 기능은 LIKE 연산자를 이용해 구현하였었다. 하지만 데이터 베이스에 데이터가 많아지자 성능이 심각하게 저하되었다. LIKE 연산자 사용 시 데이터가 많으면 심각한 성능 저하 발생 2. 해결방법 검색 기능의 LIKE를 다른 방법으로 대체 Elasticsearch 도입 처음에 LIKE로 TAG의 ID를 찾아오는 방식을 ES로 변경해서 ID를 리턴해주고 해당 ID로 DB에서 데이터를 받아오는 로직을 구현했었다. 곰곰히 생각해 보니 처음부터 ES에 색인이 되어있으면 해당 과정이 필요 없을 것 같다는 의문이 생겨 다시 리팩토링을 시작했다. 우선 프론트에서 바로 받아서 사용할 수 있도록 인덱싱 할 때 데이터를 바로 데이터를 가공해서 넣.. 트러블 슈팅 2023. 3. 21. 최종프로젝트 성능 개선을 위한 고민 반복되는 쿼리를 한 번의 쿼리로 해결할 수 있을까? 우선 코드를 보자 async tagCheck(tags: string[], groupId: number) { if (!tags.length) { return; } tags.forEach(async (tag) => { const findTag = await this.tagRepository.findOneBy({ tagName: tag }); if (!findTag) { const createTag = await this.tagRepository.create({ tagName: tag }); await this.tagRepository.save(createTag); await this.tagGroupRepository.insert({ tagId: create.. 트러블 슈팅 2023. 3. 3. 형식의 인수는 'string' 형식의 매개 변수에 할당될 수 없습니다. 내가 객체 타입의 데이터를 매개변수로 넘겨줄 때 그 매개변수의 타입을 string으로 해놓고 넘겨주고 있어서 발생한 오류였다. 타입을 일일이 지정해서 넘겨주는 데이터와 전달하는 파라미터 사이의 데이터 타입이 일치해야 한다. 예를 들어 아래와 같이 입력하고 있었다면 const data = { name: '5kiran', age: 30, job: 'developer', } const userInfo = (user: string) => { console.log('user', user) } 이를 해결하기 위한 방법 1. 객체 형태를 문자열 형태로 변환 // 타입만 string으로 취급하는 객체 const user = "{ name: '5kiran', age: 30, job: 'developer'}" const .. 트러블 슈팅 2023. 2. 13. NestJs 패키지 설치 무한 로딩 NestJS 패키지 설치시 ts-jest 때문에 설치가 안되는 현상 1. 2023년 1월 중순부터 현재(1월 31일)까지 ts-jest 설치가 안되는 현상이 발견됨 일단 이렇게 패키지 설치가 안될경우에 패키지의 문제인지 아닌지를 확인하기위해서 스택오버플로우에 검색을 해봤지만 외국인들은 설치가 잘만 되는것 같았다 그럼 집에있는 네트워크가 문제인가 싶어 노트북에 핸드폰 테더링을 연결해서 install 해봤지만 실패 (집에있는 인터넷, 핸드폰 모두 KT 사용중) 그렇다면 생각해볼 수 있는건 통신사 문제라는것으로 결론이 났고 그렇게 구글링 시작 2. 현재 이 문제는 KT를 사용하고 있는 한국사람들 대상으로 일어나고 있는 문제가 맞았다 https://github.com/kulshekhar/ts-jest/issue.. 트러블 슈팅 2023. 2. 9. 23/01/11 WebSocket Buffer ?? 노마드 코더 클론 코딩을 진행 중 터미널에 찍힌 이상한 문자! Front에서 Back으로 웹소켓을 이용해 메시지를 보내는 중이었다 Front socket.send("hello from the browser") Back socket.on("message", (message) => { console.log(message) }) 정상적이라면 터미널에 hello from the browser이 출력 되어야 하지만 Buffer 이란 이상한 문자를 출력한다 알고 보니 메시지를 출력하는 과정에서 메시지를 영어로 받아오지 못하고 buffer에 저장되어 있는 16진수 방식으로 가져온 경우로 추측되었다고 한다. 해결방법 console.log(message);를 console.log(message.toString('utf8.. 트러블 슈팅 2023. 1. 11. Node Cannot set headers after they are sent to the client 에러 Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client at ServerResponse.setHeader (_http_outgoing.js:470:11) The error "Error: Can't set headers after they are sent." means that you're already in the Body or Finished state, but some function tried to set a header or statusCode. When you see this error, try to look for anything that tries to send a header after some .. 트러블 슈팅 2023. 1. 4. Error: listen EADDRINUSE: address already in use :::3000 에러 오늘은 EC2로 과제 배포를 하려던 중 이상한 오류를 만났다. Error: listen EADDRINUSE: address already in use :::3000 이 문제에 대한 해결 방법은 생각보다 간단했다. sudo lsof -i :3000 를 터미널에서 입력하고!! 보면 PID 4205로 프로세스가 돌아가는 게 보인다 sudo kill -9 PID번호 돌아가고 있는 프로세스를 죽이고 다시 node app.js를 해보니 아래와 같이 이슈가 해결됐다 트러블 슈팅 2022. 12. 15. MongoDB 연결 에러 MongooseServerSelectionError: connect ECONNREFUSED ::1:27017 MongooseServerSelectionError: connect ECONNREFUSED ::1:27017 위와 같은 에러의 해결 .. 몽고DB connect 하는 부분에 localhost를 127.0.0.1로 바꾸어주니 해결됐다. .connect("mongodb://127.0.0.1:27017/spa_mall") 번외로 서버 실행했을 때 위와 같은 글이 출력이 되는데 이 부분은 아래 코드를 추가하여 해결할 수 있었다. 아마 몽구스가 최신 버전으로 업데이트 되며 생긴 문제 같다. mongoose.set('strictQuery', false); 트러블 슈팅 2022. 12. 14. Uncaught ReferenceError: Invalid left-hand side in assignment 에러 예기치 않은 할당이 있을 때 JavaScript 예외 "잘못된 할당 왼쪽"이 발생합니다. 예를 들어 또는 =대신 단일 기호가 사용되었습니다 . ===== 메시지 SyntaxError: Invalid left-hand side in assignment (V8-based) SyntaxError: invalid assignment left-hand side (Firefox) SyntaxError: Left side of assignment is not a reference. (Safari) 오류 유형 SyntaxError. 무엇이 잘못되었나요? 어딘가에 예상치 못한 임무가 있었다. 예를 들어 할당 연산자 와 같음 연산자 가 일치하지 않기 때문일 수 있습니다 . 단일 =기호가 변수에 값을 할당하는 동안 ==또는.. 트러블 슈팅 2022. 12. 8. GIT PUSH 오류 미니프로젝트 진행중 깃허브에 아래와 같은 오류가 뜨면push 가 되지 않았다 C:\Users\gitProject>git push origin master To https://github.com/userId/userProject.git ! [rejected] master -> master (non-fast-forward) error: failed to push some refs to 'https://github.com/userId/userProject.git' hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes (e... 트러블 슈팅 2022. 11. 17. 이전 1 다음 반응형