728x90

분류 전체보기 186

[mysql] view의 장단점, 성능에 대한 고찰

발단 회사에서 포스트맨을 확인하고 로컬로 각 api들을 돌려보는데.. 게시글을 조회, 검색하는 로직에서 너무 오래걸리는 것을 확인했다. 그냥 단순한 게시판인데 값을 가져오는데 평균 1200~2000ms정도가 소요되었다. 아무리 생각해도 이상하다. 코드를 확인했더니 서비스 로직에서 직접 sql문을 사용하여 쿼리를 넣고 있었다. SQL을 봐도 간단하게 SELECT ~~~ FROM view_~~~ 이런식으로 되어있는데 오래걸릴 수가 있나? 파일을 보내는 것도 아니고 단순 json인데.. 의심해볼 수 있는 것은 view다. 회사코드를 공개할 수는 없지만, view의 장단점과 성능저하가 왜 일어났는지 포스팅하려 한다. 결론적으로 view 대신 다 뜯어내고 join했을 때 1200~2000ms에서 5~40ms로 성..

개발/DB 2023.10.17

소통의 중요성... feat. JSdoc

서두 이번에 입사하면서 회사 코드를 확인했는데 여러모로 쉽지 않았다. 왜 nest가 인기가 많은지 새삼 체감하는게, express가 워낙 자유도가 높다고는 하지만, 변수명 빼고는 모든 부분이 들여다봐야 이해가 가능했다. 이미 전 포스트에서 sql인젝션에 대비하지 않고 쿼리문에 직접 변수를 넣는 것부터 어느정도 나의 포지션에 대해 직감하고 있는 중이다...ㅎㅎ 당장 api를 수정해서 적용해야 하는 일이 있었는데, 소통하면서 개발하는 단계면 상관없는데 테스트하자마자 바로 서버에 적용을 해야하는 상황이라서 에러처리를 확실히 해야하는데 이미 구현되어있던 api들을 보았을 때 에러처리가 명확하지 않은 부분들이 있기도 했고, 설명하긴 너무 길어지고.. db관련 에러를 throw하지 않고 컨트롤러로 옮기는 등.. 방..

개발/프로젝트 2023.10.16

[pm2] 환경변수 세팅 feat. ecosystem.config.js

발단 회사 코드를 배포하는 과정에서 개발 단계에서 아무런 문제가 없었는데 pm2로 서버를 열자 에러가 났다. error bucket is required at new s3storage 어라? multer 관련 config에서 환경변수 세팅을 잘 했는데.. 그리고 개발단계에서는 에러가 나지 않는데? 먼저 이 에러는 new s3storage를 사용하기 위해서는 bucket이 필요하다는 것이고, 당연히 필요하다. 그런데 저장장소를 지정해주어야 하는데, 이 부분이 지정되지 않았다는 것이다. 해결과정 1. bucket의 환경변수를 개발, 배포환경에서 둘 다 디버깅하여 확인한다. console.log(process.env) 확인해본 결과 개발환경에서는 각 .env에 입력한 환경변수가 정상적으로 출력되는데, 배포환경..

개발/http, server 2023.10.15

[SQL] 입사하자마자 발견한 여러 문제들.. 특히 SQL 인젝션 문제

들어가기 전에.. 엘리스에서 배울 때 코치님께서 orm을 사용하지 않고 SQL문을 직접 써서 해보라고 하셨다. typeORM을 쓸 줄 아는 수준으로는 mysql 쓴다고 보기가 어렵다고.. 그리고 국비교육 수료한 이후 혼자 개발공부하면서 개인 프로젝트로 typeORM을 사용했는데, 솔직하게 SQL문에 대해 깊히 아는거보다 RDBMS 자체에 대해 공부하고 관계를 어떻게 설정하고, 효율성을 높힐 수 있는가가 중요한게 아닌가? 라는 생각을 했었다. 이번 주에 드디어 회사에 첫 출근을 하게 되면서 api를 구현하는데, 아무래도 신입이다보니 기존 다른 서비스에서 구현되어 있는 api를 그대로 똑같이 적용하는 부분을 맡겨주셨다. 모든 것이 처음이다보니 회사 깃을 받아서 하면 되는건지.. 내가 직접 구현을 해야하는건지..

개발/DB 2023.10.14

[sequelize] 서비스 - 모델 로직 분리, 리팩토링 과정

서두 회사에 처음 입사해서 각 서비스의 버전마다 코드를 확인했는데, 숨이 막혔다. 1.0, 2.0 각각 다른 담당자였는데, 1.0에서는 sql문 그대로 박아서 인젝션 대비도 안되어있고, 그러면서도 sequelize의 모델은 분리되어있었다. 이게 정녕 sequelize를 쓰는게 맞는 것인가? 모델에 각각 컬럼을 세팅해놓고 .. 분리가 된게 맞는지 모르겠다. 2.0은 오히려 퇴화했다. 모델을 분리하지 않고 서비스로직에서 모든 것을 해결하고 있었다. 아니 모든 것을 해결할 것도 없는게, 모델을 분리하지 않는게 그 코드들의 최고 효율로 보이긴 했다. 왜냐하면 전반적인 코드에 에러처리가 없었고, 에러처리가 필요한건 throw가 아니라 리턴 값으로 컨트롤러로직으로 보내고 있었다. 무엇이 문제일까? 일단 가독성이 현..

개발/DB 2023.10.13

[프로그래머스 | javascript] 정사각형으로 만들기

문제 설명 이차원 정수 배열 arr이 매개변수로 주어집니다. arr의 행의 수가 더 많다면 열의 수가 행의 수와 같아지도록 각 행의 끝에 0을 추가하고, 열의 수가 더 많다면 행의 수가 열의 수와 같아지도록 각 열의 끝에 0을 추가한 이차원 배열을 return 하는 solution 함수를 작성해 주세요. 문제 풀이 function solution(arr) { for (let i = 0; i arr[i].length) { while (arr[i].length < arr.length) { arr[i].push(0); } } if (arr[i].lengt..

[프로그래머스 | JavaScript] 그림 확대

문제 설명 직사각형 형태의 그림 파일이 있고, 이 그림 파일은 1 × 1 크기의 정사각형 크기의 픽셀로 이루어져 있습니다. 이 그림 파일을 나타낸 문자열 배열 picture과 정수 k가 매개변수로 주어질 때, 이 그림 파일을 가로 세로로 k배 늘린 그림 파일을 나타내도록 문자열 배열을 return 하는 solution 함수를 작성해 주세요. 입출력 예 picture k result [".xx...xx.", "x..x.x..x", "x...x...x", ".x.....x.", "..x...x..", "...x.x...", "....x...."] 2 ["..xxxx......xxxx..", "..xxxx......xxxx..", "xx....xx..xx....xx", "xx....xx..xx....xx", ..

[프로그래머스 | JavaScript] 코드 처리하기

문제 설명 문자열 code가 주어집니다. code를 앞에서부터 읽으면서 만약 문자가 "1"이면 mode를 바꿉니다. mode에 따라 code를 읽어가면서 문자열 ret을 만들어냅니다. mode는 0과 1이 있으며, idx를 0 부터 code의 길이 - 1 까지 1씩 키워나가면서 code[idx]의 값에 따라 다음과 같이 행동합니다. mode가 0일 때 code[idx]가 "1"이 아니면 idx가 짝수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다. code[idx]가 "1"이면 mode를 0에서 1로 바꿉니다. mode가 1일 때 code[idx]가 "1"이 아니면 idx가 홀수일 때만 ret의 맨 뒤에 code[idx]를 추가합니다. code[idx]가 "1"이면 mode를 1에서 0으로 바꿉..

[프로그래머스 | JavaScript] 전국 대회 선발 고사

문제 설명 0번부터 n - 1번까지 n명의 학생 중 3명을 선발하는 전국 대회 선발 고사를 보았습니다. 등수가 높은 3명을 선발해야 하지만, 개인 사정으로 전국 대회에 참여하지 못하는 학생들이 있어 참여가 가능한 학생 중 등수가 높은 3명을 선발하기로 했습니다. 각 학생들의 선발 고사 등수를 담은 정수 배열 rank와 전국 대회 참여 가능 여부가 담긴 boolean 배열 attendance가 매개변수로 주어집니다. 전국 대회에 선발된 학생 번호들을 등수가 높은 순서대로 각각 a, b, c번이라고 할 때 10000 × a + 100 × b + c를 return 하는 solution 함수를 작성해 주세요. 입출력 예 rank attendance result [3, 7, 2, 5, 4, 6, 1] [false..

[JavaScript] const로 할당한 값이 바뀌는 이유

코딩테스트 문제를 푸는 도중 알게 된 것인데, const 로 할당한 값이 바뀌는 경우는 처음봐서 기록해두려 한다. 예를 들어서 rank라는 변수는 [3, 7, 2, 5, 4, 6, 1] 라는 배열이다. 그리고 이 값을 sort를 사용해서 순서대로 나열하면 [1,2,3,4,5,6,7]이 될 것이다. 이 때 처음 rank값을 저장하기 위해 다음과 같이 입력했다. const originRank = rank; const sortRank = rank.sort((a, b) => a - b); 상수 originRank에는 기존의 rank, 상수 sortRank에는 rank를 정렬한 값으로 지정했다. 이 두 값은 변하지 않도록 상수로 지정했다. 내 의도대로라면 어디서든 originRank는 [3, 7, 2, 5, 4,..

개발/language 2023.09.10
728x90