2024-03-18 22:53:46

ORM이란?

Object-Relational Mapping의 약자로 관계형 데이터베이스와 객체 지향 프로그래밍 언어 간의 호환성 문제를 해결하기 위해 사용됩니다.

두 모델의 차이를 객체-관계 불일치라고 하며 이런 불일치를 ORM이 해결해줍니다.

 

ORM의 장점

생산성 : 코드의 양이 감소하고 테이블을 클래스로 매핑하여 반복적이고 수동적인 연산 코드를 줄여줍니다.

자동화된 스키마 마이그레이션 : 일부 ORM 도구는 모델 변경 시 데이터베이스 스키마를 자동으로 업데이트하는 기능을 제공합니다.

유지보수성 향상 : 데이터베이스 작업을 객체와 메소드를 사용하여 수행함으로써 코드의 가독성과 유지보수성이 향상됩니다. 또한 재사용 가능한 모델과 비즈니스 로직의 캡슐화로 인해 코드의 중복성이 줄어듭니다.

기술 독립성 : 데이터베이스를 변경하더라도 모델 계층에는 큰 영향을 주지 않으며 시스템 간 이식성이 향상됩니다.

DBMS 기능 추상화 : 다양한 데이터베이스 시스템의 특정 기능들을 추상화함으로써 개발자는 데이터베이스의 복잡성을 신경 쓰지 않고 비즈니스 로직에 집중 할 수 있습니다.

지연 로딩 : 객체가 실제로 필요할 때까지 데이터 로딩을 지연시켜 불필요한 데이터베이스 접근을 줄입니다.

캐싱 : 반복적인 쿼리 결과를 캐싱하여 성능을 향상 킬 수 있습니다.

컴파일 시간 검증 : ORM을 사용하면 데이터베이스 스키마와 애플리케이션 코드 간의 불일치를 컴파일 시간에 발견할 수 있어 런타임 에러의 가능성을 줄일 수 있습니다.

 

ORM의 단점

쿼리 최적화의 어려움 : ORM을 사용하면 복잡한 쿼리가 생성될 수 있으며 이는 데이터베이스 성능 저하로 이어질 수 있습니다.

추가 계층의 복잡성 : ORM을 사용하면 애플리케이션과 데이터베이스 사이에 추가 계층이 생성됩니다. 이로 인해 디버깅이 어려워질 수 있습니다.

유연성 부족 : 특정 데이터베이스 기능이나 최적화를 필요로하는 복잡한 쿼리를 구현하기 어려울 수 있습니다.

메모리 사용량 및 CPU 사용량 증가 : ORM을 사용하면 객체 인스턴스 생성, 캐싱, 쿼리 분석 등 추가적인 작업이 수행되기 떄문에 애플리케이션의 런타임 오버헤드를 증가시키며 특히 대규모 시스템에서는 성능에 부정적인 영향을 미칠 수 있습니다.

 

postgreSQL 설치

이번 실습에선 postgreSQL을 사용하기 때문에 postgreSQL은 별도로 설치하여야 합니다.

https://www.postgresql.org/download/

 

PostgreSQL: Downloads

 

www.postgresql.org

 

sample 테이블 생성

// 실습은 터미널에서 이루어집니다.

// postgres 접속
// 처음 접속하면 비밀번호를 설정하라고 나올겁니다.
psql -U postgres

// 데이터베이스 생성
create database sample_db;

// 생성된 데이터베이스 확인
\list

 

sample_db 생성 확인

 

패키지 설치

npm install --save @nestjs/typeorm typeorm pg

 

typeORM 설정

이번 시간에는 typeORM을 사용하여 데이터베이스와 연결이 됬는지, 연결이 됬을 경우 테이블 생성까지 실습해보겠습니다.

 

// users.entity.ts
import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

// @Entity 데코레이터를 사용하여 이 클래스가 데이터베이스 테이블에 매핑되는 엔티티임을 선언
@Entity('user')
export class User {
  // @PrimaryGeneratedColumn 데코레이터는 이 필드가 기본 키이며 자동으로 생성되는 값을 의미
  @PrimaryGeneratedColumn()
  id: number;
  // @Column 데코레이터는 일반 컬럼을 의미
  @Column()
  username: string;

  @Column()
  password: string;
}

 

// users.module.ts
import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './user.entity';
import { UsersController } from './users.controller';

@Module({
  // TypeOrmModule.forFeature 메소드를 사용하여 이 모듈에서 User entity를 사용하도록 설정
  imports: [TypeOrmModule.forFeature([User])],
  controllers: [UsersController], // UsersController를 이 모듈의 컨트롤러로 등록
  providers: [UsersService], // UsersService를 이 모듈의 서비스로 등록
  exports: [UsersService], // UsersService를 다른 모듈에서 사용할 수 있도록 내보냄
})
export class UsersModule {}

 

// app.module.ts
import { Module, NestModule } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UsersModule } from './users/users.module';

@Module({
  imports: [
    TypeOrmModule.forRoot({ // typeORM 설정
      type: 'postgres', // 사용하는 데이터베이스 타입
      host: 'localhost',
      port: 5432, // postgres는 5432번 포트를 사용
      username: 'postgres',
      password: 'posegres',
      database: 'sample_db', // 사용할 데이터베이스 이름
      entities: [__dirname + '/**/*.entity{.ts,.js}'], // Entity 파일을 찾는 설정
      synchronize: true, // 애플리케이션 실행 시 데이터베이스 스키마를 자동으로 동기화
    }),
    UsersModule,
  ], // 해당 모듈에서 사용할 다른 모듈을 나열
  controllers: [AppController], // 해당 모듈이 인식해야하는 컨트롤러를 나열
  providers: [AppService], // 해당 모듈에서 사용할 서비스를 나열
})

export class AppModule {}

 

생성된 테이블 확인

// psql 접속
psql -U postgres

// 데이터베이스 목록 출력
\list

// 데이터베이스 선택
\c sample_db;

// 데이터베이스 내의 테이블 목록 출력
\dt

프로젝트를 실행하면 sample_db 데이터베이스에 user 테이블이 생성된것을 확인 할 수 있습니다.

 

 

기존 Nodejs를 사용하여 프로젝트를 진행할때 Sequelize ORM을 사용하여 프로젝트를 진행하였는데 그거에 비해 초기 설정 방법이 너무 쉬운거 같아 마음에 듭니다. 이번 실습을 진행하며 module에 대해 다시 정리해 봐야할 필요성을 느꼈습니다.

728x90

'Nestjs' 카테고리의 다른 글

[NestJs] 로그인 기능 구현  (0) 2024.03.23
[NestJs] Repository 패턴 사용해보기  (0) 2024.03.20
[NestJs] Middleware 알아보기  (1) 2024.03.15
[NestJs] Interceptors 알아보기  (0) 2024.03.14
[NestJs] Guards 알아보기  (0) 2024.03.13