ORM 이란
ORM이란 Object Relation Mapping 의 약자로서 객체를 데이터베이스 로 매핑해주는 것을 말한다. 객체 지향 프로그래밍 언어에서의 클래스가 데이터베이스의 테이블에 매핑된다.
- 객체와 데이터베이스 매핑 예
객체 클래스 : 데이터베이스 테이블
객체 속성 : 데이터베이스 컬럼
MyBatis ORM 이란
MyBatis ORM은 자바에서 사용되는 ORM인데, 유독, 우리나라에서 JPA보다 MyBatis ORM 이나 iBatis ORM을 현업에서 많이 사용하고 있다. xBatis는 대부분의 비즈니스 로직을 쿼리에 의존한다. 여기서 비즈니스 로직이란 생성, 수정, 삭제, 읽기를 말하며 객체의 속성을 데이터베이스 테이블의 속성으로 변경하여 insert, update, delete, select 쿼리문으로 변환하게 된다.
데이터베이스를 잘 알고 있다면 동적쿼리문만 배우면 되므로 쉽게 접근할 수 있다는 장점이 있지만, 만일 데이터베이스를 2개 이상 지원하도록 개발한다면 데이터베이스마다 고유한 쿼리문을 개별로 개발해야 하는 단점이 존재한다.
typeORM 소개
NodeJS로 REST API를 만드는건 좋은 선택이 아니었다. 하지만 자바의 JPA 방식을 도입해서 노드에서 sequlize를 만들었고 typescript 버전인 typeORM이 등장함으로써 NodeJS에서도 DB 연동이 쉬워졌다.
JPA 혹은 typeORM의 가장 중요한 개념은 DB를 직접 다루는게 아니라 객체를 다룬다는 것이다. 새로운 객체를 생성하면 typeORM이 insert 구문을 자동으로 생성해준다. 객체의 속성을 변경하고 저장하면 update 구문을 자동으로 생성해준다.
여기서 소개하는 typeorm은 JPA 계열이다. 먼저 환경 설정을 해보겠다.
https://typeorm.io 사이트를 참고하여 설정한다.
세가지 라이브러리를 설치한다. MariaDB를 사용하므로 mysql2도 설치해야 한다.
1 2 |
npm i -S typeorm reflect-metadata mysql2 npm i -D @types/node |
tsconfig.json에 emitDecoratorMetadata, experimentalDecorators 두 라인을 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "compilerOptions": { "module": "commonjs", "esModuleInterop": true, "target": "es6", "moduleResolution": "node", "sourceMap": true, "outDir": "dist", "emitDecoratorMetadata": true, "experimentalDecorators": true }, "lib": ["es2015"] } |
ormconfig.json 환경화일을 추가한다.
host, port, username, password, database 는 각자 맞게 설정한다. 여기서는 앞에서 구축한 docker 기반 MariaDB 정보를 사용하였다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{ "type": "mysql", "host": "localhost", "port": 3306, "username": "eastflag", "password": "12345678", "database": "eastdb", "synchronize": true, "logging": false, "entities": [ "src/entity/**/*.ts" ], "migrations": [ "src/migration/**/*.ts" ], "subscribers": [ "src/subscriber/**/*.ts" ] } |
synchronize는 엔티티 정보로 DB를 동기화하겠느냐는 옵션이다. 개발시에는 true로 설정하되 운영에서는 false로 해야 한다. 잘못하면 운영 DB 데이터가 통째로 날라갈 수 있다.
여기까지가 ormconfig.json의 기본 설정이다. 그런데 이 기본설정은 camel case이다.
데이터베이스에 따라서 대문자와 소문자를 구분하는 경우가 있고 안하는 경우가 있다. typeORM은 기본적으로 컬럼명을 그대로 테이블로 만들기 때문에 camel case가 적용된다. 즉, 컬럼명을 createdAt 이라고 했다면 테이블명도 동일하게 만들어진다. 이것을 created_at 이라고 kebab case로 바꿀려면 다음 모듈을 설치한다.
1 |
npm i -S typeorm-naming-strategies |
ormconfig.json 화일을 ormconfig.js로 수정하고 아래와 같이 적용한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
const SnakeNamingStrategy = require("typeorm-naming-strategies").SnakeNamingStrategy module.exports = { "type": "mysql", "host": "localhost", "port": 3306, "username": "eastflag", "password": "12345678", "database": "eastdb", "synchronize": true, "logging": false, "entities": [ "src/entity/**/*.ts" ], "migrations": [ "src/migration/**/*.ts" ], "subscribers": [ "src/subscriber/**/*.ts" ], namingStrategy: new SnakeNamingStrategy() } |
index.ts에 DB 연결을 설정한다.
1 2 3 4 5 6 7 8 9 10 |
import express from 'express'; import {createConnection} from "typeorm"; ... createConnection().then(connection => { app.listen(8080, () => { console.log('server is listening 8080'); }); }); |
실행을 하게 되면 데이터베이스 접속을 하고 웹서버를 실행한다.