[260113] ํŠธ๋žœ์ ์…˜์ด๋ž€? (Transaction)

2026. 1. 13. 19:49ยทํ”„๋กœ๊ทธ๋ž˜๋ฐ
์ „๋ถ€ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ฉด ์•„์˜ˆ ์—†๋˜ ์ผ๋กœ ํ•˜๊ฑฐ๋‚˜ (All or Nothing)

 

 

ํŠธ๋žœ์ ์…˜์ด๋ž€ (Transaction) 

  • ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ์—…๋ฌด์˜ ์ตœ์†Œ ๋‹จ์œ„๋ฅผ ์˜๋ฏธํ•จ. 
  • ๊ฒฝ์ œ ํ™œ๋™์—์„œ์˜ ํŠธ๋žœ์ ์…˜์ด๋ž€, "๊ฐ€์น˜ ์žˆ๋Š” ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ์•ฝ์†์ด๋‚˜ ์‚ฌ๊ฑด"์„ ๋œปํ•จ. 
    • ๊ฐ€์น˜์˜ ๊ตํ™˜: ๋ˆ์„ ์ฃผ๊ณ  ์ปคํ”ผ๋ฅผ ๋ฐ›๊ฑฐ๋‚˜, ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ณ  ๋น„์šฉ์„ ์ง€๋ถˆํ•˜๋Š” ํ–‰์œ„
    • ๊ธฐ๋ก์˜ ์ƒ์„ฑ: ์˜์ˆ˜์ฆ, ์ธ๋ณด์ด์Šค, ์€ํ–‰ ๋ช…์„ธ์„œ ์ฒ˜๋Ÿผ "์ด๋Ÿฐ ์ผ์ด ์žˆ์—ˆ๋‹ค" ๋Š” ์ฆ๊ฑฐ(๊ธฐ๋ก)๋ฅผ ๋‚จ๊น€. 
    • ์žฌ๋ฌด์  ์˜ํ–ฅ: ๋ˆ์ด ์˜ค๊ฐ”์œผ๋‹ˆ ํšŒ๊ณ„ ์žฅ๋ถ€์— "์ž…๊ธˆ(debit)" ์ด๋‚˜ "์ถœ๊ธˆ(credit)" ์œผ๋กœ ๊ธฐ๋ก ๋˜์–ด์•ผ ํ•จ. 

์ปดํ“จํ„ฐ & ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—์„œ์˜ ์˜๋ฏธ 

  • ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ์ž‘์—…์„ ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ 

ํŠธ๋žœ์ ์…˜ ํ•ต์‹ฌ ์›์น™ 4๊ฐ€์ง€ (ACID)  

  1. ์›์ž์„ฑ (Atomicity) 
    • ์„ฑ๊ณตํ•˜๋ ค๋ฉด 100% ๋‹ค ์„ฑ๊ณตํ•ด์•ผ ํ•˜๊ณ , ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด 0% ์œผ๋กœ ๋˜๋Œ๋ ค์•ผ ํ•œ๋‹ค. 
    • ex) ๊ณ„์ขŒ์ด์ฒด : A ๊ฐ€ B ์—๊ฒŒ 1๋งŒ์› ์†ก๊ธˆํ• ๋•Œ, A ๊ณ„์ขŒ์—์„œ ์ถœ๊ธˆํ›„ B ๊ณ„์ขŒ ์ž…๊ธˆ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ ๋‘˜ ๋‹ค ์›์ƒํƒœ๋กœ ๋˜๋Œ๋ ค์•ผํ•จ. 
  2. ์ผ๊ด€์„ฑ (Consistency) 
    • ๋ฐ์ดํ„ฐ๋Š” ์–ธ์ œ๋‚˜ ์ •ํ•ด์ง„ ๊ทœ์น™(์ œ์•ฝ ์กฐ๊ฑด)์„ ์ง€์ผœ์•ผ ํ•œ๋‹ค 
      • ์˜๋ฏธ: ํŠธ๋žœ์ ์…˜์ด ์„ฑ๊ณต์ ์œผ๋กœ ๋๋‚˜๊ณ  DB ์˜ ๊ทœ์น™์€ ๋ณ€ํ•จ์—†์ด ์œ ์ง€ ๋˜์–ด์•ผ ํ•œ๋‹ค. 
  3. ๊ณ ๋ฆฝ์„ฑ (Isolation) 
    • ์—ฌ๋Ÿฌ ์ž‘์—…์ด ๋™์‹œ์— ์ผ์–ด๋‚˜๋„ ์„œ๋กœ ๋ฐฉํ•ดํ•˜์ง€ ์•Š๋Š”๋‹ค 
      • ์˜๋ฏธ: ์—ฌ๋Ÿฌ ํŠธ๋žœ์ ์…˜์ด ๋™์‹œ์— ์‹คํ–‰๋ ๋•Œ, ๋งˆ์น˜ ๊ฐ๊ฐ ํ˜ผ์ž์„œ ์‹คํ–‰๋˜๋Š”๊ฒƒ์ฒ˜๋Ÿผ ๊ฒฉ๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค. 
      • ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ผ๋•Œ ๋‹ค๋ฅธ ์ž‘์—…์ด ๊ทธ ์ค‘๊ฐ„ ๊ณผ์ •์„ ๋“ค์—ฌ๋‹ค๋ณด๊ฑฐ๋‚˜ ๊ฑด๋“œ๋ฆด ์ˆ˜ ์—†์Œ. 
  4. ์ง€์†์„ฑ (Durability) 
    • ์„ฑ๊ณตํ•œ ๊ธฐ๋ก์€ ์ ˆ๋Œ€๋กœ ์‚ฌ๋ผ์ง€์ง€ ์•Š๋Š”๋‹ค. 
      • ์˜๋ฏธ: ํŠธ๋žœ์ ์…˜์ด ์ผ๋‹จ "์„ฑ๊ณต(commit)"์œผ๋กœ ๋๋‚˜๋ฉด, ๊ทธ ๊ฒฐ๊ณผ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์˜๊ตฌ์ ์œผ๋กœ ๊ธฐ๋ก๋จ. 
      • ์ดํ›„ ์‹œ์Šคํ…œ ์žฅ์• ๊ฐ€ ๋‚˜๊ฑฐ๋‚˜ ์ „์›์ด ๊บผ์ง€๋”๋ผ๋„, ๊ธฐ๋ก์€ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด์กด๋จ.  

  ํŠธ๋žœ์ ์…˜ ์˜ˆ์‹œ 

  • ์ƒํ™ฉ
    • ์œ ์ €๊ฐ€ ๋‹ค์‹œ ๋กœ๊ทธ์ธ ํ•˜๋ฉด์„œ refresh token ์„ ์ƒˆ๋กœ ๋ฐœ๊ธ‰ ๋ฐ›์Œ. 
    • ์ด๋•Œ ๊ธฐ์กด ํ† ํฐ์„ ์‚ญ์ œ ํ›„ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์€ ํ† ํฐ์„ ์ €์žฅํ•ด์•ผํ•จ. 
    • ์ด๋ฅผ ํŠธ๋žœ์ ์…˜์œผ๋กœ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•œ๋‹ค. 
// 1. ํŠธ๋žœ์ ์…˜ ๊ตฌํ˜„ ์ „ (before) 
  // 1)๊ธฐ์กด Refresh Token ์‚ญ์ œ 
  await this.refreshTokenRepository.delete({ user_uuid: user.uuid });
  // 2) ์ƒˆ๋กœ์šด refresh token ์ €์žฅ
  await this.refreshTokenRepository.save({
    user_uuid: user.uuid,
    token_hash: refreshTokenHash,
    expired_at: new Date(refreshTokenExpiresAt), // Date ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ TIMESTAMPTZ์— ์ €์žฅ
  });
      
// 2. ํŠธ๋žœ์žญ์…˜ ๊ตฌํ˜„ ํ›„
// ํ•„์š” ์˜์กด์„ฑ: import { DataSource } from 'typeorm'; //
await this.dataSource.transaction(async (transactionalEntityManager) => {
  // 1) ๊ธฐ์กด Refresh Token ์‚ญ์ œ
  // ์ฃผ์˜: ํŠธ๋žœ์žญ์…˜ ๋‚ด๋ถ€์—์„œ๋Š” ๋ฐ˜๋“œ์‹œ 'transactionalEntityManager'๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ๊ป˜ ๋ฌถ์ž…๋‹ˆ๋‹ค.
  await transactionalEntityManager.delete(UserRefreshToken, { 
    user_uuid: user.uuid 
  });

  // 2) ์ƒˆ๋กœ์šด refresh token ์ €์žฅ
  await transactionalEntityManager.save(UserRefreshToken, {
    user_uuid: user.uuid, // ํ•„๋“œ๋ช…์€ DB ์„ค๊ณ„์— ๋งž์ถฐ user_uuid๋กœ ํ†ต์ผํ–ˆ์Šต๋‹ˆ๋‹ค.
    token_hash: refreshTokenHash,
    expired_at: new Date(refreshTokenExpiresAt),
  });
});

'ํ”„๋กœ๊ทธ๋ž˜๋ฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[260121] PostgreSQL ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ข…๋ฅ˜  (0) 2026.01.21
[260115] REST API ์™€ ๋ฌด์ƒํƒœ์„ฑ(state less)  (0) 2026.01.15
[260115] HTTP ๋ž€ (http ์ธ์ฆ, http ์‘๋‹ต ์ฝ”๋“œ ๋“ฑ)  (0) 2026.01.15
๋ฒ„์ „ ๊ด€๋ฆฌ๋ž€? Git ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ, Git๊ณผ GitHub ์ฐจ์ด  (0) 2025.11.16
'ํ”„๋กœ๊ทธ๋ž˜๋ฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [260121] PostgreSQL ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ข…๋ฅ˜
  • [260115] REST API ์™€ ๋ฌด์ƒํƒœ์„ฑ(state less)
  • [260115] HTTP ๋ž€ (http ์ธ์ฆ, http ์‘๋‹ต ์ฝ”๋“œ ๋“ฑ)
  • ๋ฒ„์ „ ๊ด€๋ฆฌ๋ž€? Git ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ, Git๊ณผ GitHub ์ฐจ์ด
jennnnna
jennnnna
  • jennnnna
    ๐Ÿ’ป๐Ÿ€Jennna's BLOG
    jennnnna
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (74) N
      • ์ปดํ“จํ„ฐ (1)
        • Operating system ์šด์˜์ฒด์ œ (8)
      • ํ”„๋กœ๊ทธ๋ž˜๋ฐ (5)
        • JAVA (6)
        • PHP (1)
        • Android (7)
        • Apache (1)
        • Python (0)
      • ๊ณต๋ถ€ (15)
        • ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ ๊ณต๋ถ€๊ธฐ๋ก (12)
        • TIL (3)
      • AI (2) N
      • TTS (1)
      • LLM (2)
      • RAG (1)
      • ์–ดํ•™ (5)
        • English (5)
        • Japanese (ๆ—ฅๆœฌ่ชž) (0)
      • ๊ธ€์“ฐ๊ธฐ (5)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์•ˆ๋“œ๋กœ์ด๋“œ๊ฐœ๋ฐœ
    CS์ง€์‹
    ์ž๋ฐ”๊ณต๋ถ€
    ์นดํŽ˜์•Œ๋ฐ”
    ๋ฌต์€์ง€์ฐธ์น˜๊น€๋ฐฅ
    ๋น„์ „๊ณต์žcs๊ณต๋ถ€
    ๋น„์ „๊ณต์ž๊ฐœ๋ฐœ์ž
    ์šด์˜์ฒด์ œ๊ณต๋ถ€
    ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌํ•„๊ธฐ
    ์ž๋ฐ”๊ณต์‹๋ฌธ์„œ
    ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
    ์ž๋ฐ”๋…ํ•™
    ์šด์˜์ฒด์ œ
    ์ •์ฒ˜๊ธฐ
    ์žฅ์ธํ•œ๊ณผ
    ์ •๋ณด์ฒ˜๋ฆฌ๊ธฐ์‚ฌ
    ์ž๋ฐ”๊ธฐ์ดˆ
    ์•ˆ๋“œ๋กœ์ด๋“œ
    cs๊ณต๋ถ€
    ์˜ค๋ธ”์™„
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
jennnnna
[260113] ํŠธ๋žœ์ ์…˜์ด๋ž€? (Transaction)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”