1. 설치 : nestjs, typeorm db드라이버(mssql, mysql... 등)
npm install @nestjs/typeorm typeorm mssql mysql...
npm install ts-node -g //옵션
2.
ormconfig.json 파일 생성 : typeorm 설정,
데이터 베이스 연결 정보를 정의 https://github.com/typeorm/typeorm/blob/master/docs/connection-options.md#cordova-connection-options
{
"type": "postgres",
"host": _DB_HOST_,
"port": _DB_PORT_,
"username": _DB_USER_,
"password": _DB_PASSWORD_,
"database": _DB_NAME_,
"extra": {
"ssl": {
"rejectUnauthorized": false
}
},
"synchronize": true, // 초기에 자동으로 sql table 생성
"logging": false,
"entities": [
"src/**/*.entity.ts" //중요
],
"migrations": [
"src/migration/**/*.ts"
],
"subscribers": [
"src/subscriber/**/*.ts"
],
"cli": {
"migrationsDir": "src/migration",
"subscribersDir": "src/subscriber"
}
}
3. entity를 선언 : nullable한 값은 ?, 필수적인 컬럼은 !, 관계가 있을 경우 설정
@Entity()
export class User extends BaseEntity {
@PrimaryGeneratedColumn()
id!: number;
@Column({ nullable: false })
firstName!: string;
@Column({ nullable: false })
lastName!: string;
@Column()
age?: number;
}
4. entity 관련 repository 선언 : repository가 실질적으로, user table에 대한 CRUD 메소드 소유 및 조작 가능 // src/user/user.repository.ts
import { EntityRepository, Repository } from "typeorm";
import { User } from "./user.entity";
@EntityRepository(User)
export class UserRepository extends Repository<User> {
}
5. entity 관련 module, service, controller 생성 : service, controller내에서, repository사용가능하도록 module 내에서, import
$ nest generate module user
$ nest generate service user
$ nest generate controller user
... user.module.ts
//src/user/user.dto.tsexport class UserDto { firstName!: string; lastName!: string; age?: number;
}
...import { UserRepository } from "./user.repository";@Injectable()export class UserService { constructor( @InjectRepository(User) private readonly userRepository: UserRepository ) { } createOneUser(createUserDto: UserDto) { return this.userRepository.create(createUserDto).save(); } getUserList() { return this.userRepository.find({ select: ["id", "firstName", "lastName", "age"], }); } getDetailUser(id: number) { return this.userRepository.findOne(id); } updateUser(id: number, updateUserDto: UserDto) { return this.userRepository.update(id, updateUserDto); } removeOneUser(id: number) { return this.userRepository.delete(id); }
}
8. Controller 내용 Api 작성 : 입력값은 Dto 형태로 받음, 결과값은 User.Entity 형태로 나감...import { UserService } from "./user.service";import { UserDto } from "./user.dto";
@Controller("users")export class UserController { constructor(private readonly userService: UserService) { } @Post() async create(@Body() createUserDto: UserDto) { const result = await this.userService.createOneUser(createUserDto); return result; } @Get() async getList() { const result = await this.userService.getUserList(); return result; } @Get(":id") async getOne(@Param("id") userId: number) { const result = await this.userService.getDetailUser(userId); return result; } @Put(":id") async setOne(@Param("id") userId: number, @Body() updateUserDto: UserDto) { const result = await this.userService.updateUser(userId, updateUserDto); return result; } @Delete(":id") async removeOne(@Param("id") userId: number) { const ret = await this.userService.removeOneUser(userId); return ret; }
}
출처 :
https://medium.com/@feedbotstar/nest-js-typeorm-postgresql-%EC%8B%9C%EC%9E%91%ED%95%98%EA%B8%B0-153c3a55aba1
Typeorm.json : 기본적인 형태, entities 속성 주읭
{
"type": "mssql",
"host": "localhost",
"port": 1433,
"username": "admin",
"password": "admin",
"database": "AdminDB",
"entities": ["dist/**/*.entity.js"],
"logging": true,
"synchronize": true
}
UserEntity.ts : User(1) : Books(N) 일 경우
// 1:n relation with bookEntity
@OneToMany( type => BookEntity , book => book.user)
//Book table내에서도 user에 대한 관계가 있을 경우 뒷부분 추가
//Book Table 내에서 역으로 User를 알필요가 없을 경우에는, 굳이 book에 user를 추가할 필요가 없다.
books: BookEntity[];
BookEntity.ts : Books(N) : User(1) 일 경우 / Books(N) : Genres(N) 일 경우
// n:1 relation with books
@ManyToOne(type => UserEntity, user => user.books) //User에 정의된 books와 같은 관계를 의미
user: UserEntity;
Similarly, to make a many-to-many relationship between BookEntity and GenreEntity, we have to add the following code:
// n:n relation with genre
@ManyToMany(type => GenreEntity) //내부적으로 새로운 테이블 생성이된다. Book_Genre_관계이름,
@JoinTable() //Genre는 Type일 뿐이고, Main은 Book에서 사용하므로, JoinTable
genres: GenreEntity[];
UserDto : 관계가 있을 경우
export default class CreateUserDto {
readonly name: string;
readonly books: number[] ;
}
BookDto : 관계가 있을 경우
export default class CreateBookDto {
readonly name: string;
readonly userID: number;
readonly genreIDs: number[];
}
GenreDto : 관계가 없이 기본일 경우
export default class CreateGenreDto {
readonly type: string;
}
BookService : 관계가 존재하는 Book에서, User값 넣기(User에 존재하는 값만 넣을 수 있음)
async insert(bookDetails: CreateBookDto): Promise<BookEntity> {
const { name , userID , genreIDs } = bookDetails;
const book = new BookEntity();
book.name = name;
book.user = await UserEntity.findOne(userID) ;
book.genres=[];
for ( let i = 0; i < genreIDs.length ; i++)
{
const genre = await GenreEntity.findOne(genreIDs[i]);
book.genres.push(genre);
}
await book.save();
return book;
}
UserController : User내에 있는 타테이블 관련 관계 속성값 불러오기
//'getBooks()' return all the books which are associated with the user
// provided through 'userID' by the request
@Get('books')
getBooks( @Body('userID', ParseIntPipe) userID: number ) {
return this.usersServices.getBooksOfUser(userID);
}
UserService : 관계가 존재하는 User의 개별 값 조회해오기
async insert(userDetails: CreateUserDto): Promise<UserEntity> {
const userEntity: UserEntity = UserEntity.create();
const {name } = userDetails;
userEntity.name = name;
await UserEntity.save(userEntity);
return userEntity;
}
async getBooksOfUser(userID: number): Promise<BookEntity[]> {
console.log(typeof(userID));
const user: UserEntity = await UserEntity.findOne({where: {id: userID}, relations: ['books']});
return user.books;
}
출처 :
https://codersera.com/blog/typeorm-with-nest-js-tutorial/
Swagger Ui 추가
npm install --save @nestjs/swagger swagger-ui-express
import { ApiProperty } from '@nestjs/swagger';
export class CreateTodoDto {
@ApiProperty()
readonly id: number;
@ApiProperty()
readonly text: string;
@ApiProperty()
readonly complete: boolean;
}
출처 :
https://codebrains.io/nestjs-with-typeorm-building-a-rest-api/
# nest.js를 heroku 서비스를 통해 배포할 경우, heroku postgres db와 연동하는 법
https://dev.to/baharajr/deploying-a-nestjs-app-with-typeorm-postgresql-on-heroku-55n1
'[DEV] App Dev ∕ Web Front > Framework ∕ Angular' 카테고리의 다른 글
Angular Akita 기본 구조 (0) | 2020.10.30 |
---|---|
상태관리가 굳이 필요할까? (0) | 2020.10.22 |
기초 Tip 기록 (0) | 2020.09.21 |
Service에 대하여 (0) | 2020.09.04 |
[예제로 배우는 Angular] 재사용가능한 Component - avatar image (0) | 2020.09.01 |
최근댓글