오늘은 NestJS에서 데코레이터중 하나를 포스팅 해보려고 한다. Api개발을 할때 Controller에서 User정보를 토큰 값으로 받아서 개발을 할때 @CurrentUser 라는 데코레이터를 많이들 사용할 것이다. - controller부 이처럼 @CurrentUser() user 를 사용하게 되면 "user" 에 토큰으로받은 유저정보가 담기게 될것이다. console.log(user)를 해보면 user정보가 잘 넘어온다는 것을 확인해 볼 수 있을 것이다. 하지만 이럴경우 Service부로 넘어가는 파라미터가 두개가 되고 user관련 데이터 정제를 하게될 시 코드가 길어진다는 단점이 있다. 그래서 이런단점을 커버해주기 위해서 요새는 @CurrentUser 대신 다른 데코레이터를 사용한다. @UseIn..
에러 코드가 상당히 긴편이다,, 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..
미루고 미루다가 오늘 드디어 NestJS의 꽃인 Provider와 필수로 알고 가야되는 Ioc, DI에 대해 포스팅 해보려고한다. 처음 공식문서를 접했을 때엔 이게 무슨소린가 싶었지만 너무나 중요한개념이라서 관련문서를 끊임없이 찾아보았다. 솔직히 개념적으로 모르더라도 NestJS로 개발하는데 큰 어려움은 없지만 제대로 알고 개발을 하고 싶었다. Provider 우선 Provider를 사전적 의미로 보면 제공자이다. 뭘 제공하느냐? 의존성을 주입할 수 있다는 말이다. 의존성을 주입할 수 있다는 의미는 object가 다른 object와 다양한 관계를 만들 수 있고, 객체의 인스턴스를 연결해주는 기능은 Nest 런타임 시스템에 위임될 수 있다. 그리고 대부분 NestJS의 클래스는 service, repos..
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 method인 save(), insert(), update() 에 대해서 알아보려고 한다. 얼핏보기에는 비슷해서 아무거나 써도 될 것 같은데 이게 별거 아닌 것 같아도 성능에도 영향을 끼친다. 우선 typeorm 공식 홈페이지에 나와있는 사진을 보면서 한개씩 알아보자. SAVE() save() 메서드는 값이 없으면 insert 기능을 하여 데이터를 저장하고 값이 존재하면 덮어쓴다. 그러고 저장된값을 select해서 리턴한다. 수정할때 save()는 기존의 데이터를 위에 덮어쓰는 방식이라서 기존데이터가 사라진다. 쉽게말해 document단위로 데이터를 변경한다. ex) 필드가 5개 존재하고 save로 2개의 필드를 수정하려면 5개의 필드는 전부 사라지고 2개의 필드만 저장된다. INS..
NestJS ParseIntPipe 우선 파이프란 Injectable( ) 데코레이터이며 data transformation 과 data validation 을 주 목적으로 사용한다. - data transformation 이란? 입력데이터를 원하는 형식으로 변환하는 것을 말하며 예를 들어 문자열에서 정수로 바꾸는 것을 의미한다. - data Validation 이란? 단어 그대로 데이터 검증이다. 유효성 체크로 입력 데이터를 평가하고 유효한 경우 변경되지 않은 상태로 전달한다. 그렇지 않고 데이터가 올바르지 않을 떈 예외를 발생시킨다. Nest의 pipe는 크게 두 종류가 있는데 직접 만들어 사용하는 파이프를 커스텀 파이프 라고 하고 미리 만들어진 것을 빌트인 파이프 라고 한다. 오늘 볼 ParseIn..
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..
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:..
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{ } 에 엔티티 경로를 보면 이해가 될 것 이다..
Node.js 실행중인 서버 확인 및 종료하기 - address already in use 터미널 창에서 "address already in use(####)" 라고 Node.js 오류가 뜰 때 lsof -i TCP:3000 // 3000 은 예시이고 해당 address already in use[포트번호]에 있는 포트 번호를 써주자 명령어를 입력하게 되면 위 사진처럼 현재 사용중인 포트정보를 보여준다. 여기서 본인이 알고있는 프로젝트면 해당프로젝트 터미널창에서 ctrl+c 를 눌러서 종료시켜주자. 하지만 잘 모르거나 해당 서버의 cmd가 없을경우 종료할 PID를 이렇게 입력하자. kill -9 581 // 581대신의 삭제할 PID를 입력해주자 이러면 삭제 되었을 것 이다. 제대로 삭제되었는지 확인 해..