본문 바로가기

project

Final Project: 1주차 (typeORM 초기환경 설정)

운좋게 기업에서 제안해준 4주짜리 프로젝트에 참여하게 되었다.

이미 있는 어플리케이션에 어떤 이벤트들을 추가할 수 있는 관리자 페이지를 만드는 프로젝트인데, 기능들을 구현하는것 자체는 크게 어렵지 않을것 같았다.

하지만 역시나.. 초기 환경설정에서 많은 애를 먹었다. 

이 프로젝트에서는 백엔드를 맡게 되었는데 처음 사용해보는 typescript, typeORM, tslint등등 잘 알지 못하는 것들을 한번에 익혀서 초기환경을 설정하려니 어떤부분이 잘못된것인지 파악하는것이 쉽지 않았다.

 

먼저 node.js의 express에서 typeORM을 사용할 수 있도록 설정하는 과정에 대해 기록해놓으려 한다.

가장먼저 프로젝트에 typescript를 설치해야한다.

 

npm install -D typescript

 

그 후 tsconfig.json파일의 옵션들을 설정해주어야 하는데, tsconfig.json파일은 터미널에 tsc -init 명령어를 치거나, 직접 루트디렉토리에 파일을 생성해주어도 된다. 터미널에 직접 위의 형식으로 명령어를 치려면 typescript를 global로 설치해야 된다.

tsconfig.json은 다음과 같이 옵션을 지정해 주었다.

 

{
  "compilerOptions": {
    "lib": ["es5", "es6", "dom"],
    "target": "es5",
    "module": "commonjs",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true
  }
}

 

이제 express를 설치하여 적용해 볼것이다.

먼저 다음과 같은 package들을 설치한다. @types/... 형식의 package는 해당 패키지를 타입스크립트환경에서 사용할때 필요한 패키지이다.

 

npm install express body-parser @types/express @types/body-parser --save

 

다음으로 루트디렉토리에 src폴더를 만들고 app.ts라는 파일을 만든다.

src/app.ts 파일 :

 

import * as express from "express";
import {Request, Response} from "express";
import * as bodyParser from  "body-parser";

const app = express();
app.use(bodyParser.json());

app.listen(3000);

 

이제 typeORM을 적용해보겠다.

다음과 같은 패키지를 설치한다. db는 mysql을 사용할 것이다.

 

npm install typeorm mysql reflect-metadata --save

 

db와의 연결에 대한 설정을 할 수 있는 ormconfig.json파일을 만들어서 다음과 같이 작성한다.

 

{
    "type": "mysql",
    "host": "localhost",
    "port": 3306,
    "username": "test",
    "password": "test",
    "database": "test",
    "entities": ["src/entity/*.ts"],
    "logging": true,
    "synchronize": true
  }

 

이 옵션들에 대한 자세한 내용은 밑의 링크에서 확인할 수 있다.

https://github.com/typeorm/typeorm/blob/master/docs/connection-options.md

 

typeorm/typeorm

ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, SAP Hana, WebSQL databases. Works in NodeJS, Browser, Ionic, Cordova and Elect...

github.com

이제 User라는 entity(테이블)을 정의해 보겠다.

src/entity/User.ts 

 

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

@Entity()
export class User {

    @PrimaryGeneratedColumn()
    id: number;

    @Column()
    firstName: string;

    @Column()
    lastName: string;

}

 

다음으로 실제로 서버를 구동시켰을 때 db와 연결될 수 있도록 app.ts파일을 수정한다.

 

import * as express from "express";
import {Request, Response} from "express";
import * as bodyParser from  "body-parser";
import {createConnection} from "typeorm";
import {User} from "./entity/User";

// create typeorm connection
createConnection().then(connection => {
    const userRepository = connection.getRepository(User);

    // create and setup express app
    const app = express();
    app.use(bodyParser.json());

    // register routes

    app.get("/users", async function(req: Request, res: Response) {
        const users = await userRepository.find();
        res.json(users);
    });

    app.get("/users/:id", async function(req: Request, res: Response) {
        const results = await userRepository.findOne(req.params.id);
        return res.send(results);
    });

    app.post("/users", async function(req: Request, res: Response) {
        const user = await userRepository.create(req.body);
        const results = await userRepository.save(user);
        return res.send(results);
    });

    app.put("/users/:id", async function(req: Request, res: Response) {
        const user = await userRepository.findOne(req.params.id);
        userRepository.merge(user, req.body);
        const results = await userRepository.save(user);
        return res.send(results);
    });

    app.delete("/users/:id", async function(req: Request, res: Response) {
        const results = await userRepository.delete(req.params.id);
        return res.send(results);
    });

    // start express server
    app.listen(3000);
});

 

이렇게 수정후에 서버를 구동시키면 ormconfig.json에서 설정해놓은 db와 연결되며 서버가 켜지는 것을 확인할 수 있다.

만약 router등을 사용하여 다른 파일에서 db와의 동작을 정의하려면

다음과같이 getConnection을 사용하여 정의할 수 있다.

 

import {getConnection} from "typeorm";
import {User} from "./entity/User";

export function UsersListAction(req: Request, res: Response) {
    return getConnection().getRepository(User).find();
}

 

또는 getRepository를 사용하면 좀 더 간편하게 사용할 수 있다.

 

import {getRepository} from "typeorm";
import {User} from "./entity/User";

export function UsersListAction(req: Request, res: Response) {
    return getRepository(User).find();
}

 

db와 상호작용하는 부분에 대한 내용은 밑의 링크에서 자세히 확인해 볼 수 있다.

https://typeorm.io/#/

 

TypeORM - Amazing ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server,

 

typeorm.io

 

'project' 카테고리의 다른 글

Final Project 3주차 (typeorm-seeding)  (0) 2020.03.28
Final Project: 2주차 (Deploy)  (0) 2020.03.21
Final Project: 2주차 (multer-s3)  (0) 2020.03.21
Final Project: 1주차 (testcase 환경설정)  (0) 2020.03.15
First Project : My Type  (0) 2020.03.07