오늘은 별건 아니고, 배포중인 어플에서 뉴스 댓글 목록을 불러올때 2~3초 가량 소요되서 이 코드를 리팩토링 하였다. 리팩토링은 왜 할까 ? 1. 성능향상, 가독성 향상 2. 유사한 내용이 반복될때 코드의 중복 제거 3. 새로운 기능을 추가할 때 위 세가지 이유가 제일 핵심적인 이유다. 기존 코드를 Swagger에서 돌려 보았을때 두 눈을 의심했다. 이게 목록 불러오는 @Get API를 단 한번 실행 시킨것이다.... 물론 Response값으로 다양한 값이 필요하긴 하지만 이건 말이 안된다. 이러니 목록 불러올때 2~3초 가량 로딩시간이 걸렸던 것이다. 실행된 사진 속 쿼리문을 보니 중복된 테이블에서 SELECT가 여러번 이루어 지는걸로 보아 for문을 돌면서 그 안에서 DB커넥션이 여러번 이뤄지고 있는..
이전에 Nest.JS로 개발하다가 중복된 값이 있으면 Update 해주고 아닐경우 Insert를 해야되는 케이스가 있었는데 Upsert나 save를 사용하지 않고 로직으로 find해서 If-Else문으로 Update, Insert를 날려서 처리한적이 있었다. Upsert나 Save로 처리했으면 코드가 좀 더 간결해지고 DB커넥션도 줄여서 성능향상도 됬을텐데,,,하고 아쉬워하던 찰나에 비슷한 케이스로 개발을 할 일이 생겼다! 뉴스의 기사에 좋아요, 싫어요 리액션 기능을 추가하는 케이스이였다. 이번엔 무조건 로직으로 처리하지 않고 Upsert나 Save로 처리해야겠다고 생각했다. 그럼 우선 Upsert랑 Save에 주요 차이점 대해 알아보면 Upsert는 데이터베이스에서 레코드를 업데이트하거나 삽입하는 데 ..
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설정을 바꿔줘야지 데이터 타입이 변환..
오늘은 axios를 사용해서 개발하고 있었는데 갑자기 에러가 떠버렸다. 해당에러를 보면 "require statement not part of import statement." Eslint 에러라고 나온다. 이전에 Eslint를 까다롭게 걸어두긴 했는데 지금은 급하게 개발을 해야되는 상황이여서 일단은 Eslint에서 해당 require를 비활성화 시키는법에 대해 포스팅 해보려고 한다. eslintrc.js 파일에서 해당코드를 추가시켜준다. module.exports = { ... rules: { ... '@typescript-eslint/no-var-requires': 0, } } 이제 돌려보면 관련 Eslint에러가 사라진것을 볼수있을 것이다.
NestJS로 개발을 하다가 값이 안나오고 Promise { }이 나와서 포스팅 해보려 한다. 정말 단순한 문제고 비동기함수 - Promise, async/await에 대해서만 이해를 하고있어도 간단히 해결 할 수 있다. 비동기 함수에 대해서는 다음에 제대로 정리해서 포스팅을 하겠다. 우선 어쩌다가 이런 상황이 발생했는지 보자. 간단한 내용말고는 service부에서 로직을 짜야하는데 포스팅을 위해 급하게 짠거니 감안하고 봐주시길. 꾸벅.. 자, 해당코드를 돌렸더니 Promise { } 오류가 발생했다. "const vote_ data =" 부분을 보면 서비스 부에서 값을 받아오는데 앞에서 async로 비동기를 선언했기 때문에 반드시 Promise로 반환한다. Promise는 3가지 상태가 있는데 pend..
오늘은 순환 종속성(Circular Dependency)에 대해 알아보자. NestJS로 프로젝트를 구현하다가 VoteController에서 CommentService를 사용하고 CommentService에서 VoteRepository를 사용해야 되는 케이스가 생겼다. 저번에는 단방향인(?) 공유 모듈을 사용했었는데 이번에는 양쪽 모듈에서 다 필요로하는 쌍방향(?) 모듈이다. https://ilikezzi.tistory.com/20 [Nest.JS] @Module의 특징과 공유모듈(shared module) 사용하기 공유모듈을 사용하다가 에러가 떠서 @Module에 대해서 스터디하고 해결까지 완료한 내용을 포스팅 해보려고 한다. 우선 @Module을 먼저 알아보자. Module 이란 무엇인가? 각 애플리..
공유모듈을 사용하다가 에러가 떠서 @Module에 대해서 스터디하고 해결까지 완료한 내용을 포스팅 해보려고 한다. 우선 @Module을 먼저 알아보자. Module 이란 무엇인가? 각 애플리케이션에는 최소한 하나의 모듈인 루트 모듈이 있습니다 . 루트 모듈은 Nest가 애플리케이션 그래프를 구축하는 데 사용하는 시작점입니다 . Nest가 모듈과 공급자 관계 및 종속성을 해결하는 데 사용하는 내부 데이터 구조입니다. 매우 작은 응용 프로그램은 이론적으로 루트 모듈만 가질 수 있지만 일반적인 경우는 아닙니다. 구성 요소를 구성하는 효과적인 방법으로 모듈을 강력하게 권장 한다는 점을 강조하고 싶습니다 . 따라서 대부분의 애플리케이션에서 결과 아키텍처는 각각 밀접하게 관련된 기능 집합을 캡슐화하는 여러 모듈을 ..
그동안 TypeOrm에서 IN조건으로 배열 통채로 검색이 안되는줄알고 service부에서 for문을 돌려서 uuid를 일일히 검색을 했었다. 그랬더니 이처럼 너무나 비효율적으로 SELECT쿼리 커넥션이 여러번 이뤄지는걸 볼 수 있다. 이러면 당연히 성능에도 영향을 끼친다. 그래서 서칭을 하다가 TypeOrm으로 한번에 배열로 검색을 할수있다는걸 알게 되었다. 이런...! - repository부 여러개 검색하려는 uuid를 배열로 where조건에 In을 써서 이처럼 한번에 할 수 있다. 윽 이렇게 쉽게 되는걸 굳이 for문을 돌려가며 했다니,,,, 열심히 하자. 아직 갈길이 멀었다.
오늘은 NestJS에서 데코레이터중 하나를 포스팅 해보려고 한다. Api개발을 할때 Controller에서 User정보를 토큰 값으로 받아서 개발을 할때 @CurrentUser 라는 데코레이터를 많이들 사용할 것이다. - controller부 이처럼 @CurrentUser() user 를 사용하게 되면 "user" 에 토큰으로받은 유저정보가 담기게 될것이다. console.log(user)를 해보면 user정보가 잘 넘어온다는 것을 확인해 볼 수 있을 것이다. 하지만 이럴경우 Service부로 넘어가는 파라미터가 두개가 되고 user관련 데이터 정제를 하게될 시 코드가 길어진다는 단점이 있다. 그래서 이런단점을 커버해주기 위해서 요새는 @CurrentUser 대신 다른 데코레이터를 사용한다. @UseIn..