728x90

기존 RDB에 익숙한 개발자로 document DB 중 하나인 mongo DB에 컬럼을 추가해야 될 일이 생겼어요.

 

생소한 DB라 개념이 잘 이해되지 않았는데 RDB에서 스키마> 테이블> 컬럼 이러한 구조가 document db에서는 하나의 서류철?처럼 생각하니 좀 쉬웠습니다.

 

우리가 흔히 테이블이라고 부르는 것을 하나의 서류파일이라고 생각하고 거기에 컬럼을 하나 추가한다고 하기보단 서류양식을 update 한다고 생각하면 됩니다.

 

DataGrip을 이용하여 컬럼을 추가하려고 하는데.. 좀처럼 add column이 보이지 않아요;;; 

여기저기 눌러보고 검색해 보다 테이블명을 우클릭 하니 [Modify Table]이라고 메뉴가 보입니다.

 

하지만, + 버튼이 활성화 되지 않네요.... datagrip 공홈에서도 사용법은 나와있지만 모두 막혀있어 권한 문제인가도 고민했지만, 전 이미 admin이기에.. 권한 문제는 아닐 거 같고요.

 

sql은 standard니까 라는 생각으로 콘솔창에 sql DDL 명령문을 입력하니

네.. 빨간색이 보입니다... 개발자라면 보기싫은 저 빨간 지렁이들이요.

 

다시 검색해보니 mongodb의 명령문은

였어요. 

sql은 alter table <테이블명> add column <컬럼명> <테이터타입>의 형태이지만

mongoDB에서는

  • db : 데이터베이스의
  • bcheckemps : bcheckemps 라는 테이블에
  • updateMany : 전체를 update 해준다. (한 건을 실행할 때는 updateOne을 사용하면 됩니다.)
  • $set부분 : ""값이 들어있는 login_password 컬럼을 set 한다.

이렇게 생각하니 쉬웠습니다.

명령어 입력 시에도 DataGrip에서 . 입력하면 사용 가능한 명령어 목록이 나와서 아주 편리하네요.

 

728x90
반응형
728x90

nest cli는 많은 기능을 제공하는 데, 그중 generator를 이용하여 CRUD를 구현해 보겠습니다.

먼저 nest -h 명령어를 통해 nest에서 사용하는 alias를 확인해 볼게요.

nest -h
Usage: nest <command> [options]

Options:
  -v, --version                                   Output the current version.
  -h, --help                                      Output usage information.

Commands:
  new|n [options] [name]                          Generate Nest application.
  build [options] [app]                           Build Nest application.
  start [options] [app]                           Run Nest application.
  info|i                                          Display Nest project details.
  update|u [options]                              Update Nest dependencies.
  add [options] <library>                         Adds support for an external library to your project.
  generate|g [options] <schematic> [name] [path]  Generate a Nest element.
    Schematics available on @nestjs/schematics collection:
      ┌───────────────┬─────────────┬──────────────────────────────────────────────┐
      │ name          │ alias       │ description                                  │
      │ application   │ application │ Generate a new application workspace         │
      │ class         │ cl          │ Generate a new class                         │
      │ configuration │ config      │ Generate a CLI configuration file            │
      │ controller    │ co          │ Generate a controller declaration            │
      │ decorator     │ d           │ Generate a custom decorator                  │
      │ filter        │ f           │ Generate a filter declaration                │
      │ gateway       │ ga          │ Generate a gateway declaration               │
      │ guard         │ gu          │ Generate a guard declaration                 │
      │ interceptor   │ in          │ Generate an interceptor declaration          │
      │ interface     │ interface   │ Generate an interface                        │
      │ middleware    │ mi          │ Generate a middleware declaration            │
      │ module        │ mo          │ Generate a module declaration                │
      │ pipe          │ pi          │ Generate a pipe declaration                  │
      │ provider      │ pr          │ Generate a provider declaration              │
      │ resolver      │ r           │ Generate a GraphQL resolver declaration      │
      │ service       │ s           │ Generate a service declaration               │
      │ library       │ lib         │ Generate a new library within a monorepo     │
      │ sub-app       │ app         │ Generate a new application within a monorepo │
      │ resource      │ res         │ Generate a new CRUD resource                 │
      └───────────────┴─────────────┴──────────────────────────────────────────────┘

맨 아래에 보시면 CRUD가 있습니다. resource 또는 res를 이용하면 CRUD에 필요한 템플릿을 만들 수 있습니다.

저는 auth라는 CRUD 기능을 만들어 보겠습니다.

nest g res auth 
? What transport layer do you use? 
> REST API
  GraphQL (code first)
  GraphQL (schema first)
  Microservice (non-HTTP)
  WebSockets
? Would you like to generate CRUD entry points? (Y/n) Y
CREATE src/auth/auth.controller.spec.ts (556 bytes)
CREATE src/auth/auth.controller.ts (883 bytes)  
CREATE src/auth/auth.module.ts (240 bytes)      
CREATE src/auth/auth.service.spec.ts (446 bytes)
CREATE src/auth/auth.service.ts (607 bytes)
CREATE src/auth/dto/create-auth.dto.ts (30 bytes)
CREATE src/auth/dto/update-auth.dto.ts (164 bytes)
CREATE src/auth/entities/auth.entity.ts (21 bytes)
UPDATE src/app.module.ts (388 bytes)

nest g res 명령 실행 시 어떤 전송방법을 사용할지, CRUD point를 생성할지에 대해 물어봅니다.

저는 REST API, Y를 선택하여 생성하였습니다. 이제 start를 해보겠습니다.

 yarn start

"Nest application successfully started" 성공적으로 시작했다고 합니다.

"http://localhost:3000/auth"로 접속해 보니 "Hello" 메시지를 정상적으로 만나볼 수 있습니다.

하지만 우리는 이걸 목적으로 한 것이 아니기에 "http://localhost:3000/auth/1"로 접속해 봅니다.

이렇게 나오게 되면, Resource생성이 정상적으로 완료되었음을 확인할 수 있습니다.

생성된 폴더 구조를 살펴보도록 하겠습니다.

.ts파일 중 spec.ts는 테스트 파일, dto, entities폴더에 있는 파일은 DB와 관련된 파일입니다.

먼저 이외의 controller, moduel, service에 대해서 살펴보겠습니다.

 

> service

service파일은 비즈니스 로직을 처리하는 파일입니다. auth.service.ts의 AuthService를 살펴보면

create, findAll, findOne, update, remove라는 메서드가 있습니다.

방금 전, "http://localhost:3000/auth/1"를 호출하였을 때 만났던 메시지가 findOne 메서드를 통해 response 되었겠네요.

findOne(id: number) {
    return `This action returns a #${id} auth`;
  }

> controller

@Controller('auth')
export class AuthController {
  constructor(private readonly authService: AuthService) {}

  @Post()
  create(@Body() createAuthDto: CreateAuthDto) {
    return this.authService.create(createAuthDto);
  }

  @Get()
  findAll() {
    return this.authService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.authService.findOne(+id);
  }

controller를 살펴보면 @Get, @Post, @Delete, @Patch와@Controller('auth') 데코레이터들을 볼 수 있습니다.

"localhost:3000/auth"로 request 하면 이 클래스에서 처리한다는 의미이고, 데코레이터들을 기준으로 각 메서드들이 처리함을 의미합니다. 

"http://localhost:3000/auth/1"를 호출하였을 때 service 중 findOne메서드를 통해 메시지가 출력되었는데, controller에서는 @Get(':id')인 데코레이터를 가진 findOne이 호출되어 service를 호출한 것입니다.

':'으로 시작하는 문자열이 파라미터 값이구나 하는 걸 직관적으로 알 수 있으시겠죠?

 

> module

@Module({
  controllers: [AuthController],
  providers: [AuthService]
})
export class AuthModule {}

auth.module.ts를 살펴보면 굉장히 간단하지만 중요한 역할을 합니다.

auth폴더 내에 있는 resource들을 어떻게 이용하겠다!라고 선언해주는 부분이기 때문입니다.

controller는 AuthController를, providers는 AuthService를 이용한다는 의미입니다. 

마지막으로 AuthModule로 export 하여주는데, 이는 프로젝트 전체의 app.module.ts에서 확인해보면

@Module({
  imports: [SharedModule, AuthModule],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

"imports: [ "부분에 AuthModule이 import 되어 이용되는구나 확인할 수 있습니다.

 

 

728x90
반응형

'NestJS' 카테고리의 다른 글

[NestJS] swagger에서 테스트하기  (0) 2022.03.23
[NestJS] Authentication 구현  (0) 2022.03.18
[NestJS] app.controller 살펴보기  (0) 2022.03.02
[NestJS] 개발하기  (0) 2022.02.25
[NestJS] 시작하기  (0) 2022.02.25
728x90

app.controller.ts 소스 살펴보기

지난번엔 서버를 구동하여 "hello world"를 띄워 보았어요.

localhost의 root경로로 request가 response 되는 것을 확인한 것입니다.

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

app.controller.ts를 보면 Spring 프레임워크와 굉장히 익숙한 구조임을 알 수 있어요. 서버가 수행해야 할 일을 '@' Annotation, Decorator(어노테이션, 데코레이터)로 기술합니다.

 

@Controller 데코레이터를 클래스에 선언함으로써 해당 클래스는 컨트롤러의 역할을,

@Get() 데코레이터를 가진 getHello 함수는 root경로로 들어오는 request(요청)를 처리할 수 있습니다.

 

@Controller() 데코레이터를 보면 ( )가 있다. 여기에 인자를 입력하여 라우팅 경로는 정해줄 수 있어요. 예를들어 backend에서 주로 사용하는 'app'이라고 입력하면 우리가 지난번에 테스트했던 https://localhost:3000/app으로 접근해야 "hello world"를 만날 수 있는 것이죠!

  @Get('/helloworld')
  getHello(): string {
    return this.appService.getHello();
  }

@Get() 안에는 '/'가 생략되어 루트 경로이며, '/helloworld'로 변경한다면, 기존의 http://localhost:3000/ 요청에 대하여 404 에러를 만나게 될 것이고, http://localhost:3000/helloworld로 요청해야 "hello world"페이지를 응답받을 수 있을 것이다.

좌 : helloworld로 호출&nbsp; &nbsp; &nbsp; /&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 우 : root 호출&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;

 

소스로 보면 @Controller(에는 "prefix:", @Get(에는 "path"라고 붙여진 게 확실히 보여서 더 쉽게 이해할 수 있습니다.

728x90
반응형

'NestJS' 카테고리의 다른 글

[NestJS] swagger에서 테스트하기  (0) 2022.03.23
[NestJS] Authentication 구현  (0) 2022.03.18
[NestJS] CRUD 구현해보기  (0) 2022.03.07
[NestJS] 개발하기  (0) 2022.02.25
[NestJS] 시작하기  (0) 2022.02.25
728x90

가입 후에 로그인하니 우측에 포인트 정보가 딱!! 38만 4천 원이 들어와 있네요.

해당 포인트는 22년 12월 15일까지, 한달에 4회 사용할 수 있게 되어 있어요.

최소 주문금액 3만원이상 이고요. 한 번에 10만 원까지 주문할 수 있습니다.

 

그럼 포인트를 사용해볼까요?

 

요즘 최애 과일인 딸기를 산다는 가정하에 주문해보았어요.

 

배송일을 선택할 수 있게 되어 있네요.

마감시간은 오전 11시 30분이니 다음번에 주문할때도 참고해야겠어요.

 

다음은 제일 궁금했던 결제정보에요.

 

구매금액 39,600원 중 본인부담 20%인 7,920원만 결제하면 선택한 배송일에 배송되는 거겠죠?

임산부 혜택 앞으로도 많이 만들어주세요^^

728x90
반응형
728x90

안녕하세요. 오늘은 임산부 친환경농산물 지원사업 관련 글이에요.

임신하고 정부에서 받을 수 있는 혜택 중 하나인데요. 지역별로 선착순 신청을 하였고, 운 좋게 선정되어서 주문안내 문자가 왔어요.

승인 코드번호를 입력하여 가입하고 지원금을 이용해 결제하면 된다고 하는 데요.

먼저 해당 링크로 들어가 봅니다.

https://ii.ecoop.or.kr/pwFood/

 

친환경농산물 꾸러미지원

친환경농산물 꾸러미지원

ii.ecoop.or.kr

회원가입 메뉴가 바로 보이지 않네요;;

[로그인] - [아이디 만들기]로 들어가 문자로 온 코드번호와 신청 시 입력한 핸드폰 번호를 입력해 주세요.

 

[확인]을 클릭하면 위와 같이 "※ 본인 인증 완료"가 뜨고 [필수 정보 입력] 란이 보이게 됩니다.

개인정보 입력 후 동의 [가입 완료하기]버튼을 클릭합니다.

 

가입이 완료되었다는 메시지가 나오면 완료!

이제 쇼핑을 해보면 되겠죠?

저는 서울 강서구로 신청하여 두레생협연합회에서 배송이 되네요.

다음엔 주문 방법에 대해서 포스팅 해보겠습니다.

 

 

728x90
반응형
728x90

구글 검색에 등록하고 나니 네이버에서는 안될까 라는 생각이 들었습니다.

그래서 네이버도 서치 콘솔도 찾아보았어요.

네이버에서는 '서치 어드바이저'라고 부르네요.

 

먼저 네이버로 서치어드바이저로 들어가 주세요.

https://searchadvisor.naver.com/

 

네이버 서치어드바이저

네이버 서치어드바이저와 함께 당신의 웹사이트를 성장시켜보세요

searchadvisor.naver.com

 

 

로그인이 완료되면 [웹마스터 도구]로 들어갑니다.

티스토리 주소를 입력하면 사이트 소유확인 페이지로 넘어갑니다.

저희는 구글에서 했던 방법과 동일하게 HTML 태그로 인증하도록 하겠습니다.

<meta~로 시작하는 태그를 복사해 주세요.

음 아쉽게도 네이버는 자동 복사 버튼이나 기능이 없어서 태그를 선택해서 복사합니다.

 

다음은 블로그 관리 홈으로 들어가 주세요.

메뉴 중 [꾸미기] - [스킨 편집] - [html 편집]을 선택해 줍니다.

이번엔 구글 서치 아래쪽에 네이버 서치 어드바이저를 붙여볼게요.

구글 서치 등록되어 있는 거 보이시죠?

아래에 복사한 <meta 태그 붙여 넣기 후 적용하면 됩니다.

 

그럼 다시 네이버 서치 어드바이저로 돌아와서 [소유확인]을 클릭해주면 

자동 등록 방지 보안 문자 입력 후 확인하여 등록을 완료합니다.

 

728x90
반응형
728x90

블로그를 시작하고 글을 올리면 자동으로 구글에 검색되는 줄 알았어요;;;

but!!! 구글 서치 콘솔(Google Search Console)에 인증을 받아야 검색이 되는 거였습니다.

 

방법은 5분도 안 걸릴 만큼 간단해요!! 

https://search.google.com/search-console/about

 

Google Search Console

Search Console 도구와 보고서를 사용하면 사이트의 검색 트래픽 및 실적을 측정하고, 문제를 해결하며, Google 검색결과에서 사이트가 돋보이게 할 수 있습니다.

search.google.com

 

구글 서치콘솔로 들어가 주세요.

 

시작하기로 들어가면 도메인과 URL 접두어 선택하도록 나와요.

저희는 xxx.tistory.com로 URL을 사용하고 있으므로 URL 접두어를 선택해주고,

"https://xxx.tistory.com" 형태로 본인의 블로그 주소를 입력하면 됩니다.

입력 후 계속!!

 

그럼 소유권 확인이라는 창이 뜰 거예요.

권장 확인 방법, 다른 확인 방법 중 저희는 다른 확인 방법에 있는 HTML 태그를 이용해 보겠습니다.

 

<meta~ 로 시작하는 태그를 복사해 주세요.

 

다음은 블로그 관리 홈으로 들어가 주세요.

메뉴 중 [꾸미기] - [스킨 편집] - [html 편집]을 선택해 줍니다.

아래의 화면이 나오게 돼요.

그럼 아까 복사해둔 <meta~로 시작하는 태그를

<head> 영역에 붙여 넣고 적용!

 

다음으로 다시 구글 서치 콘솔로 돌아와 [확인] 버튼을 클릭해주세요.

그럼 인증 확인 후에

 

위와 같이 완료됩니다!

 

구글 검색창에서 제 블로그를 볼 수 있는 날까지! 열심히 포스팅해볼게요.

728x90
반응형
728x90

저는 임신 7개월 차 개발자입니다.

오늘은 남편이 결혼식을 가서 토요일 아점을 혼자 해결했어요.

임당 검사 때문에 먹고 싶어서 샀던 우동이였는데... 못 먹고 있다 이제야 먹어봅니다.

 

집 앞 마트에서 산 CJ 얼큰우동

6인분이 한 봉지에 들어서 좀 많긴 하네요;;; 유통기한은 7월까지로 여유롭여요.

 

우동면, 우동소스, 우동건더기, 고춧가루 각 6봉씩 들어있네요

 

종이컵 2컵 분량의 물이 끓으면 순서대로 넣어주기만 하면 끝이에요.

아주 간단하고 좋아요!

 

저는 여기에 냉동실에 있던 깻잎 어묵까지 추가해보았어요

 

끓이는 사진이 없네요; 중간에 전화 와서 정신이 살짝 없었어요.

 

맛은.. 간편히 먹기 좋아요!!!

면도 쫄깃하고요. 얼큰함은 매운맛을 생각했더라면 살짝 부족합니다. 그냥 우동보다 살짝 얼큰한 정도였어요.

 

한 그릇 뚝딱하고 제주 골드그린키위로 디저트까지 완벽한 토욜 아점이었습니다.

728x90
반응형
728x90

git 생성 후 확인해보니 내 이름이 이상하게 뜬다;;;

LAPTOP-XXXXXX\PC사용자명 형태로 말이다. 이를 바꿔보자.

먼저 git관련 설정을 확인해보자.

 git config --list

user.name이 LAPTOP-XXX로 설정되어 있는 것을 볼 수 있다. 아마도 다른 설정을 안 하면 기본적으로 이렇게 설정되는 것 같다.

이를 상콤하게 "sound"로 변경한다.

git config --global user.name "sound"

후에 "git config --list" 명령어로 확인하니 변경되었다.

앞으로는 sound로 push push 하겠어요!

728x90
반응형
728x90

1. Installation

Nest CLI를 통해 쉽게 프로젝트 생성할 수 있다.

npm i -g @nestjs/cli

npm을 통해 @nestjs/cli를 설치한다. -g 옵션을 통해 글로벌 환경에 설치하였다.

 

글로벌 환경의 설치 경로를 확인할 수 있다.

npm root -g

 

2. 프로젝트 생성

nest new [project name]

[procjet name]에 원하는 프로젝트 명을 입력하여 명령어를 실행한다.

 

⚡  We will scaffold your app in a few seconds..

CREATE bcheck-auth-nest/.eslintrc.js (631 bytes)
CREATE bcheck-auth-nest/.prettierrc (51 bytes)
CREATE bcheck-auth-nest/nest-cli.json (64 bytes)
CREATE bcheck-auth-nest/package.json (2005 bytes)
CREATE bcheck-auth-nest/README.md (3339 bytes)
CREATE bcheck-auth-nest/tsconfig.build.json (97 bytes)
CREATE bcheck-auth-nest/tsconfig.json (546 bytes)
CREATE bcheck-auth-nest/src/app.controller.spec.ts (617 bytes)
CREATE bcheck-auth-nest/src/app.controller.ts (274 bytes)
CREATE bcheck-auth-nest/src/app.module.ts (249 bytes)
CREATE bcheck-auth-nest/src/app.service.ts (142 bytes)
CREATE bcheck-auth-nest/src/main.ts (208 bytes)
CREATE bcheck-auth-nest/test/app.e2e-spec.ts (630 bytes)
CREATE bcheck-auth-nest/test/jest-e2e.json (183 bytes)

 

중간에 어떤 package manager를 사용할 것인지 물어본다. 필자는 yarn을 선택하였다.

? Which package manager would you ❤️  to use? yarn
✔ Installation in progress... ☕

🚀  Successfully created project bcheck-auth-nest
👉  Get started with the following commands:

$ cd [project name]
$ yarn run start


                          Thanks for installing Nest 🙏
                 Please consider donating to our open collective
                        to help us maintain this package.


               🍷  Donate: https://opencollective.com/nest

위와 같이 뜨면 프로젝트 생성이 완료된 것이다. 생성된 프로젝트를  개발 툴로 열어 구조를 살펴보자.

참고로 글쓴이는 IntelliJ를 이용한다.

[Project Name] - [src] 아래에 app.으로 시작하는 파일들과 main.ts 파일이 생성되었음을 확인할 수 있다.

각각의 역할은 아래와 같다.

app.controller.spec.ts 컨트롤러 단위 테스트용
app.controller.ts 기본 컨트롤러
app.module.ts application의 root module
app.service.ts 단일 메서드를 사용하는 기본 서비스
main.ts NestFactory를 사용하여 Nest application 인스턴스를 작성하는 엔트리 파일

 

3. main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

Nest application은 인스턴스를 생성하기 위해 NestFactory를 사용한다. NestFactory는 application 응용프로그램 인스턴스를 만들 수 있는 정적 메서드를 제공하며, careate() 메서드는 INestApplication (인터페이스 응용프로그램 객체)을 반환한다.

 

4. Running the application

아래의 명령어로 인바운드 HTTP 요청을 수신하는 애플리케이션을 시작할 수 있다.

npm run start

 

main.ts에 정의한 port에서 수신하는 HTTP 서버로 앱을 시작하므로

http://localhost:3000/ 에 접속하면 귀여운 "Hello World!"를 볼 수 있다.

 

728x90
반응형

'NestJS' 카테고리의 다른 글

[NestJS] swagger에서 테스트하기  (0) 2022.03.23
[NestJS] Authentication 구현  (0) 2022.03.18
[NestJS] CRUD 구현해보기  (0) 2022.03.07
[NestJS] app.controller 살펴보기  (0) 2022.03.02
[NestJS] 시작하기  (0) 2022.02.25

+ Recent posts