๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ฐฑ์—”๋“œ/ORM

[TypeORM] TypeORM์—์„œ ํŠธ๋žœ์žญ์…˜ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•

 

 

TypeORM 0.3 ์ด์ƒ ๋ฒ„์ „์„ ๊ธฐ์ค€์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.

 

Transaction

  • ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ํ•œ๊บผ๋ฒˆ์— ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—… ๋‹จ์œ„๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜์˜ ์ค‘์š”ํ•œ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” ํŠธ๋žœ์žญ์…˜์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋ชจ๋‘ ๋ฐ˜์˜๋˜๋“ ์ง€, ์•„๋‹ˆ๋ฉด ์ „ํ˜€ ๋ฐ˜์˜๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ ์ž‘์—…์ด ๋ถ€๋ถ„์ ์œผ๋กœ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ์ค‘๋‹จ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (ACID ์ค‘ Atomicity, ์›์ž์„ฑ)

 

DataSource & EntityManager / QueryRunner

  • TypeORM์—์„œ๋Š” DataSource & EntityManager ๋˜๋Š” QueryRunner๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ธฐ์— ์•ž์„œ, TypeORM์—์„œ์˜ DataSource, EntityManager, QueryRunner ์„ธ ๊ฐ€์ง€ ์šฉ์–ด๋ฅผ ๋จผ์ € ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

DataSource

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ , connection๊ณผ connection pool์„ ์„ค์ •ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.
  • DataSource ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ initialize๋ฅผ ์‹คํ–‰ํ•˜๋ฉด connection๊ณผ connectioin pool ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์„ค์ •์ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.
  • ์ด๋Š” ํ•˜๋‚˜์˜ DBMS์— ๋Œ€ํ•ด ์ „์—ญ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.
import { DataSource } from "typeorm";

const AppDataSource = new DataSource({
  type: "mysql",
  host: "localhost",
  port: 3306,
  username: "test",
  password: "test",
  database: "test",
});

AppDataSource.initialize()
  .then(() => {
    console.log("Data Source has been initialized!");
  })
  .catch((err) => {
    console.error("Error during Data Source initialization", err);
  });

 

EntityManager

  • ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•ด ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” API์™€, ํ•œ๊บผ๋ฒˆ์— ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—…๋“ค์„ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๋ฉ”์„œ๋“œ(= transaction)๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋Š” ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ์˜ repository๋ฅผ ํ•œ ๊ณณ์— ๋ชจ์€ ๊ฒƒ๊ณผ ๊ฐ™์€ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • (์ฐธ๊ณ ) ํŠน์ • ์—”ํ‹ฐํ‹ฐ์— ๋Œ€ํ•ด ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด EntityManager๊ฐ€ ์•„๋‹ˆ๋ผ, dataSource.getRepository(User).findOneBy({ id: 1 }); ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 
import { DataSource } from "typeorm";
import { User } from "./entity/User";

const myDataSource = new DataSource(/*...*/);
const user = await myDataSource.manager.findOneBy(User, {
  id: 1,
});
user.name = "Umed";
await myDataSource.manager.save(user);
  • EntityManager๋Š” EntityMAnagerFactory๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.
    • DataSource ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ EntityManagerFactory์˜ create ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด EntityManager ์ธ์Šคํ„ด์Šค๊ฐ€ DataSource ์ธ์Šคํ„ด์Šค์˜ manager ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

EntityManagerFactory ํด๋ž˜์Šค

 

QueryRunner

  • ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํŠธ๋žœ์žญ์…˜์„ ์ง์ ‘์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • connection pool์„ ์ง€์›ํ•˜๋Š” RDBMS์˜ ๊ฒฝ์šฐ, connection pool์—์„œ ํ•˜๋‚˜์˜ connection์„ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค. QueryRunner ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค connection pool์—์„œ connection์„ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • connection pool์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š” DBMS์˜ ๊ฒฝ์šฐ DataSource ์ „์ฒด์—์„œ ํ•˜๋‚˜์˜ connection์„ ์‚ฌ์šฉํ•˜์—ฌ, QueryRunner ์ธ์Šคํ„ด์Šค๊ฐ€ ๊ฐ™์€ connection์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.
  • QueryRunner๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹ˆ๋ผ ์ธํ„ฐํŽ˜์ด์Šค์ด๊ณ , DBMS ๋งˆ๋‹ค์˜ ๊ตฌํ˜„์ฒด ํด๋ž˜์Šค๋“ค์ด ์กด์žฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์˜ํ•  ์ ์€ connection pool์—์„œ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฟผ๋ฆฌ ์ˆ˜ํ–‰ ํ›„์— connection์„ ๋ฐ˜๋‚ฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

TypeORM์˜ Transaction ์ „๋žต

1. DataSource & EntityManager Transaction

  • ์•ฑ์„ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํ•  ๋•Œ ์ƒ์„ฑํ•œ DataSource ์ธ์Šคํ„ด์Šค์˜ 1) transaction ๋ฉ”์„œ๋“œ ๋˜๋Š” 2) manager ํ”„๋กœํผํ‹ฐ์˜ transaction ๋ฉ”์„œ๋“œ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
await myDataSource.transaction(async (transactionalEntityManager) => {
  await manager.save(users[0]);
  await manager.save(users[1]);
});

// or

await myDataSource.manager.transaction(async (transactionalEntityManager) => {
  await manager.save(users[0]);
  await manager.save(users[1]);
});
  • TypeORM์˜ GitHub ์ฝ”๋“œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ๋‘ ๋ฉ”์„œ๋“œ๋Š” ์‚ฌ์‹ค ๊ฐ™์€ ์ผ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • DataSource ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ˆ˜ํ–‰๋˜๋Š” ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ, ์ƒˆ๋กœ์šด EntityManager๋ฅผ ์ƒ์„ฑํ•˜์—ฌ manager ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
    • DataSource ํด๋ž˜์Šค์˜ transaction ๋ฉ”์„œ๋“œ์—์„œ๋Š”, ํ˜„์žฌ DataSource ์ธ์Šคํ„ด์Šค์˜ manager ํ”„๋กœํผํ‹ฐ์˜ trasaction ๋ฉ”์„œ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • myDataSource.transaction()์œผ๋กœ ์ ‘๊ทผํ•˜๋“  myDataSource.manager.transaction์œผ๋กœ ์ ‘๊ทผํ•˜๋“ , ๊ฒฐ๊ตญ myDataSource.manager.transaction()์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (EntityManager ํด๋ž˜์Šค์˜ transaction ๋ฉ”์„œ๋“œ)

(์ขŒ) DataSource ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ํ•จ์ˆ˜ ๋‚ด๋ถ€ / (์šฐ) DataSource ํด๋ž˜์Šค์˜ transaction ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€

  • ์ฃผ์˜ํ•ด์•ผ ํ•  ์ ์€ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง€๋Š” EntityManager๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    • EntityManager ํด๋ž˜์Šค์˜ tranasction ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€๋ฅผ ์‚ดํŽด๋ณด๋ฉด, ์ƒˆ๋กœ์šด QueryRunner๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๋˜ํ•œ DataSource ํด๋ž˜์Šค์˜ createQueryRunner ๋ฉ”์„œ๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ€๋ณด๋ฉด, ํ˜„์žฌ DBMS ๋“œ๋ผ์ด๋ฒ„์— ๋งž๋Š” QueryRunner๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ƒ์„ฑ๋œ QueryRunner์˜ manager ํ”„๋กœํผํ‹ฐ์— ์ƒˆ๋กœ์šด EntityManager ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • dataSource.manager.trasaction()์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋Š” EntityManager๋Š”, DataSource์˜ manager ํ”„๋กœํผํ‹ฐ์— ํ• ๋‹น๋œ ์ „์—ญ EntityManager๊ฐ€ ์•„๋‹ˆ๋ผ QueryRunner์˜ EntityManager์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (์„œ๋กœ ๋‹ค๋ฆ„!)

EntityManager ํด๋ž˜์Šค์˜ tranasction ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€
DataSource ํด๋ž˜์Šค์˜ createQueryRunner ๋ฉ”์„œ๋“œ ๋‚ด๋ถ€

 

  • DataSource ๋˜๋Š” DataSource์˜ EntityManager์˜ ํŠธ๋žœ์žญ์…˜ ๋ฉ”์„œ๋“œ๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ˆ˜ํ–‰ํ•  ๊ฒฝ์šฐ, ๋‚ด๋ถ€์ ์œผ๋กœ QueryRunner๋ฅผ ์ƒ์„ฑํ•˜์—ฌ commit, rollback, connection ๋ฐ˜๋‚ฉ๊นŒ์ง€ ํ•ด์ฃผ๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

2. QueryRunner Transaction

  • ์ˆ˜๋™์œผ๋กœ QueryRunner๋ฅผ ์ƒ์„ฑํ•˜์—ฌ
    • ์ง์ ‘ SQL ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜, 
    • EntityManager API๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜,
    • ํŠธ๋žœ์žญ์…˜์„ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
const queryRunner = dataSource.createQueryRunner();

await queryRunner.connect();
// 1. ์ง์ ‘ SQL ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜
await queryRunner.query("SELECT * FROM users");
// 2. EntityManager API๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ฑฐ๋‚˜
const users = await queryRunner.manager.find(User);

// 3. ํŠธ๋žœ์žญ์…˜์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
await queryRunner.startTransaction();

try {
  // ํŠธ๋žœ์žญ์…˜ ์ž‘์—…๋“ค...
  await queryRunner.manager.save(user1);
  await queryRunner.manager.save(user2);

  // commit
  await queryRunner.commitTransaction();
} catch (err) {
  // ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด rollback
  await queryRunner.rollbackTransaction();
} finally {
  // ์ƒ์„ฑํ•œ QueryRunner ํ•ด์ฒด(connection ๋ฐ˜๋‚ฉ)
  await queryRunner.release();
}

 

 

๊ทธ๋ž˜์„œ ์–ด๋–ค ๊ฑธ ์“ฐ๋ผ๋Š” ๊ฒƒ์ธ๊ฐ€ !?

  • DataSource์˜ transaction ๋ฉ”์„œ๋“œ๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ์ง€๋งŒ, ์ง์ ‘์ ์œผ๋กœ ํŠธ๋žœ์žญ์…˜์„ ๋‹ค๋ฃฐ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • QueryRunner๋Š” ์ง์ ‘ ํŠธ๋žœ์žญ์…˜์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋งŽ์•„์ง€๊ณ  ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ์— ๋Œ€ํ•œ ์ฑ…์ž„์ด ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  • NestJS ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” TypeORM์˜ ํŠธ๋žœ์žญ์…˜์„ ๋‹ค๋ฃจ๋Š” ์ „๋žต ์ค‘ ์ง์ ‘ ํŠธ๋žœ์žญ์…˜์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” QueryRunner๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. [์ฐธ๊ณ ]
  • ๊ฐœ์ธ์ ์€ ์ƒ๊ฐ์œผ๋กœ๋Š” QueryRunner๋กœ ํŠธ๋žœ์žญ์…˜์„ ์ง์ ‘ ์ œ์–ดํ•˜๋˜, ์ค‘๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋ฆฌํŒฉํ„ฐ๋ง ๋ฐฉ๋ฒ•์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

(๋ฒˆ์™ธ) TypeORM์€ Connection์„ ์™œ DataSource๋กœ ๋ฐ”๊ฟจ์„๊นŒ?

  • TypeORM 0.2.x ๋ฒ„์ „์—์„œ Connection์€ 0.3.0 ๋ฒ„์ „๋ถ€ํ„ฐ deprecated ๋˜๊ณ , ์ง€๊ธˆ์˜ DataSource๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. [์ฐธ๊ณ ]
  • TypeORM ๊ฐœ๋ฐœ์ž๊ฐ€ ์˜ฌ๋ฆฐ issue๋ฅผ ๋ณด๋ฉด, Connection ์ด๋ผ๋Š” ์ด๋ฆ„์ด ์ ์ ˆํ•˜์ง€ ์•Š์œผ๋ฉฐ, DataSource ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ด์•ผ๊ธฐ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด์ „์˜ Connection ์ด๋ผ๋Š” ๋ช…์นญ์€ ์‹ค์ œ๋กœ connection์„ ์˜๋ฏธํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๊ทธ์ € DBMS ์—ฐ๊ฒฐ ์„ค์ •์— ๊ด€ํ•œ ๊ฐ์ฒด์ผ ๋ฟ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ connection์„ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ QueryRunner ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์™œ DataSource ์ผ๊นŒ?

  • Java์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” API์ธ JDBC(Java Database Connectivity)์— DataSource๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. DataSource ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ๊ณผ connection์„ ์–ป๋Š” ๊ณผ์ •์„ ์ถ”์ƒํ™”ํ•˜๋Š”๋ฐ, DataSource ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Spring์—์„œ๋Š” HikariCP connection pool์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ HikariDataSource๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • (์ฐธ๊ณ ) JPA์—๋„ EntityManager๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ์Šต๋‹ˆ๋‹ค. connection์„ ์–ป์–ด์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์ž…๋‹ˆ๋‹ค. TypeORM์—๋„ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ, 1์ฐจ ์บ์‹œ์˜ ๊ฐœ๋…์ด ์žˆ๋Š”์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ณต์‹๋ฌธ์„œ ์ƒ์—์„œ๋Š” ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์˜ ์—ญํ• (1์ฐจ ์บ์‹œ์— ์—”ํ‹ฐํ‹ฐ ์˜์†ํ™”)์„ ํ•˜๋Š” ๊ฐœ๋…์€ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • TypeORM์˜ ์—ฌ๋Ÿฌ ๊ฐœ๋…๋“ค์€ ์ƒ๋Œ€์ ์œผ๋กœ ์—ญ์‚ฌ๊ฐ€ ๋” ์˜ค๋ž˜๋œ Java์™€ JPA์—์„œ ๋งŽ์€ ๋ถ€๋ถ„ ์ฐจ์šฉํ•ด์„œ ๋งŒ๋“ค์–ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. NodeJS์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ORM ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜์ธ Prisma์—์„œ๋„ JPA, TypeORM์—์„œ์˜ DataSource์™€ ๊ฐ™์€ ์˜๋ฏธ๋กœ DataSource API๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ฐธ๊ณ