Skip to main content
getPuri๋Š” Puri ์ฟผ๋ฆฌ ๋นŒ๋”๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ง์ ‘ SQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ UpsertBuilder๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

ํƒ€์ž… ์‹œ๊ทธ๋‹ˆ์ฒ˜

๋งค๊ฐœ๋ณ€์ˆ˜

which

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ”„๋ฆฌ์…‹์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž…: DBPreset ("r" | "w")
  • "r": Read ์ „์šฉ (๋ณต์ œ DB, ์กฐํšŒ์šฉ)
  • "w": Write ๊ฐ€๋Šฅ (Primary DB, ์“ฐ๊ธฐ์šฉ)
"r"๊ณผ "w"๋Š” ๋™์ผํ•œ DB๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ค์ •์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๋ฐ˜ํ™˜๊ฐ’

ํƒ€์ž…: PuriWrapper Puri ์ฟผ๋ฆฌ ๋นŒ๋” ๋ž˜ํผ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

PuriWrapper ๋ฉ”์„œ๋“œ

table / from

ํ…Œ์ด๋ธ”์„ ์ง€์ •ํ•˜์—ฌ Puri ์ฟผ๋ฆฌ ๋นŒ๋”๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

transaction

ํŠธ๋žœ์žญ์…˜์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

UpsertBuilder ๋ฉ”์„œ๋“œ

ubRegister

UpsertBuilder์— ๋ ˆ์ฝ”๋“œ๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.

ubUpsert

๋“ฑ๋ก๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ Upsertํ•ฉ๋‹ˆ๋‹ค.

ubInsertOnly

๋“ฑ๋ก๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ Insert๋งŒ ํ•ฉ๋‹ˆ๋‹ค (UPDATE ์—†์Œ).

ubUpdateBatch

๋“ฑ๋ก๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ฐฐ์น˜ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

raw

Raw SQL์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

์ง์ ‘ ์ฟผ๋ฆฌ ์ž‘์„ฑ

๋ณต์žกํ•œ ์ฟผ๋ฆฌ

ํŠธ๋žœ์žญ์…˜ ์‚ฌ์šฉ

ํŠธ๋žœ์žญ์…˜ ์ปจํ…์ŠคํŠธ ์ž๋™ ๊ฐ์ง€

getPuri๋Š” ํŠธ๋žœ์žญ์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” @transactional ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๋™์ž‘ ์›๋ฆฌ

getPuri ๋ฉ”์„œ๋“œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค:
  1. DB.getTransactionContext()๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํŠธ๋žœ์žญ์…˜ ํ™•์ธ
  2. ํŠธ๋žœ์žญ์…˜์ด ์žˆ์œผ๋ฉด ํ•ด๋‹น ํŠธ๋žœ์žญ์…˜์„ ์žฌ์‚ฌ์šฉ
  3. ํŠธ๋žœ์žญ์…˜์ด ์—†์œผ๋ฉด ์ƒˆ๋กœ์šด PuriWrapper ์ƒ์„ฑ

@transactional ๋‚ด์—์„œ ์‚ฌ์šฉ

์ค‘์ฒฉ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ ์•ˆ์ „์„ฑ

์ด ๊ธฐ๋Šฅ ๋•๋ถ„์— ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•ด๋„ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  getPuri ํ˜ธ์ถœ์ด ๋™์ผํ•œ ํŠธ๋žœ์žญ์…˜์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
@transactional ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๊ฐ€ ์„ค์ •ํ•œ ํŠธ๋žœ์žญ์…˜ ์ปจํ…์ŠคํŠธ๋Š” ๋ชจ๋“  ํ•˜์œ„ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ์—์„œ ์ž๋™์œผ๋กœ ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” AsyncLocalStorage๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.
ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ getPuri๋กœ ์–ป์€ PuriWrapper์™€ wdb.transaction()์œผ๋กœ ์‹œ์ž‘ํ•œ ์ƒˆ๋กœ์šด ํŠธ๋žœ์žญ์…˜์€ ์„œ๋กœ ๋‹ค๋ฅธ ํŠธ๋žœ์žญ์…˜์ž…๋‹ˆ๋‹ค. ์ค‘์ฒฉ ํŠธ๋žœ์žญ์…˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ช…์‹œ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ „ ์˜ˆ์‹œ

getPuri vs getDB

getPuri

Puri ์ฟผ๋ฆฌ ๋นŒ๋” + UpsertBuilder๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

getDB

์ˆœ์ˆ˜ Knex ์ธ์Šคํ„ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ getPuri๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ํƒ€์ž… ์•ˆ์ •์„ฑ๊ณผ UpsertBuilder ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€

๊ฒฉ๋ฆฌ ์ˆ˜์ค€:
  • "read uncommitted"
  • "read committed" (PostgreSQL ๊ธฐ๋ณธ)
  • "repeatable read"
  • "serializable"

ํƒ€์ž… ์•ˆ์ •์„ฑ

Puri๋Š” ์™„์ „ํ•œ ํƒ€์ž… ์•ˆ์ •์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์˜์‚ฌํ•ญ

1. ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ตฌ๋ถ„

์ฝ๊ธฐ ์ž‘์—…์€ "r", ์“ฐ๊ธฐ ์ž‘์—…์€ "w"๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.

2. ํŠธ๋žœ์žญ์…˜ ์ปจํ…์ŠคํŠธ

@transactional ๋‚ด์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜์ด ์ž๋™์œผ๋กœ ๊ด€๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

3. UpsertBuilder๋Š” ํŠธ๋žœ์žญ์…˜ ํ•„์ˆ˜

์„ฑ๋Šฅ ์ตœ์ ํ™”

1. ์ธ๋ฑ์Šค ํ™œ์šฉ

2. SELECT ํ•„๋“œ ์ œํ•œ

3. ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ

๋‹ค์Œ ๋‹จ๊ณ„

Puri ์ฟผ๋ฆฌ ๋นŒ๋”

Puri ์ฟผ๋ฆฌ ์ž‘์„ฑ ๋ฐฉ๋ฒ•

UpsertBuilder

UpsertBuilder ์‚ฌ์šฉ ๊ฐ€์ด๋“œ

@transactional

ํŠธ๋žœ์žญ์…˜ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ

ํŠธ๋žœ์žญ์…˜

์ˆ˜๋™ ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ