1. typeorm과
MySQL을 사용하기 위해서는 MySQL 데이터베이스용 드라이버가 필요합니다.
TypeORM 공식 문서에서 MySQL을 사용할 때 추천하는 드라이버는 mysql2입니다. 따라서 Express.js와 TypeORM, MySQL 조합을 위해서는 다음과 같이 명령어를 입력합니다.
npm install typeorm
typeorm
: TypeScript 기반 ORM
2. reflect-metadata 설치
TypeORM은 TypeScript 데코레이터를 사용할 때 메타데이터를 저장하기 위해 reflect-metadata를 필요로 합니다. 이를 설치하고 프로젝트의 진입점에서 반드시 불러와야 합니다.
npm install typeorm reflect-metadata
3. 타입스크립트 설정
tsconfig.json 파일에서 experimentalDecorators와 emitDecoratorMetadata 옵션이 true로 설정되어 있는지 확인하세요.
{
"compilerOptions": {
// ... 다른 설정들 ...
"experimentalDecorators": true,
"emitDecoratorMetadata": true,
// ... 다른 설정들 ...
}
}
구성요소
- controller
- service
- entity
user.entity.ts
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn({ type: "int" })
id: number;
@Column({ type: "varchar" })
email: string;
@Column({ type: "varchar" })
name: string;
@Column({ type: "varchar", nullable: true })
phone: string;
@Column({ type: "varchar", nullable: true })
address: string;
@Column({ type: "varchar", nullable: true })
postcode: string;
@Column({ type: "timestamp", nullable: false })
createDate: Date;
constructor(
id: number,
email: string,
name: string,
phone: string,
address: string,
postcode: string,
createDate: Date
) {
this.id = id;
this.email = email;
this.name = name;
this.phone = phone;
this.address = address;
this.postcode = postcode;
this.createDate = createDate;
}
}
user-controller.ts
import express, { Request, Response } from "express";
const router = express.Router();
import { services } from "../services/user-services";
import { User } from "../entity/user.entity";
/**
* 회원가입 엔드포인트
*/
router.post("/user/create", async (req: Request, res: Response) => {
const body: User = req.body; // 요청 본문을 User 엔티티로 매핑합니다.
try {
const result = await services.createUser(body); // 사용자 생성
res.status(200).json(result); // 생성된 사용자 반환
} catch (error) {
console.log("컨트롤러 오류: ", error);
res.status(400).send(error);
}
});
// router를 export
export default router;
user-services.ts
import { AppDataSource } from "../database/mysql";
import { User } from "../entity/user.entity";
import { CustomError } from "../../util/error";
export const services = {
/**
* 회원가입
* @param
*/
createUser: async (body: User) => {
try {
const userRepository = AppDataSource.getRepository(User);
const newUser = userRepository.create(body);
const savedUser = await userRepository.save(newUser);
return savedUser;
} catch (error) {
const customError = error as CustomError; // Type assertion
throw { error: customError.code, message: customError.message };
}
},
};
Error
{
"error": "ER_NO_DEFAULT_FOR_FIELD",
"message": "Field 'name' doesn't have a default value"
}
Success
"Success"
'Study > Javascript | Typescript | Node.js' 카테고리의 다른 글
[node.js] express와 axios 차이 (0) | 2024.12.23 |
---|---|
[node.js] logger 파일 생성하기 (2) | 2024.12.21 |
[JS] 자바스크립트 함수2 (0) | 2024.12.15 |
[JS] 자바스크립트 함수1 (0) | 2024.12.15 |
[JS] 자바스크립트 기초 (0) | 2024.12.15 |