ilikezzi의 등록된 링크

 ilikezzi로 등록된 티스토리 포스트 수는 63건입니다.

[Nest.JS] 구글, 네이버, 카카오 소셜로그인 구현 - 1 [내부링크]

진행중인 사이드 프로젝트에서 기획이 끝나서 화면기획서가 나오고, 디자인쪽도 피그마로 UI/UX 디자인을 시작하고, 개발쪽도 DB ERD 설계, 서버설계, Stg서버 등등.. 기본적인 개발하기 위한 준비를 마치고 온보딩, 메인페이지 부터 드디어 Api 작업에 들어갔다. 막상 개발은 큰 어려움이 없을텐데, 역시나 처음해보는 기획이나 DB/서버 설계에서 시간이 많이 걸리고, 제대로 처음 해보는거라서 어렵더라.. 따로 Local 이메일 로그인은 제외하고 구글 / 카카오 / 네이버 로그인 세가지를 넣기로 했다. NestJS에서 소셜 로그인을 붙히기 위해서는 순서에 대한 이해가 필요하다. 하나씩 차근차근 살펴보자. 소셜 로그인 순서 내가 이해한 순서를 이해하기 쉽게 그림으로 만들어 보았다. (디자인 감각 Zero ..

[Javascript] 클로저_코어 자바스크립트 [내부링크]

오늘은 5단원인 "클로저" 를 포스팅 할 것이다. 클로저(closure)는 자바스크립트에서 중요한 개념 중 하나지만, 사실 이번에 처음 제대로 파본다... 실행 컨텍스트에 대한 사전지식이 없으면 분명 이해가 안 갈 것이다. 마침 2단원에서 실행컨텍스트를 다뤘으니 꼭! 꼭! 보고 오길 권장한다. https://ilikezzi.tistory.com/55 [Javascript] 실행 컨텍스트_코어 자바스크립트 저번에 포스팅한 "데이터 타입" 에 이어서 다음 챕터인 "실행 컨텍스트"를 포스팅 할 것이다. https://ilikezzi.tistory.com/52 [Javascript] 데이터 타입_코어 자바스크립트 계획했던대로 자격증 취득도 다 ilikezzi.tistory.com 05. 클로저 클로저의 의미 및..

[해커톤] 숙명여대 Bigdata/AI Streamlit 해커톤 멘토 참여후기 [내부링크]

저번주에 숙명여대에서 Bigdata/AI Streamlit 해커톤을 진행했다. 나는 AWS 멘토로 참여하게 되어서 간략하게 후기를 써보려고 한다. 저번 인하대 해커톤 AWS 멘토로 참여했을때, 멘토진들이랑 거의 동일해서 반가웠다ㅎㅎ 이번 해커톤은 오뚜기가 후원사여서 오뚜기의 상품 판매 데이터와, 제품 리뷰 데이터를 받아서 진행했다. 해당 데이터와 생성형 AI를 활용하여 Streamlit or Cloud native app을 개발을 하였다. Streamlit에 대해서 이번기회에 처음 접하게 되었는데, Streamlit은 데이터 사이언티스트나 백엔드 개발자처럼 프론트엔드에 익숙하지 않은 사람들도 쉽게 데이터 시각화나 웹 앱을 만들 수 있도록 해주는 파이썬 라이브러리이다. 코드 몇 줄만으로도 인터랙티브한 대시..

[Nest.JS] Nest.JS에서 cache-manager를 활용한 캐싱 방법 [내부링크]

운영중인 서비스에서 응답시간이 느려진 부분이 있어서, 이를 개선하고 싶었다. 마침 유저 구분이 필요 없고, 수정이 거의 없는 페이지라서 캐싱 전략을 사용하기 적합해 보였다! 해당 페이지에 대해 간략하게 설명하자면, 당일 새벽시간의 뉴스데이터를 전부 분석을 해서 아침 8시에 그날의 뉴스를 한눈에 정리해서 보여주는 페이지다. 따라서 유저별로 개인화가 들어가는 페이지도 아니고, 웬만해서는 수정이 이뤄지지 않는 API 이다. 그럼 바로 캐싱작업을 시작해보자. 설치 해당 프로젝트로 이동해서 필요한 패키지를 몇가지 설치해주자. npm install cache-manager cache-manager: 캐싱을 담당할 라이브러리다. npm install @nestjs/common nestjs의 CACHE_MANAGER:..

[Error] 504 Gateway Timeout Error 해결: Nginx와 로드밸런서 타임아웃 [내부링크]

얼마 전 회사 프론트직원분께서 staging admin에서 504에러가 뜬다고 찾으셨다. 그래서 바로 staging Swagger에서 관련 API를 날려보니 다음과 같이 나왔다. 확인해보니 504 Time-out 에러가 나왔다. 이제 차근차근 해결을 해보자 ! 해결 1 - axios timeout 설정 해당 API 부분은 axios로 코드를 불러와서 파싱한 후 리턴하는 코드다. axios 할 때 일정 시간을 초과하면 504에러가 뜰 수 있다는 얘기가 있어서, 우선 time-out 시간을 늘려주기로 했다. 갑자기 504에러가 뜬 이유는 axios로 받아오는 chatGpt 관련 처리시간이 늦어진듯 하다. 그래서 timeout 을 10분으로 넉넉히 변경하였다. timeout : 600000 로컬에서 코드를 돌..

[Javascript] 콜백 함수_코어 자바스크립트 [내부링크]

오늘은 4단원인 "콜백 함수" 를 포스팅 할 것이다. 중간에 "콜백 함수 내부에서의 this" 에 대해서 깊게 다루니 이전 포스팅인 "this" 에 대해서 필수적으로 알고 있어야 한다. https://ilikezzi.tistory.com/58 [Javascript] this_코어 자바스크립트 오늘은 3단원인 "this" 를 포스팅 할 것이다. 지난번 포스팅한 "실행 컨텍스트" 도 읽어보면 도움이 될 듯하다. https://ilikezzi.tistory.com/55 [Javascript] 실행 컨텍스트_코어 자바스크립트 저번에 포스팅 ilikezzi.tistory.com 04. 콜백 함수 콜백 함수란? 콜백 함수는 쉽게 말해 함수 안에 함수다. 즉, 다른 함수의 인자로 전달되는 함수이다. 비동기 작업이 끝..

[Javascript] this_코어 자바스크립트 [내부링크]

오늘은 3단원인 "this" 를 포스팅 할 것이다. 지난번 포스팅한 "실행 컨텍스트" 도 읽어보면 도움이 될 듯하다. https://ilikezzi.tistory.com/55 [Javascript] 실행 컨텍스트_코어 자바스크립트 저번에 포스팅한 "데이터 타입" 에 이어서 다음 챕터인 "실행 컨텍스트"를 포스팅 할 것이다. https://ilikezzi.tistory.com/52 [Javascript] 데이터 타입_코어 자바스크립트 계획했던대로 자격증 취득도 다 ilikezzi.tistory.com this.... '이것' 이라는 단어 그 자체로의 뜻을 가지지만, 가끔씩 어디를 가르키는건지 헷갈렸는데 이제 그 헷갈리던 this에 대해서 제대로 잡아보자. 03. this 전역 공간에서의 this 브라우저 ..

[Javascript] console.dir()로 객체의 모든 depth 구조 출력 [내부링크]

오늘 할 내용은 코드로 바로 확인 해보자. 단순히 axios로 불러온 데이터를 파싱해서 쓰려고 했는데, 모든 depth의 데이터가 나오지 않았다. 예전에도 이런적이 한 번 있었는데 이번에 또 같은 케이스여서 포스팅을 해본다. 이렇게 사진처럼 comments: [Array] 라고 나오는데 나는 그 값을 필요로해서 보고싶었다. 자바스크립트에서 객체를 콘솔에 출력하면, 기본적으로 일부 깊이까지만 출력되고, 그 이상의 깊이는 [Array]나 [Object] 형태로 간략하게 표시되는 경우가 있다. 이때 console.dir() 을 쓰면 해결 가능하다. 자주 사용하는 console.log()와 console.dir()를 비교해 보면서 뭔지 알아보자. console.log()와 console.dir() - conso..

[Javascript] new Set() 배열에서 쉽게 중복값 제거하기 [내부링크]

오늘은 배열에서 중복값을 제거하는 방법에 대해서 포스팅을 해보려한다. 위 코드는 간략하게 얘기하면 투표항목을 클릭하면 하위depth의 투표 항목까지 전부 불러오는 코드중 일부분이다. 아무튼 하위항목들을 찾아서 기존dto에 push하다가 console.log 창을보니 중복된 값도 같이 쌓이고 있었다. 하위 항목 찾을 때 기존항목 if문으로 비교 후 제거하거나, 정 안되면 for문으로 돌려서 비교후 제외시켜도 되지만 Array에서 바로 처리하는 방법이 있나 궁금해서 찾아보다가 "new Set()" 이라는 방법을 찾게 되었다. new Set() - Set 객체는 자바스크립트에서 유일한 값의 집합을 표현할 수 있다. - 배열의 중복 값을 제거하려면 Set을 이용하면 정말 쉽게 할 수 있다. 사용 방법은 다음과 ..

[Javascript] 실행 컨텍스트_코어 자바스크립트 [내부링크]

저번에 포스팅한 "데이터 타입" 에 이어서 다음 챕터인 "실행 컨텍스트"를 포스팅 할 것이다. https://ilikezzi.tistory.com/52 [Javascript] 데이터 타입_코어 자바스크립트 계획했던대로 자격증 취득도 다 해서, 8월부터는 알고리즘과 팀프로젝트에 전념할 계획이였다. 하지만 알고리즘 스터디를 하기전에 JS 기본기를 탄탄하게 다져두고 하는게 깊은 이해에 도움이 ilikezzi.tistory.com 위에 있는 저번 포스팅과 크게 이어지는 내용은 아니지만, 그래도 "데이터 타입"에 대한 기본적인 이해가 있어야 이번 포스팅을 쉽게 이해할 수 있을듯 싶다. 02. 실행 컨텍스트 실행 컨텍스트란? - 실행 컨텍스트(Execution Context) 실행할 코드에 제공할 환경 정보들을 ..

[AWS] CloudFront + ACM을 이용한 https 리다이렉팅 (Route53,S3) [내부링크]

직전에 Route53 + S3로 정적 웹 호스팅하는 방법에 대해 포스팅을 했었다. https://ilikezzi.tistory.com/53 [AWS] Route53 도메인 구매 및 S3 웹 호스팅 얼마전에 해커톤 멘토링을 다녀와서 서버설계와 DB설계쪽에 부족함을 느껴서 주변에 프론트엔드 1명, AI 1명, 디자이너 1명을 섭외해서 팀프로젝트를 하기로했다. 주제선정과 기능선정이 끝나서 ilikezzi.tistory.com 해당 포스팅과 이어지는 내용이니 먼저 보고와서, 이 포스팅을 봐주면 좋을 것 같다. 이전에 Route53 + S3 를 이용해서 정적 웹 호스팅을 해서 http 까지 완료했다. 이번에는 CloudFront + ACM 을 이용해서 https로 리다이렉팅 해보려고 한다. 우선 왜 이 두가지 서..

[AWS] Route53 도메인 구매 및 S3 웹 호스팅 [내부링크]

얼마전에 해커톤 멘토링을 다녀와서 서버설계와 DB설계쪽에 부족함을 느껴서 주변에 프론트엔드 1명, AI 1명, 디자이너 1명을 섭외해서 팀프로젝트를 하기로했다. 주제선정과 기능선정이 끝나서 이제 각자 맡은일을 해야하는데 나는 기획, 서버, DB, 백엔드 파트를 혼자서 전부 하기로했다. 모바일 웹/앱 서비스로 진행하기로 해서 우선 프로젝트 도메인이 필요했다. 찾아보니 시중에 도메인 판매하는 사이트도 많았지만, 회사 테크니컬 리더님께서 역량 향상 명목으로 회사 AWS계정을 사용하라고 하셨다! 그래서 한치의 고민도 없이 AWS로 접속했다. Route 53 서비스를 검색 후 들어가서 등록된 도메인으로 들어가서, "도메인 등록"을 누르자. 그리고 사용하고 싶은 도메인주소를 검색하면 .com , .io , .net..

[Javascript] 데이터 타입_코어 자바스크립트 [내부링크]

계획했던대로 자격증 취득도 다 해서, 8월부터는 알고리즘과 팀프로젝트에 전념할 계획이였다. 하지만 알고리즘 스터디를 하기전에 JS 기본기를 탄탄하게 다져두고 하는게 깊은 이해에 도움이 될 것 같았다. 때마침 회사 프런트 엔드 직원분들이 "모던 자바스크립트 Deep Dive" 와 "코어 자바스크립트" 두 책을 강추해주셨다. 그동안 나는 인강이 좀 더 잘 맞는다고 생각했어서, 우선 끝까지 읽기에 상대적으로 얇은 책으로 선택했다. 처음엔 가볍게 "혼동되는 개념만 잡고 빨리 알고리즘으로 넘어가야지. " 라는 생각뿐이였는데 1, 2 단원을 읽고 생각이 바뀌었다. 남들이 이해한 내용을 듣기만 하는게 아닌, 책을 보면서 곰곰히 고민하고 이해하는것도 잘 정리가 되었다. 그래서 단원별로 포스팅하면서 한번 더 머리속에 정..

[해커톤] 인하대 해커톤 멘토 참여후기 [내부링크]

오늘은 인하대학교에서 진행한 INHA SW NET-Zero 공동해커톤에 멘토로 참여한 후기를 포스팅 해보려한다. 나는 컴공 전공자임에도 불구하고 대학시절에 해커톤 참가를 한번도 안해봐서, 밤새면서 개발의 열정을 불태우는 분위기가 너무나 궁금했는데 이번에 우연히 기회가 생겼다. 얼마전 contect하게 된 AWS 직원분께서 해커톤 멘토로 참여 제의를 하셨다. 제의를 받고 처음엔 "내가 누군가한테 조언을 줄 수 있는 입장인가?" 라는 생각 때문에 잠시 망설였지만, 주니어 개발자로 1년간 경력을 쌓아오면서 문제를 해결했던 경험이나 다양한 트러블 슈팅 지식들이 어쩌면 밤새며 빠르게 개발을 해야하는 그들에게 도움을 줄 수 있겠다. 라는 생각이 들었다. 그래서 나는 AWS DevOps 및 Backend 개발자로 멘..

[AWS] 국내 1호 AWS 굿즈 개봉기! (+ 개발진스) [내부링크]

오늘은 처음으로 개발 내용 외에 포스팅을 해보려한다. 얼마전에 SAA-C03 합격후기, 합격요약 포스팅을 올렸었는데, 혹시나 필요한 사람이 있지않을까 해서 카카오톡에 AWS Study하는 오픈채팅방이 있어서 포스팅 내용을 공유했었다. 예상외로 반응이 핫해서 고맙다는 피드백을 많이 받고 블로그 유입도 500명이 넘었다! 그러고 몇일이 지나서 아래 사진처럼 나를 찾았다. ......! 따로 갠톡을 해보니 AWS 직원분이셨고 AWS 관련 자격증 준비하는 대학생들에게 공유를 해도 될지 여쭤보셨다. 한명이라도 누군가한테 도움이 되고 싶었는데 이렇게 까지 해주시니 너무 감사한 마음뿐이였다. 보내 주신다는 굿즈도 아직 국내에 제공된 적 없는 첫 굿즈였다!! 시간이 지나 사무실로 굿즈가 도착했다!!! 구성이 너무 알차..

[Nest.JS] Slack에 다양한 통계데이터 알림 자동화 [내부링크]

회사에서 협업툴로 Slack을 사용하고 있는데, 각종 통계자료 몇 로그데이터를 매일 알림으로 보내주면 좋을 것 같았다. 그래서 무슨데이터를 전송해주면 좋을지 고민하다가 1.전체 유저수 / 2.가입자수 / 3.기사 조회수 / 4.언론사별 기사 발행수 / 5.댓글수 / 6.DAU / 7.WAU 해당 7가지 데이터를 보여주기로 결정했다. Slack bot을 통한 axios와 schedule를 사용해서 자동화를 시켜줄 것이다. 우선 Slack bot을 만들자. https://api.slack.com/apps/ 해당 URL에 접속하여 슬랙봇을 생성을 하고, https://api.slack.com/methods 다음 URL에서 슬랙봇의 chat.postMessage 권한을 추가해 주도록 하자. 그 후 Install..

[AWS] SAA-C03 합격후기, 핵심요약 정리 (AWS Certified Solutions Architect - Associate) [내부링크]

무려 한 달 만에 포스팅이다... 때는 3달전 AWS에 수많은 서비스 중에서 EC2, S3, Lambda 같은 기본적인 서비스 밖에 다룰 줄 몰랐었다. 하지만 점점 개발경력이 쌓여가면서 설계 쪽도 조금씩 맡아서 하게 되고, 점차 보안 쪽도 고민을 하게 되었다. 그래서 막연히 AWS공부를 하기보다, 이참에 자격증취득을 목표로 삼고 스터디를 하면 좋을 것 같았다. 자격증 종류에 대해 알아보다가 AWS Certified Solutions Architect - Associate SAA-C03로 정했다! https://www.udemy.com/course/best-aws-certified-solutions-architect-associate/ SAA강의 중에서 꽤나 유명한 Udemy강의로 선택했다. 할인받아서 1..

[Mysql] max_connection_errors 해결 [내부링크]

오늘은 협업 업체에서 사내 DB에 연결 시에 max_connect_errors 관련 에러가 뜬다고 해서, 관련내용을 포스팅해보려고 한다. 참고로 나는 블랭 아니고 블랑이다... 맥주 블랑을 좋아해서 입사할 때 영어이름을 Blanc으로 정했는데 그 뒤로 블랑 쳐다도안본다...^^ 아무튼 이처럼 DB접속이 불가능 하고, max_connection_errors 수치 변경을 요청하셨다. 아마도 이런 에러가 나왔을 것이다. ERROR 1129(00000): Host '*' is blocked because of many connection errors. Unblock with 'mysqladmin flush-hosts 이제 max_connection_errors 가 뭔지 알아보자. max_connection_..

[Typescript] Eslint로 저장 시 사용하지 않는 import 제거 [내부링크]

바쁘게 개발을 하다보니 코드상에 사용하지 않는 import들이 너무나 쌓여버렸다... 사진 속 코드처럼 사용하지 않는 import들이 있다. 일일히 지우기엔 너무 양이 많고 앞으로도 쌓일 가능성이 있어서 Eslint로 저장 시에 지워지게 할 것이다. eslint 설치부터해서 적용법까지 해보자. npm i eslint --save-dev 해당 명령어로 eslint를 설치한다. npm install eslint-plugin-unused-imports --save-dev 그리고 import제거하는 플러그인을 설치한다. { "plugins": ["unused-imports"] } { "rules": { "@typescript-eslint/no-unused-vars": "off", "unused-imports/n..

[Nest.JS] TypeOrm에서 페이지네이션 구현 (last_id, size) [내부링크]

오늘은 백엔드 개발에 있어서 필수적이라 생각하는 페이지네이션에 대해서 포스팅을 해보려고 한다. 우선 페이지네이션에 대해서 간략하게 설명하자면, 흔히 페이지수(쪽수)를 매기로 정렬할 떄 쓰이는 개념으로써 웹에서 자주 다루게 된다. 나도 마찬가지도 이번 프로젝트 개발을 하면서 페이지네이션을 상당히 많이 사용하였다. 댓글 목록 투표 목록 팔로잉 목록 차단 목록 북마크 목록 선물함 목록 포인트 내역 목록 이벤트 목록 내가 본 뉴스 목록 알림 목록 등등.. 이 처럼 거의 대부분에 목록(@GET) 에서는 페이지네이션을 사용하였다. 우선 알림쪽을 사진으로 간략하게 보자. 해당 사진은 알림 목록 쪽 사진인데, 아래로 스크롤하면서 10개씩 끊어서 로딩해서 보여주게끔 해준다. 즉, 한번에 많은 양을 로딩해서 보여주는것이 ..

[Mysql] 여러행의 데이터를 한 행의 데이터로 합치기 "GROUP_CONCAT" [내부링크]

오늘은 Mysql에서 여러행의 데이터를 한 행의 데이터로 합치는 쿼리에 대해서 알아보자. 우선 각각의 테이블에 대해서 대략적으로 살펴보자. 위 두 테이블은 간단하게 설명하자면, blanc_story_log 테이블은 뉴스의 정보가 담긴다고 보면 되고, ( "action" 컬럼에 "view" or "create" 존재) blanc_keyword_news 테이블은 해당뉴스의 키워드가 담긴다. (같은 뉴스에 키워드 최대 5개) 이런구조에서 두 테이블을 조인해서 뉴스가 생성 되었을때, 뉴스의 키워드 정보를 한 개의 uuid로우에 여러 키워드를 담고 싶었다. 우선 정답을 보고 쿼리를 하나씩 파헤쳐 보자. SELECT t1.uuid AS id_post, t1.user_uuid AS id_usr, t1.news_uui..

[Nest.JS] DTO vs Interface [내부링크]

벌써 일주일이나 포스팅을 하지 못했다. 개발중인 서비스 런칭일이 한달도 남지않아서 UnitTest랑 QA랑 협업업체 대응 하느라 정신이없다... 한달전에 내가 개발한 코드를 보면 왜 이렇게 짰나 어질어질하다. 그만큼 가파르게 성장하고 있다는 반증인 것 같아서 내심 뿌듯하기도 하다 ^__^ 본론으로 돌아와서 프로젝트를 하면서 자주 사용하지만 그 차이점을 제대로 모르고 사용했던게 있다. 바로 DTO 와 Interface 이다. 두개가 비슷하다고 생각해서 이 케이스에서는 둘중에 뭘 쓰는게 맞는거지? 하고 고민했던적이 많았다. 오늘 두개의 비슷한 점과 명확히 다른점에 대해 알아보고 제대로 이해를 해 볼 것이다. DTO란? 말그대로 Data Transfer Object, 계층간 데이터 교환을 위해 사용하는 객체..

[Nest.JS] Axios, Http 비동기 통신 라이브러리 [내부링크]

요새 외부업체들과 협업이 잦아지면서 API를 연동 시키기 위해 Axios를 많이 사용하고 있다. 그래서 이 참에 Axios에 대해서 제대로 알고 사용할 겸 포스팅을 해보려고 한다. 우선, Axios란 ? Http클라이언트 라이브러리로서, 웹 애플리케이션에서 웹 API와 통신하는 데 사용되며, 웹 브라우저와 Node.js 환경 모두에서 사용할 수 있다. 1. Promise 기반 Axios는 Promise 기반으로 작성되어 있어서, 콜백 대신 .then()과 .catch() 또는 async/await를 사용하여 비동기 작업을 처리할 수 있다 . 이를 통해 비동기 작업을 처리 시, 코드의 가독성과 유지 관리성이 향상된다. 2. HTTP 메서드 지원 Axios는 다양한 HTTP 메서드 (GET, POST, PU..

[Javascript] null 병합연산자 "??" [내부링크]

오늘은 병합연산자 "??" 에 대해서 포스팅 해보려고 한다. ?? 예시를 보면 바로 이해가 갈 것이다. A ?? B A가 null 또는 undefined이면 B 그게 아니라면 A 이게 전부다. 이걸 언제쓰면 유용한지 알아보자. dto.last_id가 null이거나 undefined일때 0으로 변환해서 이후 0과 대소 비교를 하는 코드다. 이처럼 숫자 0을 구분 지어 다뤄야 할때 아주 유용하다. 또 이런 dto.parent_uuid에 대한 이런 구구절절 말도안되는 코드도 dto.parent_sort_depth = dto.parent_uuid ?? 0 이렇게 한줄로 끝내버릴수 있다. 이처럼 0 외에도 기본값을 할당하는 좋은 용도로 사용할 수 있다.

[Nest.JS] DTO 객체의 키 이름 변경 @Transform [내부링크]

오늘은 DTO 객체의 키 이름을 @Transform 데코레이터를 사용하여 바꾸는 방법에 대해 포스팅을 할 것이다. 음,, 이렇게만 얘기해서는 무슨소린지 헷갈리니 바로 예제 코드로 보자. findBookmark=[ { target_uuid: 123, name: Blanc, ... }, { target_uuid: 234, name: Jack, ... }, { target_uuid: 345, name: Scott, ... } ] ///////////////////////////// BookmarkReadDto={ @Expose() @ApiProperty() uuid: string; @Expose() @ApiProperty( name: string; ... } 변수 findBookmark : [] 와 Bookm..

[AWS] AWS 사용량 예산 초과 시 이메일로 알림 받기 [내부링크]

오늘은 AWS 예산 초과 시 이메일로 알림받는 법에 대해 포스팅을 할 것이다. AWS 클라우드 서비스를 사용하다보면 예상치 못한 사용량 급증이나, 혹시 모를 엑세스키 해킹을 통한 요금 폭탄을 맞을 수 있으므로 필수적으로 해주는게 좋다. 우선 루트 계정 외에 IAM 관리자계정으로 하려면, 루트계정에서 권한을 변경을 해줘야한다. 루트계정으로 로그인해서 My account에서 내려보면 결제 정보에 대한 IAM 사용자 및 역할 액세스가 있을 것이다. 이부분에서 IAM 액세스 활성화 버튼을 눌러서 업데이트를 해주면, 관리자인 IAM 사용자가 청구데이터에 접근할수 있게 된다. 이제 권한을 설정을 변경하였으니 관리자인 IAM사용자나, ROOT계정 모두 진행할 수 있다. 이제 Budgets으로 이동해보자. 예산 생성으..

[Javascript] split() 지정 구분기호로 문자열을 배열로 분할 [내부링크]

오늘은 문자열을 원하는 지정구분 기호로 배열로 분할하는 법에 대해서 알아보자. 케이스는 이러하다. 관련 DB에 sort_depth라는 컬럼이 존재하는데 해당 값들은 string으로 이루어져 있다. 나는 사진에 아랫쪽에 있는 "118,121,122,123" 의 크기(길이?)를 구해 4라는 값을 얻고 싶었다. 그럼 우선 배열로 변환한 다음, length()를 사용하여 크기를 구할 계획이다. 여기서 배열로 변환할때 " , " 이 콤마 단위로 구분을 해서 넣어 줘야되는데 이때 split()를 사용하면 간단하다. split()이란? 지정된 구분 기호에 따라 문자열을 하위 문자열 배열로 분할할 수 있는 내장 JavaScript 문자열 메서드이다. 사용법은 간단하다. const str = "118,121,122,12..

[NestJS] DB커넥션을 최소화하고 Service부에 부하를 줘야하는 이유. [내부링크]

오늘은 별건 아니고, 배포중인 어플에서 뉴스 댓글 목록을 불러올때 2~3초 가량 소요되서 이 코드를 리팩토링 하였다. 리팩토링은 왜 할까 ? 1. 성능향상, 가독성 향상 2. 유사한 내용이 반복될때 코드의 중복 제거 3. 새로운 기능을 추가할 때 위 세가지 이유가 제일 핵심적인 이유다. 기존 코드를 Swagger에서 돌려 보았을때 두 눈을 의심했다. 이게 목록 불러오는 @Get API를 단 한번 실행 시킨것이다.... 물론 Response값으로 다양한 값이 필요하긴 하지만 이건 말이 안된다. 이러니 목록 불러올때 2~3초 가량 로딩시간이 걸렸던 것이다. 실행된 사진 속 쿼리문을 보니 중복된 테이블에서 SELECT가 여러번 이루어 지는걸로 보아 for문을 돌면서 그 안에서 DB커넥션이 여러번 이뤄지고 있는..

[Javascript] "some()" 배열의 객체에 원하는 값이 있으면 True 반환 [내부링크]

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] IAM 계정 생성 시 E-mail로 알림 받기 [내부링크]

최근에 주변에서 AWS 엑세스키가 털려 원인불명 고사양 인스턴스가 생기면서 몇 천만원 가량의 비용이 발생됬다. 램이랑 CPU를 말도안되게 잡아먹고 있었던걸 보면 아마 채굴을 했지 싶다.. 나도 혹시 모를 상황에 미리 대비를 해야겠다고 생각했다. 그래도 우선 "IAM 계정 생성 시 내 이메일로 알림이 오게 설정"을 할 것이다. 꽤나 서칭을 했는데 관련 절차서가 제대로 된게 하나도 안나오더라. 그래서 이번에 나라도 제대로 포스팅 해야겠다. 우선 IAM 관련 설정이기 때문에, 모든 작업은 버지니아 북부 리전에서 진행되야 한다. 먼저 EventBridge가 처리할 이벤트를 포함하여 IAM 이벤트를 캡처하도록 CloudTrail을 생성해보자. 추적생성으로 들어간다. 이름을 정하고 스토리지 위치는 S3버킷 생성으로..

[TypeOrm] TypeORM으로 upsert(), save() 안될 시 해결방법 [내부링크]

이전에 Nest.JS로 개발하다가 중복된 값이 있으면 Update 해주고 아닐경우 Insert를 해야되는 케이스가 있었는데 Upsert나 save를 사용하지 않고 로직으로 find해서 If-Else문으로 Update, Insert를 날려서 처리한적이 있었다. Upsert나 Save로 처리했으면 코드가 좀 더 간결해지고 DB커넥션도 줄여서 성능향상도 됬을텐데,,,하고 아쉬워하던 찰나에 비슷한 케이스로 개발을 할 일이 생겼다! 뉴스의 기사에 좋아요, 싫어요 리액션 기능을 추가하는 케이스이였다. 이번엔 무조건 로직으로 처리하지 않고 Upsert나 Save로 처리해야겠다고 생각했다. 그럼 우선 Upsert랑 Save에 주요 차이점 대해 알아보면 Upsert는 데이터베이스에서 레코드를 업데이트하거나 삽입하는 데 ..

[MongoDB] MongoDB에서 Join 사용하기 "$lookup" [내부링크]

회사에서 뉴스관련 DB를 대용량 데이터베이스 처리에 적합한 Nosql중에 MongoDB를 사용하고 있다. 그래서 요새는 일과후나 주말에 MongoDB 공부에 전념하고 있다. MongoDB 서적은 역시 국룰인 오라일리의 "몽고 DB 완벽가이드" 로 시작을 하였다. 역시 국룰인데는 이유가 있다. 강추..!! 아직은 서적 1회독에 인강 좀 끄적인 상태라서 몽고DB가 뭔지 대략적으로만 아는 상태인데 이거...공부를 할수록 매력있는것 같다. 개인적으로 Mysql보다 깊게 파보고 싶어졌다. 서론이 길었지만... 무튼 본론으로 돌아와서 MongoDB에서 Join을 사용해야만 하는 상황이 생겼다. MongoDB와 같은 NoSql 데이터 베이스는 기존 관계형 데이터베이스와 다른 데이터 모델을 사용하기 때문에 조인에 대한..

[Mysql] 컬럼안에 JSON 데이터 추출하는 방법 "JSON_EXTRACT" [내부링크]

오늘은 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..

[Error] req.param / req.query / req.body 이리저리 헤매기 [내부링크]

저번주에 내내 머리를 쥐어뜯는 일이 있었다.. 그래서 해당 문제에 대해서 뭐가 잘못됬으며 어떻게 해결했는지 정리하고, 관련된 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에..

[Git] commit할 때 hooks으로 console.log() 삭제, Error [내부링크]

팀원들과 협업을 하면서 가끔 console.log()를 제거하지 못한 채 commit을 한적이 있었다. 이는 별거 아닌거 같아보여도 운영서버 AWS에 올라갔을때 악영향을 끼친다. 코드에 민감한정보(암호, Api키, 사용자 데이터)를 기록하면 서버로그에 엑세스할 수 있는 모든 사람에게 노출이 될 수 있고, 시스템 리소스를 소비하고 처리시간을 차지하여 애플리케이션 전체 성능에 영향을 끼칠수 있고, 로그가 빠르게 복잡해 져서 관련 정보를 수정 삭제하기 어려워져서 디버깅이 어려워지고, 제일 중요한, AWS는 저장 및 처리된 데이터 양에 대해 요금을 부과하므로 비용이 증가할 수 있다. 이제 console.log() 제거에 필요성을 느낄 것이다. eslint로 단순하게 "no-console" 에서 에러 처리를 해버..

[Typescript] class-transformer 끝장내기 [내부링크]

오늘은 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() 두 배열에서 일치하는값 찾기 [내부링크]

오늘은 Javascript에서 자주쓰이는 find()와 filter() 사용법에 대해 알아보고 응용해서 두 배열에서 서로 일치하는 Value 값 찾기를 할 것이다. 해당 코드를 통해서 find()를 먼저 알아보자. 변수 "findMeComment"는 "meCommentList"라는 배열의 객체의 uuid의 value과 controller에서 넘겨준 Param(uuid)와 일치하는 객체를 뽑는 역할을 한다. meCommentList = [ {uuid:123123}, {uuid:234234}, {uuid:333333}, ... ] find()메소드는 변수에 저장된 객체 배열을 검색하는 역할을 하고있다. 해당코드에서 find()메소드는 콜백함수를 인수로 사용하며, 이 함수는 값을 반환할때까지 배열의 각 요소에..

[Nest.JS] @Param() 사용 시 왜 경로를 지정해 주는걸까? [내부링크]

NestJS에서 오늘 개발을 하다가 너무나 허무한 실수를 해버렸다. 이참에 그간 당연시 사용하고 있었던 부분에 대해서 왜 그렇게 사용을 해야만 하는지에 대해서 포스팅 해보려한다. 해당코드를 보면 Controller에서 @Param('uuid')과 @Body() 로 파라미터를 service부 한테 넘겨주고 있는 코드다. 이상이 없다고 생각해서 계속 돌려봤는데 값이 안나오고 오류도 안뜨고 해서 뭐지 싶었다..(?) 그래서 어디서 잘못됬나 확인해보려 console.log()를 하나씩 찍어가면서 확인해봤는데 어라.. console.log(uuid)의 결과가 undefined로 나왔다. 보자마자 급하게 개발하느라 뭔가 빠뜨렸구나 싶었다. 그래서 차근차근 봤더니 @Param을 사용하고 경로에다가 추가를 안해버렸던 ..

[Nest.JS] @Query() 파라미터 값 Boolean으로 사용하는 방법 [내부링크]

이 문제를 해결하려 최근들어 가장 머리를 쥐어뜯었던 것 같다. 이틀가량 문제해결과 포스팅준비에 시간을 쏟았다는 Tmi... 우선 어떤 상황인지부터 알아보자. 쿼리스트링으로 구독여부를 Boolean타입으로해서 해당 DTO를 파라미터로 넘겨줘야 하는 상황이었다. 처음에 보고 금방 개발할 수 있겠다 싶었는데 Boolean타입이 이상하게 찍히기 시작했다. 분명 사진처럼 Boolean으로 타입 지정해줬는데 혹시나해서 typeof 로 console을 한번 찍어보기로 했다. 어라.. dto타입이 string으로 나오는걸 확인했다. query string은 항상 string 타입으로 요청이 들어오기 때문에 transform을 통해 타입 변환을 해줘야 했다. ValidationPipe설정을 바꿔줘야지 데이터 타입이 변환..

[Nest.JS] Error "require statement not part of import statement." 해결 방법 [내부링크]

오늘은 axios를 사용해서 개발하고 있었는데 갑자기 에러가 떠버렸다. 해당에러를 보면 "require statement not part of import statement." Eslint 에러라고 나온다. 이전에 Eslint를 까다롭게 걸어두긴 했는데 지금은 급하게 개발을 해야되는 상황이여서 일단은 Eslint에서 해당 require를 비활성화 시키는법에 대해 포스팅 해보려고 한다. eslintrc.js 파일에서 해당코드를 추가시켜준다. module.exports = { ... rules: { ... '@typescript-eslint/no-var-requires': 0, } } 이제 돌려보면 관련 Eslint에러가 사라진것을 볼수있을 것이다.

[Javascript] 객체(object) 속성이나 문자열의 개수 구하는법 [내부링크]

오늘은 객체의 속성이나 문자열의 개수 구하는 법에 대해 포스팅 하려고 한다. ".length" 는 배열에서 밖에 사용을 못해서 객체나 문자열에서는 사용하지 못한다. dto.parent_sort_depth 를 콘솔찍어보면 3,4,5,6,7 이라는 문자열로 나온다. 이 문자열의 길이를 구하려면 어떻게 해야할까? Object.keys().length; // 괄호안에 dto.parent_sort_depth 를 넣어준다. Object.keys(obj).length를 하게 되면, 해당 문자열의 길이, 크기를 리턴받을 수 있다. 따라서 Object.keys(dto.parent_sort_depth).length를 해보면 5가 리턴 된다. 문자열 뿐만 아니라 객체(Object)에도 똑같이 사용할 수 있다. blanc이라..

[Nest.JS] Promise { <pending> } 해결 방법 [내부링크]

NestJS로 개발을 하다가 값이 안나오고 Promise { }이 나와서 포스팅 해보려 한다. 정말 단순한 문제고 비동기함수 - Promise, async/await에 대해서만 이해를 하고있어도 간단히 해결 할 수 있다. 비동기 함수에 대해서는 다음에 제대로 정리해서 포스팅을 하겠다. 우선 어쩌다가 이런 상황이 발생했는지 보자. 간단한 내용말고는 service부에서 로직을 짜야하는데 포스팅을 위해 급하게 짠거니 감안하고 봐주시길. 꾸벅.. 자, 해당코드를 돌렸더니 Promise { } 오류가 발생했다. "const vote_ data =" 부분을 보면 서비스 부에서 값을 받아오는데 앞에서 async로 비동기를 선언했기 때문에 반드시 Promise로 반환한다. Promise는 3가지 상태가 있는데 pend..

[Nest.JS] 순환종속성(Circular Dependency) 해결 "Use forwardRef() to avoid it." [내부링크]

오늘은 순환 종속성(Circular Dependency)에 대해 알아보자. NestJS로 프로젝트를 구현하다가 VoteController에서 CommentService를 사용하고 CommentService에서 VoteRepository를 사용해야 되는 케이스가 생겼다. 저번에는 단방향인(?) 공유 모듈을 사용했었는데 이번에는 양쪽 모듈에서 다 필요로하는 쌍방향(?) 모듈이다. https://ilikezzi.tistory.com/20 [Nest.JS] @Module의 특징과 공유모듈(shared module) 사용하기 공유모듈을 사용하다가 에러가 떠서 @Module에 대해서 스터디하고 해결까지 완료한 내용을 포스팅 해보려고 한다. 우선 @Module을 먼저 알아보자. Module 이란 무엇인가? 각 애플리..

[AWS] EC2 보안그룹(Security Group)에 외부 IP 추가 설정 [내부링크]

회사에서 개발중인 프로젝트를 퇴근 후 집에서 마저 하려했더니 다음과 같은 에러가 발생했다. ERROR [TypeOrmModule] Unable to connect to the database. Retrying (4)... Error: connect ETIMEDOUT 해당 에러를 확인하면 DB연결이 안됬다는 얘기다. 갑자기 왜 DB연결이 안됬을까? 회사에서 DB를 AWS를 통해서 사용하는데 미리 정해둔 EC2 보안그룹에 우리집 IP가 등록 되지 않아서 뜨는 에러다. 해결방법은 간단하다. 우선 AWS EC2에 접속후 인스턴스(실행중)에 들어가면 지금 실행중인 인스턴스 목록이 나올 것이다. 그중에 관련DB 인스턴스에 들어가서 보안을 누르고 해당 보안그룹 링크로 들어간다. 그럼 인바운드 규칙이 보일텐데 여기서 ..

[Nest.JS] @Module의 특징과 공유모듈(shared module) 사용하기 [내부링크]

공유모듈을 사용하다가 에러가 떠서 @Module에 대해서 스터디하고 해결까지 완료한 내용을 포스팅 해보려고 한다. 우선 @Module을 먼저 알아보자. Module 이란 무엇인가? 각 애플리케이션에는 최소한 하나의 모듈인 루트 모듈이 있습니다 . 루트 모듈은 Nest가 애플리케이션 그래프를 구축하는 데 사용하는 시작점입니다 . Nest가 모듈과 공급자 관계 및 종속성을 해결하는 데 사용하는 내부 데이터 구조입니다. 매우 작은 응용 프로그램은 이론적으로 루트 모듈만 가질 수 있지만 일반적인 경우는 아닙니다. 구성 요소를 구성하는 효과적인 방법으로 모듈을 강력하게 권장 한다는 점을 강조하고 싶습니다 . 따라서 대부분의 애플리케이션에서 결과 아키텍처는 각각 밀접하게 관련된 기능 집합을 캡슐화하는 여러 모듈을 ..

[Javascript] Array map() 함수, 배열에 특정값만 추출해 새로운 배열 만들기 [내부링크]

오늘은 JavaScript map() 함수의 기능중 한개에 대해 간략하게 포스팅 해보려고 한다. 우선 코드를 보자. - service부 일단 코드를 간략하게 설명하면 dto를 파라미터로 받아서 해당 repository에서 검색후 결과가 없을경우 에러처리를 해주는 부분이다. 콘솔찍은 결과도 확인 해보자. 이렇게 배열로 해당 결과값이 나오게 된다. 하지만 나는 이 결과값에서 keyword_uuid만 뽑아서 사용을 해야되는 상황이 생겼다. 이럴때..! map() 함수를 사용하면 된다. - service부 변수를 선언하고 타입은 배열로 지정을 해준다. 앞서 변수로 선언한 keywordFollowList에 .map() 함수를 사용해서 원하는 값을 추출해서 새로운 배열로 만들 수 있다. 나는 keyword_uuid..

[TypeOrm] IN조건으로 배열 검색 "Typeorm find where in array" [내부링크]

그동안 TypeOrm에서 IN조건으로 배열 통채로 검색이 안되는줄알고 service부에서 for문을 돌려서 uuid를 일일히 검색을 했었다. 그랬더니 이처럼 너무나 비효율적으로 SELECT쿼리 커넥션이 여러번 이뤄지는걸 볼 수 있다. 이러면 당연히 성능에도 영향을 끼친다. 그래서 서칭을 하다가 TypeOrm으로 한번에 배열로 검색을 할수있다는걸 알게 되었다. 이런...! - repository부 여러개 검색하려는 uuid를 배열로 where조건에 In을 써서 이처럼 한번에 할 수 있다. 윽 이렇게 쉽게 되는걸 굳이 for문을 돌려가며 했다니,,,, 열심히 하자. 아직 갈길이 멀었다.

[Nest.JS] CurrentUser()보다 편리한 커스텀 데코레이터 [내부링크]

오늘은 NestJS에서 데코레이터중 하나를 포스팅 해보려고 한다. Api개발을 할때 Controller에서 User정보를 토큰 값으로 받아서 개발을 할때 @CurrentUser 라는 데코레이터를 많이들 사용할 것이다. - controller부 이처럼 @CurrentUser() user 를 사용하게 되면 "user" 에 토큰으로받은 유저정보가 담기게 될것이다. console.log(user)를 해보면 user정보가 잘 넘어온다는 것을 확인해 볼 수 있을 것이다. 하지만 이럴경우 Service부로 넘어가는 파라미터가 두개가 되고 user관련 데이터 정제를 하게될 시 코드가 길어진다는 단점이 있다. 그래서 이런단점을 커버해주기 위해서 요새는 @CurrentUser 대신 다른 데코레이터를 사용한다. @UseIn..

[Nest.JS] Error - "Nest can't resolve dependencies of the FollowsService (?). Please make sure that the argument Repository at index [0] is available in the Appmodule" [내부링크]

에러 코드가 상당히 긴편이다,, NestJS에서 api를 개발하고 돌려볼려는데 갑자기 에러가 나왔다. "Nest can't resolve dependencies of the FollowsService (?). Please make sure that the argument Repository at index [0] is available in the Appmodule" 에러로그를 보면 index[0] 위치의 Repository가 Module에서 사용가능한지 확인을 요구하고 있다. 여기서 Index[0]이란? Service 클래스의 생성자에 주입한 첫번째 인자를 뜻한다. @Injectable() export class FollowsService { constructor( private readonly fol..

[MongoDB] Mac에서 MongoDB 완전히 삭제하는 법 [내부링크]

오라일리의 "mongoDB 완벽가이드" 서적으로 저번주부터 MongoDB 스터디를 시작했다. 쉘에서 간단한 기능과 문법들을 실습하면서 스터디하기 좋다. 그래서 homebrew에서 mongoDB 설치해서 실습을 진행했다. 몽고 실행 brew services start [email protected] 몽고 중지 brew services stop [email protected] 몽고 실행 확인 brew services ( Mac os Background Process ) 몽고 쉘 실행 mongo / mongosh 간단하게 설치후 쉘까지 진입하는 명령어이다. 하지만..! 버전문제랑 이것저것 에러들이 꼬이면서 6시간 가량 구글링하면서 끙끙댔다. 일단 전부 제거 후 재설치하는 방향으로 진행하려는데 이..

[Mysql] Error - Invalid use of NULL value [내부링크]

Mysql에서 테이블 디자인을 변경하다가 생각 오류에 대해서 포스팅 해보려고 한다. 프로젝트를 하다가 컬럼에 NOT NULL 조건을 줘야되는 상황이여서 DB에서 테이블 디자인에서 NOT NULL 조건에 체크를 저장을 해주니 사진과 같은 에러가 발생했다. 해당 에러는 아주 단순한 문제이다. 조건을 변경하려는 컬럼을 이전에 NOT NULL 조건 없이 사용해서 해당 데이터에 NULL 값이 남아있어서 그렇다. NULL 인 값을 UPDATE문으로 전부 NULL이 아니게 바꿔주면 끝나는 문제다.

[Nest.JS] IoC , DI란? 그리고 NestJS의 꽃 Provider [내부링크]

미루고 미루다가 오늘 드디어 NestJS의 꽃인 Provider와 필수로 알고 가야되는 Ioc, DI에 대해 포스팅 해보려고한다. 처음 공식문서를 접했을 때엔 이게 무슨소린가 싶었지만 너무나 중요한개념이라서 관련문서를 끊임없이 찾아보았다. 솔직히 개념적으로 모르더라도 NestJS로 개발하는데 큰 어려움은 없지만 제대로 알고 개발을 하고 싶었다. Provider 우선 Provider를 사전적 의미로 보면 제공자이다. 뭘 제공하느냐? 의존성을 주입할 수 있다는 말이다. 의존성을 주입할 수 있다는 의미는 object가 다른 object와 다양한 관계를 만들 수 있고, 객체의 인스턴스를 연결해주는 기능은 Nest 런타임 시스템에 위임될 수 있다. 그리고 대부분 NestJS의 클래스는 service, repos..

[TypeOrm] timezone: 'z' charset UTC시간 설정 [내부링크]

TypeOrm으로 개발을 하다보면 꼭 정해줘야하는 "timezone"에 대해서 알아보자. 우선 UTC시간과 KST에 대해 알고있어야한다. UTC시간은 협정세계시 , UTC +- 00:00 KST시간은 한국시간 , UTC +09:00 개발을 할때 같은 시간인데 DB에 UTC, KST 시간이 섞여서 나올때도 있다. ex) DB에 값은 2023-01-28 00:00:00 이지만 TypeOrm으로 가져왔을땐 2023-01-27 15:00:00로 변경이 되있다. ex) 서버에서 DB의 시간값을 읽는 과정에서 offset이 0인값을 읽어온 후 KST시간 +09:00인 값으로 변환을 해버리는 현상 왜 이런현상이 발생하는걸까? -> TypeOrm이 시스템의 타임존을 따라가기 떄문이다. TypeOrm은 디비와 연결하면서..

[TypeOrm] 차이를 알고쓰자 save() , insert() , update() [내부링크]

오늘은 TypeOrm method인 save(), insert(), update() 에 대해서 알아보려고 한다. 얼핏보기에는 비슷해서 아무거나 써도 될 것 같은데 이게 별거 아닌 것 같아도 성능에도 영향을 끼친다. 우선 typeorm 공식 홈페이지에 나와있는 사진을 보면서 한개씩 알아보자. SAVE() save() 메서드는 값이 없으면 insert 기능을 하여 데이터를 저장하고 값이 존재하면 덮어쓴다. 그러고 저장된값을 select해서 리턴한다. 수정할때 save()는 기존의 데이터를 위에 덮어쓰는 방식이라서 기존데이터가 사라진다. 쉽게말해 document단위로 데이터를 변경한다. ex) 필드가 5개 존재하고 save로 2개의 필드를 수정하려면 5개의 필드는 전부 사라지고 2개의 필드만 저장된다. INS..

[Nest.JS] ParseIntPipe "Validation failed numeric string is expected" Error [내부링크]

NestJS ParseIntPipe 우선 파이프란 Injectable( ) 데코레이터이며 data transformation 과 data validation 을 주 목적으로 사용한다. - data transformation 이란? 입력데이터를 원하는 형식으로 변환하는 것을 말하며 예를 들어 문자열에서 정수로 바꾸는 것을 의미한다. - data Validation 이란? 단어 그대로 데이터 검증이다. 유효성 체크로 입력 데이터를 평가하고 유효한 경우 변경되지 않은 상태로 전달한다. 그렇지 않고 데이터가 올바르지 않을 떈 예외를 발생시킨다. Nest의 pipe는 크게 두 종류가 있는데 직접 만들어 사용하는 파이프를 커스텀 파이프 라고 하고 미리 만들어진 것을 빌트인 파이프 라고 한다. 오늘 볼 ParseIn..

[Nest.JS] class-transform의 plainToInstance를 활용한 Object Mapping [내부링크]

Class-transform을 다루기전에 Model Mapper에 대해서 먼저 대략적으로 알아보자. Model Mapper 이 Model Mapper란 쉽게 말해 object에 필드값을 원하는 모양의 object로 매핑시켜주는 라이브러리다. Typescript에서 Model Mapper는 class-transform이 있다. class-transform중에서 plainToInstance에 대해서 포스팅을 해보려고 한다. 해당 코드는 Nest.js에 service부 이다. plainToInstance 는 무엇이며 excludeExtraneuosValues 는 무엇이고 이걸 왜 쓰는것일까? 하나하나씩 알아보자. 사용이유? 코드를 보면 DB Layer와 View Layer 사이의 역할을 분리하기 위해 Enti..

[Programming] Naming Rull [내부링크]

Why Naming Rull? 명명 규칙 준수를 통한 업무 생산성 효과 일종의 규약을 설정하여 협업의 원활한 업무적 의사소통 가능 업무 단계별 산출물 사이의 일관성 유지 명확한 의미 부여로 산출물 사이의 연관성 및 코드 가독성 증가 @ 대소문자 혼용 기법 1. 클래스나 메소드명은 파스칼 표기법을 따른다. 모든 단어에서 첫 번째 문자가 대문자이며 나머지는 소문자로 표기. public class HelloWorld{ // 클래스명 public void HelloCity(){ // 메소드명 } } 2. 변수, 파라미터 등은 카멜 표기법을 따른다. 최초에 사용된 단어를 제외한 모든 단어의 첫 문자가 대문자이며, 나머지는 소문자로 표기. int totalCost = 0; // 변수명 String fullName ..

[Git] Git Pull Error (stash) [내부링크]

우선 git stash 란? 아직 마무리하지 않은 작업을 스택에 잠시 저장할 수 있도록 하는 명령어이다. 이를 통해 아직 완료하지 않은 일을 commit하지 않고 나중에 다시 꺼내와 마무리할 수 있다. git pull을 했을때 다음과 같은 에러가뜬다면 터미널에 순서대로 입력해보자. 1. git stash 2. git pull 사진처럼 제대로 pull이 되는걸 볼 수 있을것이다. 3. git stash 4. git stash list 5. git stash drop 6. git branch 사진처럼 정상적으로 완료된것을 볼 수 있을것이다.

[Nest.JS] Swagger Error : "TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body." [내부링크]

Nest.js 를 사용하면서 api문서화 도구인 "Swagger"를 사용하는데 여기서 스웨거란? Swagger 는 REST API를 설계, 빌드, 문서화 및 사용하는 데 도움이되는 OpenAPI 사양을 중심으로 구축 된 오픈 소스 도구 세트입니다. - About Swagger Specification 이 스웨거를 사용하다가 "TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body." 라는 오류가 발생해서 포스팅을 해보려고 한다. @Get 방식으로 유저 정보에 대해 불러오려고 했는데 스웨거 관련 코드를 보면 이렇다. @ApiBody({ type: ListUserDto, description:..

[Nest.JS] ERROR [ExceptionsHandler] No metadata for "Entity" was found. [내부링크]

ERROR [ExceptionsHandler] No metadata for "Entity" was found. 이런 오류가 뜰 경우 DB랑 프로젝트에 "Entity"파일이랑 연결이 안된 경우이다. Nest.js랑 DB연결 관련 파일은 app.moduel에 가면된다. app.moduel에 사진과 같은 부분이 있을 것 이다. 여기서 이전에 DB연결이 잘 되어있었다면 다른건 건드릴 필요없이 "entities: " 부분만 수정해주면 된다. [__dirname + '/**/*.entity{.ts,.js}'] "__dirname" 은 현재 실행중인 경로를 불러오고 뒤에 " '/**/*.entity{.ts,.js}' " 부분은 엔티티 파일의 경로를 뜻한다. import{ } 에 엔티티 경로를 보면 이해가 될 것 이다..

[Nest.JS] Node.js 실행중인 서버 확인 및 종료하기 - address already in use [내부링크]

Node.js 실행중인 서버 확인 및 종료하기 - address already in use 터미널 창에서 "address already in use(####)" 라고 Node.js 오류가 뜰 때 losf -i TCP:3000 // 3000 은 예시이고 해당 address already in use[포트번호]에 있는 포트 번호를 써주자 명령어를 입력하게 되면 위 사진처럼 현재 사용중인 포트정보를 보여준다. 여기서 본인이 알고있는 프로젝트면 해당프로젝트 터미널창에서 ctrl+c 를 눌러서 종료시켜주자. 하지만 잘 모르거나 해당 서버의 cmd가 없을경우 종료할 PID를 이렇게 입력하자. kill -9 581 // 581대신의 삭제할 PID를 입력해주자 이러면 삭제 되었을 것 이다. 제대로 삭제되었는지 확인 해..

[ES6+] ES6에서의 순회와 이터러블/이터레이터 프로토콜 [내부링크]

# 이터러블/이터레이터 프로토콜 @이터러블 -이터레이터를 리턴하는 [Symbol.iterator]() 를 가진 값 - 이터러블 프로토콜을 준수한 객체. - 배열, 문자열, Map, Set은 이터러블 객체이다. - 이터러블 객체는 for...of문 뿐만 아니라 스프레드 연산, 구조분해 할당이 가능하다. Array 에 arr[Symbol.iterator] = null 넣으면 콘솔에 "Array는 Symbol.iterator가 아니다" 라고 나옴 @이터러블 프로토콜 - Well-know Symbol(JS가 기본 제공하는 빌트인 심볼 값)인 Symbol.iterator를 프로퍼티 키로 사용한 메소드를 직접 구현하거나 프로토타입 체인을 통해 상속받은 Symbol.iterator 메소드를 호출하면 이터레이터 프로토..

[Programming] ESLint와 Prettier [내부링크]

ESLint 와 Prettier 자바스크립트 개발을 하다 보면 문법 오류나 코드 정리로 인해 시간을 많이 소비한다. ESLint와 Prettier는 이러한 상황을 해결해 주는 도구들이다. ESlint 는 코드 퀄리티 보장, 즉 코드 구현 스타일에 대한 통일성을 강제한다. 코드 포맷터의 역할도 하지만, 주로 코드 에러를 잡아내고 코드 문법을 강제하는 등 코드 품질을 개선에 중점을 두었다. ESLint는 스타일 가이드를 편리하게 적용하기 위해 사용되기도 하는데, 많은 개발자가 사용중인 Airbnb Style Guide, Google Style Guide가 대표적인 예이다. ESLint 사용예시 ex) let foo = text;; 문자열에 따옴표도 없고, 세미콜론도 두개고, 변수에 값이 할당되어도 사용이 안..