운좋게 기업에서 제안해준 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
이제 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와 상호작용하는 부분에 대한 내용은 밑의 링크에서 자세히 확인해 볼 수 있다.
'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 |