TypeORM & DB Connection

HS K·2022년 11월 12일
0

1-1. ORM의 개념
ORM : 객체지향 프로그래밍(Object-Oriented-Programming)과 관계형 데이터베이스(Relational-Database)사이의 호환되지 않는 데이터를 변환하는 기술

ORM은 관계형 데이터베이스의 2차원 테이블과 테이블 안에 저장된 행(data)을 애플리케이션의 Class와 인스턴스에 각각 매핑해주는 역할을 한다.
이러한 특징 덕분에 애플리케이션에서 프로그래밍 언어(e.g. javascript)만을 사용하여 선언한 Class와 Instance등으로 명령을 내리기에는 서로 연관성이 없어보였던 데이터베이스 내부 자료 속성에 접근할 수 있게 되었다.


장점)
(1) ORM을 사용하며 생기는 장점은 선언문, 할당, 종료 등과 같은 부수적인 코드가 사라짐으로써 개발의 생산성이 향상된다는 점입니다. 그리고 문법(Syntax) 실수 없이 잘 짜여진 SQL 쿼리문을 ORM의 힘을 빌려 사용하는 것이기 때문에 버그와 실수가 감소하게 되며, 개발자 친화적인 간결하고 직관적인 코드작성이 가능해집니다. 이로써 가독성 또한 높아지는 효과를 누릴 수 있습니다.

(2) 대부분의 ORM 서비스는 특정 RDBMS(예시; mysql)에만 종속되는 것이 아니라 다양한 데이터베이스에 유연하게 연결 될 수 있습니다.
따라서 개발자는 어떠한 데이터베이스 시스템을 선택했는지 상관없이 코드 속에서 다루어야 하는 데이터 객체 위주로 집중할 수 있는 이점이 있습니다.


단점)
(1) 미세한 수정 및 디버깅이 상대적으로 어려워지며, 복잡한 쿼리문 작성이 필요할 때는 ORM에서 미리 선언해 놓은 패턴에 따른 SQL 쿼리 명령만 내릴 수 있다는 점입니다.
(아마 내가 알기로는 터미널에서 table을 건드리게 되면 충돌이 일어나는 것으로 안다)
따라서 내가 의도한 목표치에 가장 가까운 지름길이 아닌 먼 길을 돌아가야하는 경우가 생길 수 있습니다.

(2) DB에 직접 명령을 내리지 않고 한단계 중간 단계를 거쳐가기 때문에 SQL Raw 쿼리문에 비해 실행 속도가 다소 느려질 수 있습니다.
왜냐하면 ORM은 데이터베이스 드라이버(mysqlclient, mysql2)를 한번 추상화(드라이버와 ORM 사이에 중간 수준)하고 이를 다시 한 번 추상화하는 고수준의 추상화 개념이 적용되기 때문입니다.

(3) RDBMS와의 데이터 관련 상호작용 내역을 Black Box(외부에서 쉽게 확인할 수 없게 숨기는 기능)로 만들어 버리기 때문에 내부에서 실제 어떤 쿼리를 실행하는지 파악하기 쉽지 않습니다. 그리고 경우에 따라서 2차원 테이블의 레코드를 1건만 읽어도 될 쿼리를 불필요하게 수 천, 수 만 레코드를 읽게하여 과도하게 많은 쿼리를 생성하는 경우도 발생할 수 있습니다.


1-2. SQL Raw Query > ORM
저희는 앞으로 ORM을 사용하지 않고 TypeORM에서 제공하는 데이터베이스 연결(풀링) 기능과 Raw Query만 사용하며 학습을 진행할 예정입니다. 이에 대한 상세한 이유는 다음과 같습니다.

(1) 데이터베이스와 컨넥션만 사용해서 직접 SQL 쿼리문을 작성하게되면, 내가 의도한 데이터 테이블이 어떠한 원리로 기능하는지 그 본연의 작동 원리를 이해하는데 용이합니다.
(2) 특정 ORM 학습에 오랜 시간을 들여서 익히게되면, 다른 ORM 사용할 때 또 다시 처음부터 익혀야하는 비용이 발생하게 됩니다. 하지만 모든 ORM의 근간인 SQL문을 완벽히 이해가 되면 다른 ORM을 도입할 때 그 진입장벽이 한층 낮아지게 됩니다.
(3) 복잡한 쿼리를 사용하는 경우 ORM은 비효율적일 수 있고, 고차원의 추상화 과정을 거친 시스템 특성상 성능 저하 이슈가 있을 수 있다.
(4) ORM은 만능 열쇠가 아닙니다. 우리가 의도하고자 하지만 ORM으로 표현 못 하는 쿼리가 존재합니다.


2. TypeORM 개념 및 사용법

2-1. TypeORM
Node와 RDBMS의 ORM 서비스에는 많은 라이브러리들이 시중에 출시 되었으며, 그 중 개발자들이 가장 애용하는 상위 3개 라이브러리는 sequelize, typeorm, prisma 입니다.

저희는 Javascript 뿐만 아니라 Typescript와의 호환에도 용이한, 보다 확장성에 유리한 TypeORM을 채택하여 학습을 진행하고 있습니다.
아울러, TypeORM에서 제공하는 다양한 ORM 기능에만 의존하지않고, mysql과 연결하여 직접 작성한 SQL Raw Query 문을 실행할 수 있게 DB 커넥터의 기능만을 활용하여 TypeORM을 사용하고 있습니다.

2-4. TypeORM - Database 연결

const dotenv = require("dotenv")

dotenv.config()


const { DataSource } = require('typeorm');
  1. dotenv를 사용할 수 있게 const { DataSource } = require('typeorm');를 작성
  2. const { DataSource } = require('typeorm');을 통해
    typeorm 모듈을 호출하여 그 중 DataSource 라는 key에 해당하는 value를 DataSource 라는 변수에 할당한다.

이후, .env 파일에 저장해놓은 환경 변수들을 불러와 DataSource 명령어를 통해서 db와의 커넥션 환경 세팅을 완료한다. 그리고 initialize() 메소드를 통해 실제 연결을 완료합니다.

profile
주의사항 : 최대한 정확하게 작성하려고 하지만, 틀릴내용이 있을 수도 있으니 유의!

0개의 댓글