문제(출처: 프로그래머스)

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.

 

▶ 내가 푼 방식

function solution(emergency) {
    var answer = [...emergency];
    answer.sort((a,b) => b-a);
    let result = [];
    for(let i of emergency){
        result.push((answer.indexOf(i)) +1);
    }
    return result;
}

 

 다른 유저가 푼 방식

// 유저 1 맵으로도 가능
function solution(emergency) {
    const rank = [...emergency];
    rank.sort((a, b) => b - a);
    return emergency.map(n => rank.indexOf(n) + 1);
}

 

 배운 것들

     -  array deep copy -> [...array]

     - 

Module

@Module() 데코레이터가 붙어 있는 클래스

각 어플리케이션에는 각각의  module이 존재 → @Module()를 이용하여 애플리케이션의 전체 구조를 이해하고 조직화하는 데 필요한 메타데이터를 제공

@Module() 가 metadata 를 제공 → NestJS 에서 어플리케이션 구조를 조직화 하기 위해 사용

 

예시 구조

src
  | - cats
// cats/ cats.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {
	constructor(private catsService: CatsService) 
}

 

// app.modules.ts

import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';

@Module({
  imports: [CatsModule],
})
export class AppModule {}

 

 

Module 의 다양한 활용방식

Module re-exporting

@Module({
  imports: [CommonModule],
  exports: [CommonModule],
})
export class CoreModule {}

 

Global module

import { Module, Global } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Global() // <<
@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService],
})
export class CatsModule {}

 - 모든 것을 global로 선언하는 것은 추천되지 않는 방식

 

Dynamic modules 방식은 추후에 :  https://docs.nestjs.com/fundamentals/dynamic-modules

Providers ?

  • NestJS 에서 가장 근본적인?기본적인 개념
  • 기본적인 Nest의 대부분의 class 들이 Providers 로 취급되어지기 때문
  • service, repositories, factories, helpers,.. 같은 것들이 providers 에 해당

주요역할

  • 의존성 주입 ( dependency injection), 
    •  비지니스 로직에 맞게 디자인된 클래스( service, repositories, factories, helpers,..) 를 불러와서 다른 클래스에 주입하여 디자인된 패턴을 연결을 시키는 것.
    •  코드를 보면 비지니스 로직에 맞게 디자인된 클래스( service, repositories, factories, helpers,..)를 불러와서 인스턴스를 생성하는것 과 같다. 
    • service 와 controller의 사이를 두고 보면 Provider가 service를 제공하면 Consumer(controller)가 제공된 서비스를 이용하는 구조(인스턴스 생성)

적용하는 방법

 

(예) cats.services.ts 를 생성하고 사용하는 경우

1. @Injectable() 을 클래스 선언 전에 꼭 붙일것

import { Injectable } from '@nestjs/common';
import { Cat } from './interfaces/cat.interface';

@Injectable() //<-- 필수
export class CatsService {
  private readonly cats: Cat[] = [];
  
  // 필요한 코드
}

 

2. module.ts 에 있는 providers에  생성한 클래스들을 등록 필수

// app.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats/cats.controller';
import { CatsService } from './cats/cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],  // <-- 등록 필수
})
export class AppModule {}

 

3. 적용 Dependency injection

// cats.controller.ts

import { Controller, Get, Post, Body } from '@nestjs/common';
import { CreateCatDto } from './dto/create-cat.dto';
import { CatsService } from './cats.service';
import { Cat } from './interfaces/cat.interface';

@Controller('cats')
export class CatsController {
  constructor(private catsService: CatsService) {} // <- Dependency injection

  // ... 코드 
}

 

 

참고자료

https://docs.nestjs.com/providers

'프로그래밍 > Nest.js' 카테고리의 다른 글

[ NestJS] [errror] No metadata for "User" was found.  (0) 2024.04.23
[ NestJS ] Modules  (0) 2024.04.18
[NestJS] TypeORM 설정방법  (0) 2024.04.17
[ NestJS] DTO?  (0) 2024.04.17
[ NestJS ] Controllers  (0) 2024.04.15

라이브러리 설치

- TypeORM

$ npm install --save @nestjs/typeorm typeorm mysql2

 

- Typeorm naming strategies

$ npm install typeorm-naming-strategies --save

 

TypeORM 설정

app.module -> 


@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: 'localhost', //'127.0.0.1',
      port: 3306,
      username: 'root',
      password: '',
      database: 'test_typeORM',
      // entities: [User],
      autoLoadEntities: true, // 자동으로 엔티티 불러오는 옵션
      synchronize: true,
      logging: true,
      namingStrategy: new SnakeNamingStrategy(),
    })
  ],

 

아래 설정을 작동하게 하려면 -> BoardModule 도 import 해야함

autoLoadEntities: true

 

board.module.ts 에서 BoardModule 생성

import { Module } from '@nestjs/common';
import { BoardService } from './board.service';
import { BoardController } from './board.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Board } from './board.entity';
@Module({
  imports: [TypeOrmModule.forFeature([Board])],
  controllers: [BoardController],
  providers: [BoardService],
})
export class BoardModule {}

 

이러면 신기하게도 board가 알아서 생성이 된다.

 

그후 service 에서 board 를 선어해주면 내가 게시물을 게시하면 게시가된다.

@Injectable()
export class BoardService {
  constructor(
    @InjectRepository(Board)
    private readonly boardRepository: Repository<Board>,
  ) {}

'프로그래밍 > Nest.js' 카테고리의 다른 글

[ NestJS ] Modules  (0) 2024.04.18
[ NestJS ] Providers  (0) 2024.04.18
[ NestJS] DTO?  (0) 2024.04.17
[ NestJS ] Controllers  (0) 2024.04.15
[ NestJS ] 시작하기  (0) 2024.04.15

문제(출처: 프로그래머스)

영어 대소문자로 이루어진 문자열 my_string 이 매개변수로 주어질 때, my_string 을 모두 소문자로 바꾸고 알파벳 순서대로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요.

 

▶ 내가 푼 방식

function solution(my_string) {
    var answer = my_string.toLowerCase();
    answer = [...answer].sort()
    return answer.join('');
}

제출이 안되네... 나중에 다시 제출해보자

 

 다른 유저가 푼 방식

// 유저 1
function solution(s) {
    return [...s.toLowerCase()].sort().join('')
}

 

 배운 것들

     - 

+ Recent posts