
connection pool์ ์์ฑํ์ฌ ์ฌ์ฉ.createConnectionํจ์ ์ฌ์ฉ์ ์๋์ผ๋ก, ์ค์ ํ connection์ ์ฌ์ฉํ๋ค.TypeORM๊ณผ DB ์ฐ๊ฒฐ์๋ ๋ช๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ createConnection / createConnections ์ ์ฌ์ฉ์ด๋ค.
1๏ธโฃ createConnection : ๋จ์ผ connection ์์ฑ
import {createConnection, Connection} from "typeorm";
const connection = await createConnection({
type: "mysql",
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test"
});
โ๏ธ ๋จ์ผ url์์ฑ๊ณผ DB ํ์ ์ผ๋ก ์ฐ๊ฒฐ ๊ฐ๋ฅ
createConnection({
type: 'mysql',
url: 'mysql://root:1234@localhost/HongDB'
})
2๏ธโฃ createConnections : ์ฌ๋ฌ๊ฐ์ connection์์ฑ
โ๏ธ ์ฌ๋ฌ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ๊ทผํ๊ธฐ ์ํจ์ด๋ค.
import {createConnections, Connection} from "typeorm";
const connections = await createConnections([{
name: "default",
type: "mysql",
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test"
}, {
name: "test2-connection",
type: "mysql",
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test2"
}]);
3๏ธโฃ ์์ ๊ฐ์ ๋ฐฉ์์ ์ฌ์ฉ์๊ฐ ์ง์ DB์ฐ๊ฒฐ ์ ๋ณด๋ฅผ ์ ์ํ๊ณ createConnection()๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ DB์ ์ฐ๋ํ๋ ๋ฐฉ์์ด๋ค.
ํ๋ก์ ํธ ๋ฃจํธ์ ormconfig.json ํ์ผ์ ์์๊ฐ์ ์ ๋ณด๋ฅผ ์์ฑํ๋ฉด ์๋์ผ๋ก DB์์ ์ฐ๋์ด ์คํ๋๋ค.
// ormconfig.json
import {createConnection, createConnections, Connection} from "typeorm";
- const connection: Connection = await createConnection();
- const secondConnection: Connection = await createConnection("test2-connection");
- const connections: Connection[] = await createConnections();
// main.js
import {getConnection} from "typeorm";
const connection = getConnection();
const secondConnection = getConnection("test2-connection");
DB์์ ์ฐ๊ฒฐ์ด ๋๋ ์์ ์ ์ ์ดํ๊ณ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๋ฐ๋ก ์ฐ๊ฒฐ์ ๊ดํ ํด๋์ค๋ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง ์๋๋ค.
์ด ๊ธฐ๋ฅ์ ์ด๋ฏธ typeorm์ ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฆฌ์์ค ๋ญ๋น์ด๋ค.
ํ์ง๋ง ๋ง์ฝ ์ฌ์ฉ์ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ค.
์ด ๋ฐฉ๋ฒ ์ฌ์ฉ์ getConnection() ์ฌ์ฉ๋ถ๊ฐ.
ํด๋์ค ์์ฑํ connectionManager.get ์ด๋ ๊ฒ ์ฌ์ฉํด์ผ๋
// ex) connectionManager.js
import {getConnectionManager, ConnectionManager, Connection} from "typeorm";
const connectionManager = getConnectionManager();
const connection = connectionManager.create({
type: "mysql",
host: "localhost",
port: 3306,
username: "root",
password: "1234",
database: "HongDB",
});
await connection.connect(); // performs connection
Connection์ ์ฌ์ฉํ๋ค๋ ๊ฒ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ์ฌ ๋ฐ์ดํฐ๋ค์ ์กฐ์(CRUD)ํ๋ ํ์๋ฅผ ๋งํ๋ค.
Typeorm์ ์์ฑํ Connection์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผ, ๋ณดํต ์๋์ ๊ฐ์ ๋ฉ์๋๋ค์ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ด์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ๋ค.
1๏ธโฃ getManager()๋ฉ์๋(= Entity Manager()๋ฉ์๋)
getManager(Entity Manager)๋ฅผ ํตํด Entity๋ฅผ ์ ์ด(CRUD)ํ ์ ์๋ค.
import {getManager, getRepository} from "typeorm";
import {User} from "../entity/User";
export class UserController {
@Get("/users")
getAll() {
return getManager().find(User);
}
}
๋๋
import {getManager} from "typeorm";
import {User} from "./entity/User";
const entityManager = getManager(); // getManager()๋ฅผ entityManager๋ก ์ทจ๊ธ
const user = await entityManager.findOne(User, 1); // ๋ณ์ user์ id๊ฐ1์ธ ํ์ ์ ๋ณด ์
๋ ฅ
user.name = "Umed"; // ์ ๋ณด ๋ณ๊ฒฝ
await entityManager.save(user); // ๋ณ๊ฒฝ๋ ์ ๋ณด๋ฅผ ์ ์ฅ
2๏ธโฃ getRepository()๋ฉ์๋
getManager()๋ฉ์๋์ ์ ์ฌํ์ง๋ง ํน์ Entity๋ฅผ ํ์ ํ์ฌ ์์
์ ์ ํํ๋ค.
import {getManager, getRepository} from "typeorm";
import {User} from "../entity/User";
export class UserController {
@Get("/users/:id")
getAll(@Param("id") userId: number) {
return getRepository(User).findOne(userId);
}
}
๋๋
import {getRepository} from "typeorm";
import {User} from "./entity/User";
const userRepository = getRepository(User); // ์์
ํ ํน์ Entity ์ง์
const user = await userRepository.findOne(1); // ๋ณ์user์ id๊ฐ1์ธ ํ์ ์ ๋ณด ์ ์ฅ
user.name = "Umed"; // ์ ๋ณด ๋ณ๊ฒฝ
await userRepository.save(user); // ๋ณ๊ฒฝ๋ ์ ๋ณด ์ ์ฅ
โ๏ธ getManager()๋ฉ์๋์ getRepository()๋ฉ์๋์ ์ฐจ์ด์
getManager()๋ฉ์๋๋ ๋ชจ๋ Entity๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
๋ฐ๋ฉด, getRepository()๋ฉ์๋๋ ๋จ์ผ Entity๋ง์ ์ง์ ํ์ฌ ์ฒ๋ฆฌํ๋ค.
// getManager()๋ฉ์๋
const manager = getManager();
const user = manager.create(User);
// getRepository()๋ฉ์๋
const repository = connection.getRepository(User);
const user = repository.create();
๋ ๋ค๋ฅธ ์์๋ฅผ ์ดํด๋ณด์
// getManager()๋ฉ์๋
const manager = getManager();
manager.find(User);
// getRepository()๋ฉ์๋
getRepository(User).find();
3๏ธโฃ getConnection()๋ฉ์๋
๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๊ฒฐ์ ์ค์ ํ๋ฉด, getConnection๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฑ ์ด๋์๋ ์ฌ์ฉํ ์ ์๋ค.
ํด๋น ์ฐ๊ฒฐ์ ํตํด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ค์ ์ ์ด(CRUD)ํ๋ค.
// user.js
import {getConnection} from "typeorm";
import {User} from "../entity/User";
export class UserController {
@Get("/users")
getAll() {
return getConnection().manager.find(User);
}
}
getConnection()๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ Entity๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด(๋ฐ์ดํฐ๋ฅผ ์กฐ์)์๋์ ๊ฐ์ ๋ฐฉ์์ ์๊ตฌํ๋ค.
Find Options: getRepository()์ EntityManager()๋ query builder๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ๋๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ธฐ๋ณธ์ ์ธ find๊ธฐ๋ฅ์ด ์ ๊ณต๋๋ค. query builder: ํด๋น ๊ธฐ๋ฅ์ sql๋ฌธ์ ๋์ฒดํ์ฌ entity๋ฅผ ์ ์ดํ ์ ์๋๋ก ํ๋ค. const firstUser = await connection
.getRepository(User)
.createQueryBuilder("user")
.where("user.id = :id", { id: 1 })
.getOne();
.json, .js, .ts, .env, .yml .xml.import {createConnection} from "typeorm";
const connection = await createConnection();
1๏ธโฃ ๊ธฐ๋ณธ ์์ฑ๋ฒ (๋จ์ผ connection)
{
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "test",
"password": "test",
"database": "test"
}
2๏ธโฃ ๊ธฐ๋ณธ ์์ฑ๋ฒ (๋ค์ค connections)
[{
"name": "default",
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "test",
"password": "test",
"database": "test"
}, {
"name": "second-connection",
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "test",
"password": "test",
"database": "test"
}]
module.exports = {
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "test",
"password": "test",
"database": "test"
}
์ง์ ํ๊ฒฝ์ด ๊ฐ์ถฐ์ง ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ECMAScript moduleํ์์ ์ฌ์ฉํ ์ ์๋ค.
export default {
"type": "mysql",
"host": "localhost",
"port": 3306,
"username": "test",
"password": "test",
"database": "test"
}
TYPEORM_CONNECTION = mysql
TYPEORM_HOST = localhost
TYPEORM_USERNAME = root
TYPEORM_PASSWORD = admin
TYPEORM_DATABASE = test
TYPEORM_PORT = 3000
TYPEORM_SYNCHRONIZE = true
TYPEORM_LOGGING = true
TYPEORM_ENTITIES = entity/*.js,modules/**/entity/*.js
์ฌ์ฉ๊ฐ๋ฅํ Typeorm์ ํ๊ฒฝ๋ณ์ ๋ชฉ๋ก์ ์๋์ ๊ฐ๋ค.
TYPEORM_CACHE
TYPEORM_CACHE_ALWAYS_ENABLED
TYPEORM_CACHE_DURATION
TYPEORM_CACHE_OPTIONS
TYPEORM_CONNECTION
TYPEORM_DATABASE
TYPEORM_DEBUG
TYPEORM_DRIVER_EXTRA
TYPEORM_DROP_SCHEMA
TYPEORM_ENTITIES
TYPEORM_ENTITIES_DIR
TYPEORM_ENTITY_PREFIX
TYPEORM_HOST
TYPEORM_LOGGER
TYPEORM_LOGGING
TYPEORM_MAX_QUERY_EXECUTION_TIME
TYPEORM_MIGRATIONS
TYPEORM_MIGRATIONS_DIR
TYPEORM_MIGRATIONS_RUN
TYPEORM_MIGRATIONS_TABLE_NAME
TYPEORM_PASSWORD
TYPEORM_PORT
TYPEORM_SCHEMA
TYPEORM_SID
TYPEORM_SUBSCRIBERS
TYPEORM_SUBSCRIBERS_DIR
TYPEORM_SYNCHRONIZE
TYPEORM_URL
TYPEORM_USERNAME
TYPEORM_UUID_EXTENSION
๋ก์ง์ ๋ฐ๋ผ ormconfigํ์ผ์ ์ฌ์ ์ ํด์ผํ๋ ์ํฉ์ด ์์ ์ ์๋ค.
์ํฉ์ ๋ง์ถ์ด DB์ฐ๊ฒฐ ์ค์ ์ ๋ณด๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ ์ฉํ ์ ์๋ค.
const connectionOptions = await getConnectionOptions();
Object.assign(connectionOptions, { namingStrategy: new MyNamingStrategy() });
const connection = await createConnection(connectionOptions);
connection์ ๊ด๋ จ๋ ์ฆ, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ๋ ํ์์ ๊ด๋ จ๋ Typeorm์์ ์ ๊ณตํ๋ API๋ค์ ๋ํ์ฌ ์์๋ณด์.
๐ createConnection()
import {createConnection} from "typeorm";
const connection = await createConnection({
type: "mysql",
host: "localhost",
port: 3306,
username: "test",
password: "test",
database: "test"
});
๐ getConnection()
import {getConnection} from "typeorm";
const connection = getConnection();
๐ getRepository()
Connection๊ฐ์ฒด๋ฅผ ํตํด ์ฐ๊ฒฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ํน์ Entity๋ฅผ ๊ฐ์ ธ์ ์ ์ดํ ์ ์๋ค.
import {getRepository} from "typeorm";
const userRepository = getRepository(User);
const blogRepository = getRepository(Blog, "secondary-connection"); // ์ด๋ค Connection(๋ฐ์ดํฐ๋ฒ ์ด์ค)์์ ๊ฐ์ ธ์ฌ์ง ์ง์ ํ ์ ์๋ค.
๐