[NodeExpressTs] 3. 개쉬운 typeorm 셋팅(RDB)

 

직접 소스코드를 제작하고, 그걸 그동시키는게 아닌,

이미 완성된 스켈레톤 코드에서 필요한것만 설명하겠다

 

여러분이 노드js로 실무 프로젝트를 만들때도 이 스켈레톤 프로젝트 복붙하고, 필요한 부분만 수정하거나 추가해가면서 하면 되는 것이다



src/entity/Post.ts
 
import {
  Entity,
  Column,
  PrimaryGeneratedColumn,
  ManyToOne,
  JoinColumn,
from 'typeorm';
import { User } from './User';
@Entity()
export class Post {
  @PrimaryGeneratedColumn()
  id!: number;
  @Column()
  title!: string;
  @Column()
  text!: string;
  @Column({ nullable: true })
  test!: string;

  @Column()
  userId!: number;

  @ManyToOne(() => User, (user=> user.posts, {
    onDelete: 'CASCADE',
    onUpdate: 'CASCADE',
  })
  @JoinColumn({ name: 'userId' })
  user!: User;
}
 
 -----------------------------------------------------------
 
src/entity/User.ts 
import { EntityColumnPrimaryGeneratedColumnOneToMany } from 'typeorm';
import { Post } from './Post';

@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id!: number;

  @Column()
  firstName!: string;

  @Column()
  lastName!: string;

  @OneToMany(() => Post, (post=> post.user, { nullable: true })
  posts!: Post[];
}

Entity 폴더 안에 있는게 테이블 이라고 생각하면 된다.
User class를 예를들면 User 라는 테이블은 
id 라는 PK(값 자동증가)
firstName 이라는 notNull 문자열
lastName 이라는 notNull 문자열
Post라는 테이블을 여러개 가질수 있다
 
@OneToMany(() => Post, (post=> post.user, { nullable: true })
  posts!: Post[];

이 부분 해석이 그지같은데, 제작자가 이따구로 만들어서 어쩔수 없다
왼쪽부터 해석하자면 Post라는 Entity와 연관있다. post라는 별명을 지어줫다고 할시, post.user
와 관련있는 놈이다. null 허용하겠다
User entity 안에서는 Post의 자료들을 posts 라는 변수에 저장하고, 타입은 Post 배열이다.
 
@Column()
  userId!: number;

  @ManyToOne(() => User, (user=> user.posts, {
    onDelete: 'CASCADE',
    onUpdate: 'CASCADE',
  })
  @JoinColumn({ name: 'userId' })
  user!: User;

User 라는 Entity와 연관있다. 별명을 user라고 지을시, user.posts 라는 변수와 관련있다.
삭제, 업뎃할시 cascade(무경설 맞추기) 옵션을 적용 시키겠다.
userId라는 변수에 fk를 적용 시키고, User의 데이터를 user 라는 변수에 저장시키겠다.
 
 
.net 6 나오면 이 그지같은 쟈스 버릴수 있을거 같으니 좀만 더 존버하자....
( .net 프레임워크 에서는 entity 사용법이 더 쉽고 깔끔하다)
 
기본적으로 class 하나 만들고 상단에 Entity() 란 데코레이터 붙이고,
변수 명은 오른쪽에 ! 붙여주고(안붙이면 컴파일러가 멍청해짐)
@Column 디코레이터 붙여서 칼럼 정의해주면 된다.
 
칼럼에 필요한 요소들을 정의해주는건(최대 문자열 길이, 옵션 등등)은
https://typeorm.io/#/entities
여기서 일일히 찾아가면서 해야한다... 쩔수없다
 
 
ormconfig.js (프로젝트 최 상단부분. package.json과 같은 레벨)

const { configSettings } = require('./src/config/settings.ts');

//npm run typeorm migration:generate -- -n myname -o
//npm run typeorm migration:run
//npm run typeorm migration:revert
var dbConfig = {
  type: configSettings.typeOrmDb1.type,
  host: configSettings.typeOrmDb1.host,
  port: configSettings.typeOrmDb1.port,
  username: configSettings.typeOrmDb1.username,
  password: configSettings.typeOrmDb1.password,
  database: configSettings.typeOrmDb1.database,
  entities: [`dist/entity/**/*.js`],
  synchronize: configSettings.typeOrmDb1.synchronize,
  logging: configSettings.typeOrmDb1.logging,
  migrations: ['migration/*.js'], //migration 하고싶은 파일 명
  cli: {
    migrationsDir: 'migration',
  },
};

module.exports = dbConfig;
 
 
이놈이 뭘 하는 놈이냐면 typeorm 모듈을 설치하고 얘를 app.ts에서 사용할때
DB에 접속할때 필요한 정보들을 싹 모아놓은 곳이라고 생각하면 된다.
파일 이름과 경로를 완전히 필자가 말한대로 해줘야한다. 안그럼 못읽는다.
(요즘 프로그래밍 권장사항이 1서버당 1DB가 권장이라 1서버 : N DB연결은 생략하였다)
 
entities[]  요게 entity 파일들 먹여주는 건데, 
우리가 entity파일 만들어준 경로하고 틀린걸 알수있다.
왜그러냐면, 필자가 구축한 노드서버는 타입스크립트 기반이기때문에,
실제 컴터가 알아 먹을수 있는 언어 자바스크립트로 컴파일된 파일의 경로를 알려줘야 작동한다.
 
src 폴더는 타입스크립트 파일들,
dist 는 npm run serve 를 실행했을시, nodejs 가 알아서 번역한  
자바스크립트 파일들이 있고, 진짜 실무에서 서버 굴릴때는 dist 폴더안에 있느 파일들이 
작동하는 것이다.
 
dist폴더안에 있는 파일 하나라도 고치거나 지우면 ㅈㅈ 쳐야된다. 조심
 
 

src/app.ts

import * as express from 'express';

/** 서버 만드는 코드 */
const app: express.Express = express();
app.use(cors());
 
const http = require('http').createServer(app);
const cors = require('cors');
/** END */
 
/** typeorm db connection */
var mysql;
createConnection()
  .then((connection=> {
    console.log(`# connected typeorm1`);
    mysql = connection;
    app.set('mysql1'mysql);
  })
  .catch((error=> {
    console.log('!!! typeorm1 conn err: 'error);
    return new Error(error);
  });
/** END */
 
 /** 서버 실행 */
http.listen(8080function () {
    console.log('listening on 8080');
  });
 


/** typeorm db connection */ 이 부분 안에 있는게 DB 연결하는 핵심 코드다.
ormconfig.js 안에있는 값들을 싹 읽고, DB 연결을 시도한다.
실패하면 콘솔창에 에러뿜고, 
성공하면 콘솔창에 #connected typorm 이란 문구를 출력한다.
접속에 성공하고나면 var mysql 이 부분에 typeorm 객체 자체를 저장시키고,
app.set() 을 통해서 다른 경로의 파일들에서도 갔다 쓸수있게 저장시키는 코드다.
(mysql 이라고 지은 이유는 필자가 mysql 써서 그럼. postgre 나 mssql 쓰면 거기에 맞게 변수
이름 바꿔도 됨)

DB에 관한 정보를 바꾸고 싶다면 ormconfig.js 파일에 있는
 
var dbConfig = {
  type: ...
 
  요 안에 값을 바꾸면 되는데, 필자는 src/config/setting.ts 이곳에 값들을 다 몰아 넣었으니
 
if (ENV_MODE === 'dev') {
  typeOrmDb1.type = 'mysql';
  typeOrmDb1.host = '안.알.야.줌';
  typeOrmDb1.port = 3306;
  typeOrmDb1.username = '안.알.야.줌';
  typeOrmDb1.password = '안.알.야.줌';
  typeOrmDb1.database = '안.알.야.줌';
  typeOrmDb1.synchronize = false;
  typeOrmDb1.logging = false;

  mongoDBConnString = `안.알.야.줌`;
else {
  typeOrmDb1.type = 'mysql';
  typeOrmDb1.host = '안.알.야.줌';
  typeOrmDb1.port = 3306;
  typeOrmDb1.username = '안.알.야.줌';
  typeOrmDb1.password = '안.알.야.줌';
  typeOrmDb1.database = '안.알.야.줌';
  typeOrmDb1.synchronize = false;
  typeOrmDb1.logging = false;

  mongoDBConnString = `안.알.야.줌`;
}
 
이 값을 적절하게 바꿔주면 된다.
 
ENV_MODE === 'dev' 안에 있는 것들은 개발환경일때 값 셋팅
else 안에 있는 것들은 실제 서버에서 굴릴때 사용할 값,
개발말고 실무로 바꿔서 서버 구동할때는
const ENV_MODE = 'pro'
이런식으로 해주면 된다. 
(참고로 개발모드와 실무 모드로 굴리는법은 package.json 안에 있는 스타트 스크립트를
 NODE_ENV=production 이런식으로 실행하는 방법도 있는데,
실제 서버를 굴리는 장소를 azure app service로 하였고 (마소 문서에서 스타트 스크립트
운영법을 못찾겠음), 
각 클라우드 업체나 호스트 업체마다 지네 방식이
다 다르고 접근할수 있는 영역도 달라서 타입스크립트 안에서 모든걸 해결하도록 구현한 것이다) 
 
 

src/Router/typeorm/typeorm.route.ts


댓글

이 블로그의 인기 게시물

[AI Image]

[GameIdea] 2D

[토이강의] Blazor C# 으로 유튜브 동영상 나의 플레이리스트 만들기