최근에 주변에서 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()메소드는 콜백함수를 인수로 사용하며, 이 함수는 값을 반환할때까지 배열의 각 요소에..
NestJS에서 오늘 개발을 하다가 너무나 허무한 실수를 해버렸다. 이참에 그간 당연시 사용하고 있었던 부분에 대해서 왜 그렇게 사용을 해야만 하는지에 대해서 포스팅 해보려한다. 해당코드를 보면 Controller에서 @Param('uuid')과 @Body() 로 파라미터를 service부 한테 넘겨주고 있는 코드다. 이상이 없다고 생각해서 계속 돌려봤는데 값이 안나오고 오류도 안뜨고 해서 뭐지 싶었다..(?) 그래서 어디서 잘못됬나 확인해보려 console.log()를 하나씩 찍어가면서 확인해봤는데 어라.. console.log(uuid)의 결과가 undefined로 나왔다. 보자마자 급하게 개발하느라 뭔가 빠뜨렸구나 싶었다. 그래서 차근차근 봤더니 @Param을 사용하고 경로에다가 추가를 안해버렸던 ..
이 문제를 해결하려 최근들어 가장 머리를 쥐어뜯었던 것 같다. 이틀가량 문제해결과 포스팅준비에 시간을 쏟았다는 Tmi... 우선 어떤 상황인지부터 알아보자. 쿼리스트링으로 구독여부를 Boolean타입으로해서 해당 DTO를 파라미터로 넘겨줘야 하는 상황이었다. 처음에 보고 금방 개발할 수 있겠다 싶었는데 Boolean타입이 이상하게 찍히기 시작했다. 분명 사진처럼 Boolean으로 타입 지정해줬는데 혹시나해서 typeof 로 console을 한번 찍어보기로 했다. 어라.. dto타입이 string으로 나오는걸 확인했다. query string은 항상 string 타입으로 요청이 들어오기 때문에 transform을 통해 타입 변환을 해줘야 했다. ValidationPipe설정을 바꿔줘야지 데이터 타입이 변환..