728x90

[File] > [New Project...] 메뉴 선택

실행 환경 설정

main.py 소스

# This is a sample Python script.

# Press Shift+F10 to execute it or replace it with your code.
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.


def print_hi(name):
    # Use a breakpoint in the code line below to debug your script.
    print(f'Hi, {name}')  # Press Ctrl+F8 to toggle the breakpoint.


# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    print_hi('PyCharm')

# See PyCharm help at https://www.jetbrains.com/help/pycharm/

실행

상단에 Run 버튼 선택

실행 결과

D:\workspace.python\Example1\venv\Scripts\python.exe D:\workspace.python\Example1\main.py 
Hi, PyCharm
728x90
728x90

출처

Entity 객체

Entity 부모 클래스 ( node_modules\typeorm\decorator\entity\Entity.d.ts )

import { EntityOptions } from "../options/EntityOptions";
/**
 * This decorator is used to mark classes that will be an entity (table or document depend on database type).
 * Database schema will be created for all classes decorated with it, and Repository can be retrieved and used for it.
 */
export declare function Entity(options?: EntityOptions): ClassDecorator;
/**
 * This decorator is used to mark classes that will be an entity (table or document depend on database type).
 * Database schema will be created for all classes decorated with it, and Repository can be retrieved and used for it.
 */
export declare function Entity(name?: string, options?: EntityOptions): ClassDecorator;

User 클래스 ( entities/user.entity.ts )

import { BaseEntity, Column, Entity, PrimaryGeneratedColumn} from 'typeorm';

@Entity({ name: 'users' })
export class User extends BaseEntity {
  @PrimaryGeneratedColumn()
  public id: number;

  @Column()
  public roleId: number;

  @Column()
  public avatarId: number;

  @Column()
  public nickname: string;

  @Column()
  public email: string;

  @Column()
  public phone: string;

  @Column()
  public phoneWithCountryCode: string;

  @Column()
  public bio: string;

}

Service 클래스 ( user.service.ts )

Controller에서 요청 받은 내용을 Service 객체를 통해서 데이터 저장 및 검색한 결과를 반환

import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';

import { User } from './entities/user.entity';

@Injectable()
export class UsersService {

  constructor(
    @InjectRepository(User)
    private readonly _usersRepository: Repository<User>,
  ) { }

  public async detailUser(id: number): Promise<any> {
    const queryBuilder = this._usersRepository.createQueryBuilder('users');
    queryBuilder.where('users.id = :userId', { userId: id });
    const user = await queryBuilder.getOne();
    return user;
  }
}

Controller 클래스 ( user.controller.ts )

Controller는 http 요청을 처리 하고 클라이언트에 응답을 반환하는 하는 클래스

import { Controller, Get, Param } from '@nestjs/common';
import { User } from './entities/user.entity';
import { UsersService } from './user.service';

@Controller()
export class UsersController {
  constructor(
    private readonly _userService: UsersService
  ) { }

  @Get('detail/:id')
  public async findOne(@Param('id') id : number) {
    return this._userService.detailUser(id);
  }

}

Module 클래스 ( user.module.ts )

Module 데코레이터가 붙어있는 클래스로 Nest가 전체 어플리케이션의 구조를 정의한 메타데이터 제공

  • providers : Service 클래스
  • controllers : Controller 클래스
  • imports : 
  • exports : 
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersController } from './user.controller';
import { User } from './entities/user.entity';
import { UsersService } from './user.service';

@Module({
  imports: [ TypeOrmModule.forFeature([ User ]), ],
  controllers: [ UsersController ],
  providers: [ UsersService ],
})
export class UsersModule {
}

메인 Module 클래스 ( app.module.ts )

imports에 UsersModule 추가

import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';

import { configValidationSchema } from 'config/validation/config-validation';
import databaseConfig from '../config/database.config';
import { UsersModule } from './v1/users/user.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      cache: true,
      envFilePath: [ '.env.' + process.env.NODE_ENV ],
      ignoreEnvFile: process.env.NODE_ENV === 'prod',
      validationSchema: configValidationSchema,
      load: [ databaseConfig ],
    }),
    TypeOrmModule.forRootAsync({
      imports: [ ConfigModule ],
      useFactory: (configService: ConfigService) =>
          configService.get('database'),
      inject: [ ConfigService ],
    }),
    UsersModule
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

실행

728x90
728x90

WebStorm - npm 실행

WebStorm 이용해서 npm 실행하는 설정 방법을 정리 해보았습니다.

포트 3001 변경

3000포트를 Docker가 사용하고 있어서 3001번으로 포트를 변경했습니다.

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

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

[Edit Configurations...] 메뉴 선택

Run/Debug Configurations 창의 왼쪽 상단 + 버튼 선택

[npm] 메뉴 선택

아래의 화면과 동일하게 설정

  • Command : run
  • Scripts : start:dev
  • Package manager : npm

Before launch 항목에서 + 버튼 선택 -> [Launch Web Browser] 메뉴 선택

Browser : Chrome 설정, URL : http://localhost:3001/ 설정

설정값 저장

실행

브라우져로 확인

 

 

 

 

728x90
728x90

출처

TypeORM 설치

D:\workspace.nodejs\nestjs_example>npm i --save @nestjs/typeorm typeorm mysql2

src/app.module.ts 내용 - 환경 파일 사용하지 않고 연결하기

내용 추가

import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [

    TypeOrmModule.forRoot({
      /*
      type: 'mysql',
      host: 'localhost',
      port: 8200,
      username: 'bluex',
      password: 'bluex',
      database: 'iloveart',
      */
      type: 'mysql', // process.env.DB_CONNECTION,
      host: process.env.DB_HOST,
      port: +process.env.DB_PORT,
      username: process.env.DB_USERNAME,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_DATABASE,
      
      entities: [],
      synchronize: true,
    }),
  ],

전제 내용

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';

import { configValidationSchema } from 'config/validation/config-validation';
import databaseConfig from '../config/database.config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      cache: true,
      envFilePath: [ '.env.' + process.env.NODE_ENV ],
      ignoreEnvFile: process.env.NODE_ENV === 'prod',
      //validationSchema: configValidationSchema,
      //load: [ databaseConfig ],
    }),
    TypeOrmModule.forRoot({
      /*
      type: 'mysql',
      host: 'localhost',
      port: 8200,
      username: 'bluex',
      password: 'bluex',
      database: 'iloveart',
      */
      type: 'mysql', // process.env.DB_CONNECTION,
      host: process.env.DB_HOST,
      port: +process.env.DB_PORT,
      username: process.env.DB_USERNAME,
      password: process.env.DB_PASSWORD,
      database: process.env.DB_DATABASE,
      
      entities: [],
      synchronize: true,
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

src/app.module.ts 내용 - 환경 파일 사용

import { Module } from '@nestjs/common';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AppController } from './app.controller';
import { AppService } from './app.service';

import { configValidationSchema } from 'config/validation/config-validation';
import databaseConfig from '../config/database.config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      cache: true,
      envFilePath: [ '.env.' + process.env.NODE_ENV ],
      ignoreEnvFile: process.env.NODE_ENV === 'prod',
      validationSchema: configValidationSchema,
      load: [ databaseConfig ],
    }),
    TypeOrmModule.forRootAsync({
      imports: [ ConfigModule ],
      useFactory: (configService: ConfigService) =>
          configService.get('database'),
      inject: [ ConfigService ],
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

config/validation/config-validation.ts 내용

import * as Joi from 'joi';

export const configValidationSchema = Joi.object({
  // DATABASE
  DB_CONNECTION: Joi.string().min(1).required(),
  DB_HOST: Joi.string().min(1).required(),
  DB_PORT: Joi.string().min(1).required(),
  DB_DATABASE: Joi.string().min(1).required(),
  DB_USERNAME: Joi.string().min(1).required(),
  DB_PASSWORD: Joi.string().optional(),
});

config/database.config.ts 내용

import { registerAs } from '@nestjs/config';

import { User } from '../src/v1/users/entities/user.entity';

export default registerAs('database', () => {
  return {
    'name': 'default',
    'type': process.env.DB_CONNECTION,
    'host': process.env.DB_HOST,
    'port': process.env.DB_PORT,
    'username': process.env.DB_USERNAME,
    'password': process.env.DB_PASSWORD,
    'database': process.env.DB_DATABASE,
    'entities': [
      // 'dist/**/*.entity{.ts,.js}'
      User
    ],
    'synchronize': false,
    'migrationsTableName': 'migrations_histories',
    'migrationsRun': true,
    'logging': false
    // 'ssl': false,
    // 'extra': {
    //   'ssl': {
    //     'rejectUnauthorized': false
    //   }
    // }
  }
});

src\v1\users\entities\user.entity.ts 내용

import {Column, Entity, PrimaryGeneratedColumn} from 'typeorm';

@Entity({ name: 'users' })
export class User {
  @PrimaryGeneratedColumn()
  public id: number;

  @Column()
  public roleId: number;

  @Column()
  public avatarId: number;

  @Column()
  public nickname: string;

  @Column()
  public email: string;

  @Column()
  public phone: string;

  @Column()
  public phoneWithCountryCode: string;

  @Column()
  public bio: string;

}
728x90
728x90

출처

패키지 설치

@nestjs/config 설치

D:\workspace.nodejs\nestjs_example>npm i --save @nestjs/config

cross-env 설치 - 실행 옵션(dev, prod)에 따라서 참조하는 환경 변수 파일을 선택하기 위한 패키지

D:\workspace.nodejs\nestjs_example>npm i cross-env

joi 설치 - 환경변수 유효성 검사를 위한 패키지

D:\workspace.nodejs\nestjs_example>npm i joi

환경 파일 생성

  • .env.dev
  • .env.debug
  • .env.prod

package.json 수정

cross-env 패키지를 이용해 환경변수를 할당한뒤 nest start 명령을 실행

    // 수정전
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/src/main",
    
    // 수정후  
    "start": "nest start",
    "start:dev": "cross-env NODE_ENV=dev nest start --watch",
    "start:debug": "cross-env NODE_ENV=debug nest start --debug --watch",
    "start:prod": "cross-env NODE_ENV=prod node dist/main",

.env.xxx 내용

# DATABASE
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dev-db
DB_USERNAME=dev-user
DB_PASSWORD=dev-passwd

src/app.module.ts 내용

내용 추가

import { ConfigModule } from '@nestjs/config';

import { configValidationSchema } from 'config/validation/config-validation';
import databaseConfig from '../config/database.config';

imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      cache: true,
      envFilePath: [ '.env.' + process.env.NODE_ENV ],
      validationSchema: configValidationSchema,
      load: [ databaseConfig ],
    }),
  ],

전체 내용

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AppController } from './app.controller';
import { AppService } from './app.service';

import { configValidationSchema } from 'config/validation/config-validation';
import databaseConfig from '../config/database.config';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
      cache: true,
      envFilePath: [ '.env.' + process.env.NODE_ENV ],
      validationSchema: configValidationSchema,
      load: [ databaseConfig ],
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

config/validation/config-validation.ts 내용

import * as Joi from 'joi';

export const configValidationSchema = Joi.object({
  // DATABASE
  DB_CONNECTION: Joi.string().min(1).required(),
  DB_HOST: Joi.string().min(1).required(),
  DB_PORT: Joi.string().min(1).required(),
  DB_DATABASE: Joi.string().min(1).required(),
  DB_USERNAME: Joi.string().min(1).required(),
  DB_PASSWORD: Joi.string().optional(),
});

config/database.config.ts 내용

import { registerAs } from '@nestjs/config';

export default registerAs('database', () => {
  return {
    'name': 'default',
    'type': process.env.DB_CONNECTION,
    'host': process.env.DB_HOST,
    'port': process.env.DB_PORT,
    'username': process.env.DB_USERNAME,
    'password': process.env.DB_PASSWORD,
    'database': process.env.DB_DATABASE,
    'entities': [
      'dist/**/*.entity{.ts,.js}'
    ],
    'synchronize': false,
    'migrationsTableName': 'migrations_histories',
    'migrationsRun': true,
    'logging': false
    // 'ssl': false,
    // 'extra': {
    //   'ssl': {
    //     'rejectUnauthorized': false
    //   }
    // }
  }
});
728x90
728x90

출처

설치

yarn 설치

Yarn은 프로젝트 관리자의 역할을 하는 패키지 관리자입니다. 간단한 프로젝트에서 작업하든 업계 단일 레포에서 작업하든, 오픈 소스 개발자이든 엔터프라이즈 사용자이든 Yarn이 지원합니다.

D:\workspace.nodejs>npm install -g yarn

nestjs 설치

D:\workspace.nodejs>npm i -g @nestjs/cli

프로젝트 생성

D:\workspace.nodejs>nest new nestjs_example
⚡  We will scaffold your app in a few seconds..

? Which package manager would you ❤️  to use? yarn
CREATE nestjs_example/.eslintrc.js (688 bytes)
CREATE nestjs_example/.prettierrc (54 bytes)
CREATE nestjs_example/nest-cli.json (179 bytes)
CREATE nestjs_example/package.json (2022 bytes)
CREATE nestjs_example/README.md (3420 bytes)
CREATE nestjs_example/tsconfig.build.json (101 bytes)
CREATE nestjs_example/tsconfig.json (567 bytes)
CREATE nestjs_example/src/app.controller.ts (286 bytes)
CREATE nestjs_example/src/app.module.ts (259 bytes)
CREATE nestjs_example/src/app.service.ts (150 bytes)
CREATE nestjs_example/src/main.ts (216 bytes)
CREATE nestjs_example/src/app.controller.spec.ts (639 bytes)
CREATE nestjs_example/test/jest-e2e.json (192 bytes)
CREATE nestjs_example/test/app.e2e-spec.ts (654 bytes)

√ Installation in progress... ☕

🚀  Successfully created project nestjs_example
👉  Get started with the following commands:

$ cd nestjs_example
$ 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


D:\workspace.nodejs>

src\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();

실행

npm run start:dev 를 입력하면, 변경사항이 감지되었을 경우 직접 서버를 다시 키지 않아도 이를 감지하여 서버를 자동으로 재시동해준다.

D:\workspace.nodejs>cd nestjs_example

D:\workspace.nodejs\nestjs_example>npm run start

> nestjs_example@0.0.1 start
> nest start

[Nest] 2784  - 2024. 08. 07. 오후 11:53:47     LOG [NestFactory] Starting Nest application...
[Nest] 2784  - 2024. 08. 07. 오후 11:53:47     LOG [InstanceLoader] AppModule dependencies initialized +7ms
[Nest] 2784  - 2024. 08. 07. 오후 11:53:47     LOG [RoutesResolver] AppController {/}: +3ms
[Nest] 2784  - 2024. 08. 07. 오후 11:53:47     LOG [RouterExplorer] Mapped {/, GET} route +1ms
[Nest] 2784  - 2024. 08. 07. 오후 11:53:47     LOG [NestApplication] Nest application successfully started +2ms
728x90
728x90

HTML 소스

input 박스에 inputtype="number" 속성 추가

<form id="frmElMember" onsubmit="return submitCheckIt()">
  <input name="applied_power" inputtype="number">
</form>

JavaScript 소스

$(document).ready(function() {
	
	// input 박스의 key 눌러 졌을때 이벤트
	$('input[inputtype="number"]').on('change, keyup', function() {
		var value = $(this).val();
		// 숫자를 제외한 문자 제거
		var value = value.replace(/[^0-9]/g, '');
		// 3자리 단위로 콤마(,) 추가
		value = value.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
		$(this).val(value);
	});

    // Input 박스의 값을 3자리 단위로 콤마(,) 추가
	var inputNumber = $('input[inputtype="number"]');
	inputNumber.each(function (index, item) {
		var value = $(item).val();
		var value = value.replace(/[^0-9]/g, '');
		value = value.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
		$(item).val(value);
	});
});

// submit 체크 - submit시 콤마 제거
function submitCheckIt() {
	var inputNumber = $('input[inputtype="number"]');
	inputNumber.each(function (index, item) {
		var value = $(item).val();
		var value = value.replace(/[^0-9]/g, '');
		$(item).val(value);
	});
	
	return true;
}
728x90
728x90

출처

ComfyUI 다운로드

C:\stable-diffusion>git clone https://github.com/comfyanonymous/ComfyUI.git

Python 가상환경만들기

가상환경 생성

C:\stable-diffusion>cd ComfyUI
C:\stable-diffusion\ComfyUI>python -m venv venvIdmVton

가상환경 활성화

C:\stable-diffusion\ComfyUI>venvIdmVton\Scripts\activate
(venvIdmVton) C:\stable-diffusion\ComfyUI>

pip 업그레이드

(venvIdmVton) C:\stable-diffusion\ComfyUI>python.exe -m pip install --upgrade pip

PyTouch 설치

(venvIdmVton) C:\stable-diffusion\ComfyUI>pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu121

ComfyUI 관련 패키지 설치

(venvIdmVton) C:\stable-diffusion\ComfyUI>pip install -r requirements.txt

ComfyUI 실행

(venvIdmVton) C:\stable-diffusion\ComfyUI>python main.py
Total VRAM 8188 MB, total RAM 16092 MB
pytorch version: 2.4.0+cu121
Set vram state to: NORMAL_VRAM
Device: cuda:0 NVIDIA GeForce RTX 4060 Laptop GPU : cudaMallocAsync
Using pytorch cross attention
[Prompt Server] web root: C:\stable-diffusion\ComfyUI\web
C:\stable-diffusion\ComfyUI\venvIdmVton\Lib\site-packages\kornia\feature\lightglue.py:44: FutureWarning: `torch.cuda.amp.custom_fwd(args...)` is deprecated. Please use `torch.amp.custom_fwd(args..., device_type='cuda')` instead.
  @torch.cuda.amp.custom_fwd(cast_inputs=torch.float32)

Import times for custom nodes:
   0.0 seconds: C:\stable-diffusion\ComfyUI\custom_nodes\websocket_image_save.py

Starting server

To see the GUI go to: http://127.0.0.1:8188

ComfyUI Manager 설치

(venvIdmVton) C:\stable-diffusion\ComfyUI>cd custom_nodes
(venvIdmVton) C:\stable-diffusion\ComfyUI\custom_nodes>git clone https://github.com/ltdrdata/ComfyUI-Manager.git

ComfyUI 재실행

(venvIdmVton) C:\stable-diffusion\ComfyUI>python main.py
[START] Security scan
[DONE] Security scan
## ComfyUI-Manager: installing dependencies. (GitPython)
## ComfyUI-Manager: installing dependencies done.
** ComfyUI startup time: 2024-07-27 23:54:20.182361
** Platform: Windows
** Python version: 3.11.0 (main, Oct 24 2022, 18:26:48) [MSC v.1933 64 bit (AMD64)]
** Python executable: C:\stable-diffusion\ComfyUI\venvIdmVton\Scripts\python.exe
** ComfyUI Path: C:\stable-diffusion\ComfyUI
** Log path: C:\stable-diffusion\ComfyUI\comfyui.log

Prestartup times for custom nodes:
  18.1 seconds: C:\stable-diffusion\ComfyUI\custom_nodes\ComfyUI-Manager

Total VRAM 8188 MB, total RAM 16092 MB
pytorch version: 2.4.0+cu121
Set vram state to: NORMAL_VRAM
Device: cuda:0 NVIDIA GeForce RTX 4060 Laptop GPU : cudaMallocAsync
Using pytorch cross attention
[Prompt Server] web root: C:\stable-diffusion\ComfyUI\web
C:\stable-diffusion\ComfyUI\venvIdmVton\Lib\site-packages\kornia\feature\lightglue.py:44: FutureWarning: `torch.cuda.amp.custom_fwd(args...)` is deprecated. Please use `torch.amp.custom_fwd(args..., device_type='cuda')` instead.
  @torch.cuda.amp.custom_fwd(cast_inputs=torch.float32)
### Loading: ComfyUI-Manager (V2.48.2)
### ComfyUI Revision: 2413 [f82d09c9] | Released on '2024-07-27'

Import times for custom nodes:
   0.0 seconds: C:\stable-diffusion\ComfyUI\custom_nodes\websocket_image_save.py
   0.3 seconds: C:\stable-diffusion\ComfyUI\custom_nodes\ComfyUI-Manager

Starting server

To see the GUI go to: http://127.0.0.1:8188
[ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/alter-list.json
[ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/model-list.json
[ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/github-stats.json
[ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/extension-node-map.json
[ComfyUI-Manager] default cache updated: https://raw.githubusercontent.com/ltdrdata/ComfyUI-Manager/main/custom-node-list.json
728x90

+ Recent posts