오늘은 별건 아니고, 배포중인 어플에서 뉴스 댓글 목록을 불러올때 2~3초 가량 소요되서 이 코드를 리팩토링 하였다. 리팩토링은 왜 할까 ? 1. 성능향상, 가독성 향상 2. 유사한 내용이 반복될때 코드의 중복 제거 3. 새로운 기능을 추가할 때 위 세가지 이유가 제일 핵심적인 이유다. 기존 코드를 Swagger에서 돌려 보았을때 두 눈을 의심했다. 이게 목록 불러오는 @Get API를 단 한번 실행 시킨것이다.... 물론 Response값으로 다양한 값이 필요하긴 하지만 이건 말이 안된다. 이러니 목록 불러올때 2~3초 가량 로딩시간이 걸렸던 것이다. 실행된 사진 속 쿼리문을 보니 중복된 테이블에서 SELECT가 여러번 이루어 지는걸로 보아 for문을 돌면서 그 안에서 DB커넥션이 여러번 이뤄지고 있는..
Javascript에서 배열의 요소를 순차적으로 순회하면서 특정 조건을 만족하는지 체크하는 some()함수를 다룰 것이다. some함수의 특징은 - true를 만족하는 요소를 찾을 때까지 callback 함수를 실행한다. - 만족하는 요소가 없거나 빈 배열인 경우 false를 반환한다. - 처리하는 요소의 범위는 callback 함수의 첫 호출 전에 설정된다. likeTotal이라는 배열안에 객체의 "user_uuid"라는 key값에, "user"라는 value값이 있으면 true를 반환 하고 싶었다. 관련 코드를 확인해 보자. const likeTotal = [ { user_uuid: '1234', likes: 10 }, { user_uuid: '5678', likes: 5 }, { user_uuid:..
최근에 주변에서 AWS 엑세스키가 털려 원인불명 고사양 인스턴스가 생기면서 몇 천만원 가량의 비용이 발생됬다. 램이랑 CPU를 말도안되게 잡아먹고 있었던걸 보면 아마 채굴을 했지 싶다.. 나도 혹시 모를 상황에 미리 대비를 해야겠다고 생각했다. 그래도 우선 "IAM 계정 생성 시 내 이메일로 알림이 오게 설정"을 할 것이다. 꽤나 서칭을 했는데 관련 절차서가 제대로 된게 하나도 안나오더라. 그래서 이번에 나라도 제대로 포스팅 해야겠다. 우선 IAM 관련 설정이기 때문에, 모든 작업은 버지니아 북부 리전에서 진행되야 한다. 먼저 EventBridge가 처리할 이벤트를 포함하여 IAM 이벤트를 캡처하도록 CloudTrail을 생성해보자. 추적생성으로 들어간다. 이름을 정하고 스토리지 위치는 S3버킷 생성으로..
이전에 Nest.JS로 개발하다가 중복된 값이 있으면 Update 해주고 아닐경우 Insert를 해야되는 케이스가 있었는데 Upsert나 save를 사용하지 않고 로직으로 find해서 If-Else문으로 Update, Insert를 날려서 처리한적이 있었다. Upsert나 Save로 처리했으면 코드가 좀 더 간결해지고 DB커넥션도 줄여서 성능향상도 됬을텐데,,,하고 아쉬워하던 찰나에 비슷한 케이스로 개발을 할 일이 생겼다! 뉴스의 기사에 좋아요, 싫어요 리액션 기능을 추가하는 케이스이였다. 이번엔 무조건 로직으로 처리하지 않고 Upsert나 Save로 처리해야겠다고 생각했다. 그럼 우선 Upsert랑 Save에 주요 차이점 대해 알아보면 Upsert는 데이터베이스에서 레코드를 업데이트하거나 삽입하는 데 ..
회사에서 뉴스관련 DB를 대용량 데이터베이스 처리에 적합한 Nosql중에 MongoDB를 사용하고 있다. 그래서 요새는 일과후나 주말에 MongoDB 공부에 전념하고 있다. MongoDB 서적은 역시 국룰인 오라일리의 "몽고 DB 완벽가이드" 로 시작을 하였다. 역시 국룰인데는 이유가 있다. 강추..!! 아직은 서적 1회독에 인강 좀 끄적인 상태라서 몽고DB가 뭔지 대략적으로만 아는 상태인데 이거...공부를 할수록 매력있는것 같다. 개인적으로 Mysql보다 깊게 파보고 싶어졌다. 서론이 길었지만... 무튼 본론으로 돌아와서 MongoDB에서 Join을 사용해야만 하는 상황이 생겼다. MongoDB와 같은 NoSql 데이터 베이스는 기존 관계형 데이터베이스와 다른 데이터 모델을 사용하기 때문에 조인에 대한..
오늘은 Mysql에서 컬럼안에 JSON데이터를 추출하는 방법에 대해 알아보자. nm_post 라는 테이블안에 extras 라는 컬럼이 존재한다. 해당 컬럼은 JSON형식으로 다음과 같다. { "order": [ "post.news" ], "article": { "article_key": "123456789", "article_title": "아이브, 日 ‘골드디스크’ 2관왕 석권", "article_thumbnail": "https://123123123.jpg", "article_press_id": 21 } } 이 extras 컬럼안에 있는 "article_press_id"를 추출해서 검색하고 싶었다. 이때 JSON_EXTRACT 라는 함수를 사용하면 된다. JSON_EXTRACT(data, '$.nam..
저번주에 내내 머리를 쥐어뜯는 일이 있었다.. 그래서 해당 문제에 대해서 뭐가 잘못됬으며 어떻게 해결했는지 정리하고, 관련된 req.param / req.query / req.body에 대해서도 포스팅을 해보려 한다. 우선 관련 개발 명세서는 이러했다. 명세서를 보고 되게 단순해서 금방 개발을 할 줄 알았다. 해당 유저가 키워드를 팔로우할 uuid를 req POST로 보내주면 끝이였다. 문제1 path: /api/follows/{uuid} parameters: Body() , { “keyword_uuid” : ~~~ } 상황: stg swagger, insomnia에서 같은 URL과 같은 Token 넣고 Post할 시 DB에 정상적으로 쌓임 하지만 개발중인 웹에서 같은조건으로 진행시 제대로 안됨. DB에..
팀원들과 협업을 하면서 가끔 console.log()를 제거하지 못한 채 commit을 한적이 있었다. 이는 별거 아닌거 같아보여도 운영서버 AWS에 올라갔을때 악영향을 끼친다. 코드에 민감한정보(암호, Api키, 사용자 데이터)를 기록하면 서버로그에 엑세스할 수 있는 모든 사람에게 노출이 될 수 있고, 시스템 리소스를 소비하고 처리시간을 차지하여 애플리케이션 전체 성능에 영향을 끼칠수 있고, 로그가 빠르게 복잡해 져서 관련 정보를 수정 삭제하기 어려워져서 디버깅이 어려워지고, 제일 중요한, AWS는 저장 및 처리된 데이터 양에 대해 요금을 부과하므로 비용이 증가할 수 있다. 이제 console.log() 제거에 필요성을 느낄 것이다. eslint로 단순하게 "no-console" 에서 에러 처리를 해버..
오늘은 Typescript 환경에서 class-transformer에 대해서 포스팅 할 것이다. 회사에 테크니컬 리더님께서 꼭 class-transformer에 대해서 제대로 알고 가야지 된다고 하셔서 오늘 끝장을 내보려한다. 포스팅을 위해서 많이 찾아봤는데 이미 NestJS에서 개발을 하면서 DTO와 plainToInstance를 사용하고 있었는데 이게 class-transformer인줄도 몰랐다... 머쓱 우선, class-transformer를 사용하는 이유는 크게 7가지가 있다. 1. 데이터 유효성 검사 class-transformer와 class-validator를 함께 사용하여 TypeScript클래스의 객체에 대한 데이터 유효성 검사를 수행하는 경우, 일반적으로 DTO(Data Transfe..
오늘은 Javascript에서 자주쓰이는 find()와 filter() 사용법에 대해 알아보고 응용해서 두 배열에서 서로 일치하는 Value 값 찾기를 할 것이다. 해당 코드를 통해서 find()를 먼저 알아보자. 변수 "findMeComment"는 "meCommentList"라는 배열의 객체의 uuid의 value과 controller에서 넘겨준 Param(uuid)와 일치하는 객체를 뽑는 역할을 한다. meCommentList = [ {uuid:123123}, {uuid:234234}, {uuid:333333}, ... ] find()메소드는 변수에 저장된 객체 배열을 검색하는 역할을 하고있다. 해당코드에서 find()메소드는 콜백함수를 인수로 사용하며, 이 함수는 값을 반환할때까지 배열의 각 요소에..