Skip to Content

๋ฌธ์ œ ํ•ด๊ฒฐ

StudioGo ์šด์˜ ์ค‘ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ

๋กœ๊ทธ์ธ ์‹คํŒจ

์ฆ์ƒ

์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ํƒญํ•ด๋„ ๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์›์ธ ๋ฐ ํ•ด๊ฒฐ

์›์ธ์ฆ์ƒํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
์นด์นด์˜ค ๊ณ„์ • ๋ฏธ์—ฐ๋™โ€์นด์นด์˜ค ๊ณ„์ •์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”โ€ ๋ฉ”์‹œ์ง€์นด์นด์˜คํ†ก ์•ฑ์—์„œ ๊ณ„์ • ๋กœ๊ทธ์ธ ์ƒํƒœ ํ™•์ธ
์นด์นด์˜คํ†ก ๋ฏธ์„ค์น˜ (๋ชจ๋ฐ”์ผ)์นด์นด์˜ค ๋กœ๊ทธ์ธ ํ™”๋ฉด์ด ์›น์œผ๋กœ ์—ด๋ฆผ์นด์นด์˜คํ†ก ์•ฑ ์„ค์น˜ ํ›„ ์žฌ์‹œ๋„
๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜โ€๋„คํŠธ์›Œํฌ ์˜ค๋ฅ˜โ€ ๋˜๋Š” ๋ฌดํ•œ ๋กœ๋”ฉWi-Fi/๋ชจ๋ฐ”์ผ ๋ฐ์ดํ„ฐ ํ™•์ธ ํ›„ ์žฌ์‹œ๋„
OAuth ํ† ํฐ ๋งŒ๋ฃŒ์ž๋™ ๋กœ๊ทธ์ธ ์‹คํŒจ ํ›„ ์žฌ๋กœ๊ทธ์ธ ์š”๊ตฌ์ •์ƒ ๋™์ž‘. ์นด์นด์˜ค ๊ณ„์ •์œผ๋กœ ์žฌ๋กœ๊ทธ์ธ
์•ฑ ๋ฒ„์ „ ๋ฏธ์ง€์›โ€์•ฑ์„ ์—…๋ฐ์ดํŠธํ•ด์ฃผ์„ธ์š”โ€ ๋ฉ”์‹œ์ง€์•ฑ์Šคํ† ์–ด/ํ”Œ๋ ˆ์ด์Šคํ† ์–ด์—์„œ ์ตœ์‹  ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ
์„œ๋ฒ„ ์ ๊ฒ€ ์ค‘โ€์„œ๋ฒ„ ์ ๊ฒ€ ์ค‘์ž…๋‹ˆ๋‹คโ€ ๋ฉ”์‹œ์ง€๊ณต์ง€ ํ™•์ธ ํ›„ ์ ๊ฒ€ ์ข…๋ฃŒ ์‹œ ์žฌ์‹œ๋„

์šด์˜์ž ์กฐ์น˜

์‚ฌ์šฉ์ž๊ฐ€ ์ง€์†์ ์œผ๋กœ ๋กœ๊ทธ์ธ์— ์‹คํŒจํ•œ๋‹ค๊ณ  ๋ณด๊ณ ํ•˜๋ฉด ๋‹ค์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

  1. Hono API ์„œ๋ฒ„ ์ƒํƒœ ํ™•์ธ (Vercel ๋Œ€์‹œ๋ณด๋“œ)
  2. ์นด์นด์˜ค ๊ฐœ๋ฐœ์ž ์ฝ˜์†”์—์„œ OAuth ์„ค์ • ํ™•์ธ (Redirect URI, ์•ฑ ํ‚ค)
  3. Neon DB ์—ฐ๊ฒฐ ์ƒํƒœ ํ™•์ธ

์Šฌ๋กฏ ์ถฉ๋Œ

์ฆ์ƒ

BJ๊ฐ€ ๊ฐ€์šฉ ์ƒํƒœ์˜ ์Šฌ๋กฏ์„ ์„ ํƒํ–ˆ์œผ๋‚˜ โ€œ์ด๋ฏธ ์˜ˆ์•ฝ๋œ ์Šฌ๋กฏ์ž…๋‹ˆ๋‹คโ€ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์›์ธ

๋‘ ๋ช… ์ด์ƒ์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฑฐ์˜ ๋™์‹œ์— ๊ฐ™์€ ์Šฌ๋กฏ์„ ์„ ํƒํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. Hold ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๋™์‹œ์„ฑ์„ ์ œ์–ดํ•˜์ง€๋งŒ, ๊ทนํžˆ ์งง์€ ์‹œ๊ฐ„ ์ฐจ์ด๋กœ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋Œ€์ƒ์กฐ์น˜
BJ (์‚ฌ์šฉ์ž)๋‹ค๋ฅธ ๊ฐ€์šฉ ์Šฌ๋กฏ์„ ์„ ํƒํ•˜์—ฌ ์žฌ์‹œ๋„
์šด์˜์ž๋ณ„๋„ ์กฐ์น˜ ๋ถˆํ•„์š” (์‹œ์Šคํ…œ์ด ์ž๋™ ์ฒ˜๋ฆฌ)
๊ด€๋ฆฌ์ž๋นˆ๋ฒˆ ๋ฐœ์ƒ ์‹œ ์„œ๋ฒ„ ๋กœ๊ทธ์—์„œ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ํ™•์ธ

์˜ˆ๋ฐฉ

  • ์Šฌ๋กฏ ์„ ํƒ ์‹œ Hold๊ฐ€ ์ฆ‰์‹œ ๊ฑธ๋ฆฌ๋ฏ€๋กœ ์ •์ƒ์ ์ธ ๊ฒฝ์šฐ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
  • ์ถฉ๋Œ์ด ๋ฐ˜๋ณต๋œ๋‹ค๋ฉด ์„œ๋ฒ„ ์‘๋‹ต ์ง€์—ฐ์ด ์›์ธ์ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ Vercel ํ•จ์ˆ˜ ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค

Hold ๋งŒ๋ฃŒ

์ฆ์ƒ

์Šฌ๋กฏ์„ ์„ ํƒํ•˜๊ณ  ์˜ˆ์•ฝ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋Š” ๋„์ค‘ โ€œ์ž„์‹œ์ ์œ  ์‹œ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹คโ€ ๋ฉ”์‹œ์ง€๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

์›์ธ ๋ฐ ํ•ด๊ฒฐ

์›์ธํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
์ž…๋ ฅ ์‹œ๊ฐ„ ์ดˆ๊ณผ (2๋ถ„)์Šฌ๋กฏ์„ ๋‹ค์‹œ ์„ ํƒํ•˜์—ฌ ์žฌ์‹œ๋„
๋„คํŠธ์›Œํฌ ์ง€์—ฐ์œผ๋กœ ์„œ๋ฒ„ ํ†ต์‹  ์‹คํŒจ๋„คํŠธ์›Œํฌ ํ™•์ธ ํ›„ ์žฌ์‹œ๋„
์•ฑ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ „ํ™˜Hold ์ค‘์—๋Š” ์•ฑ์„ ์ „ํ™˜ํ•˜์ง€ ์•Š๋„๋ก ์•ˆ๋‚ด

์šด์˜์ž ์ฐธ๊ณ 

Hold ๋งŒ๋ฃŒ์œจ์ด ๋†’๋‹ค๋ฉด ๋‹ค์Œ์„ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค.

  • ์˜ˆ์•ฝ ํ™•์ • ํ™”๋ฉด์˜ ์ž…๋ ฅ ํ•ญ๋ชฉ์ด ๋„ˆ๋ฌด ๋งŽ์€์ง€ ํ™•์ธ (๊ฐ„์†Œํ™” ๊ฒ€ํ† )
  • ์„œ๋ฒ„ ์‘๋‹ต ์‹œ๊ฐ„์ด ๋А๋ ค์„œ ์‹ค์ œ ์ž…๋ ฅ ๊ฐ€๋Šฅ ์‹œ๊ฐ„์ด ์ค„์–ด๋“œ๋Š”์ง€ ํ™•์ธ
  • 2๋ถ„ ์ œํ•œ์ด ์ ์ ˆํ•œ์ง€ ๋น„์ฆˆ๋‹ˆ์Šค ๊ด€์ ์—์„œ ์žฌ๊ฒ€ํ† 

ํ‘ธ์‹œ ์•Œ๋ฆผ ๋ฏธ์ˆ˜์‹ 

์ฆ์ƒ

์˜ˆ์•ฝ ์ƒํƒœ ๋ณ€๊ฒฝ, ์ฒดํฌ์ธ ๋ฆฌ๋งˆ์ธ๋” ๋“ฑ์˜ ํ‘ธ์‹œ ์•Œ๋ฆผ์ด ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ™•์ธ ์‚ฌํ•ญ

ํ™•์ธ ํ•ญ๋ชฉ์กฐ์น˜
๊ธฐ๊ธฐ ์•Œ๋ฆผ ๊ถŒํ•œ์„ค์ • > StudioGo > ์•Œ๋ฆผ ํ—ˆ์šฉ ํ™•์ธ
์•ฑ ๋‚ด ์•Œ๋ฆผ ์„ค์ •StudioGo ์•ฑ ์„ค์ • > ์•Œ๋ฆผ ์„ค์ • ํ™•์ธ
๋ฐฉํ•ด ๊ธˆ์ง€ ๋ชจ๋“œ๊ธฐ๊ธฐ์˜ ๋ฐฉํ•ด ๊ธˆ์ง€ ๋ชจ๋“œ ํ•ด์ œ
Expo ํ‘ธ์‹œ ํ† ํฐ์•ฑ ์žฌ์„ค์น˜๋กœ ํ† ํฐ ๊ฐฑ์‹ 

๊ด€๋ฆฌ์ž ์กฐ์น˜

  1. Expo ํ‘ธ์‹œ ๋Œ€์‹œ๋ณด๋“œ์—์„œ ๋ฐœ์†ก ์ด๋ ฅ ํ™•์ธ
  2. ์‹คํŒจํ•œ ํ‘ธ์‹œ์˜ ์—๋Ÿฌ ์ฝ”๋“œ ํ™•์ธ (DeviceNotRegistered, InvalidCredentials ๋“ฑ)
  3. ํ† ํฐ ๊ฐฑ์‹  ๋ฐฐ์น˜๊ฐ€ ์ •์ƒ ๋™์ž‘ํ•˜๋Š”์ง€ ํ™•์ธ

์นด์นด์˜ค ์•Œ๋ฆผํ†ก ๋ฏธ์ˆ˜์‹ 

์ฆ์ƒ

์•Œ๋ฆผํ†ก์ด ์นด์นด์˜คํ†ก์œผ๋กœ ์ˆ˜์‹ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ™•์ธ ์‚ฌํ•ญ

ํ™•์ธ ํ•ญ๋ชฉ์กฐ์น˜
์นด์นด์˜คํ†ก ์„ค์น˜ ์—ฌ๋ถ€์นด์นด์˜คํ†ก ๋ฏธ์„ค์น˜ ์‹œ ์•Œ๋ฆผํ†ก ์ˆ˜์‹  ๋ถˆ๊ฐ€
์ „ํ™”๋ฒˆํ˜ธ ์ผ์น˜์นด์นด์˜ค ๊ณ„์ •์˜ ์ „ํ™”๋ฒˆํ˜ธ์™€ StudioGo ๋“ฑ๋ก ๋ฒˆํ˜ธ ์ผ์น˜ ํ™•์ธ
์นด์นด์˜ค ์ฑ„๋„ ์ฐจ๋‹จ์นด์นด์˜คํ†ก์—์„œ StudioGo ์ฑ„๋„์ด ์ฐจ๋‹จ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ
์•Œ๋ฆผํ†ก ๋ฐœ์†ก ํ•œ๋„์ผ์ผ ๋ฐœ์†ก ํ•œ๋„ ์ดˆ๊ณผ ์—ฌ๋ถ€ ํ™•์ธ (๊ด€๋ฆฌ์ž)

์˜ˆ์•ฝ ์ƒํƒœ ๋ถˆ์ผ์น˜

์ฆ์ƒ

์•ฑ์— ํ‘œ์‹œ๋˜๋Š” ์˜ˆ์•ฝ ์ƒํƒœ์™€ ์‹ค์ œ ์ƒํƒœ๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์˜ˆ: ์ด๋ฏธ ์Šน์ธ๋œ ์˜ˆ์•ฝ์ด ์•ฑ์—์„œ๋Š” ์—ฌ์ „ํžˆ ๋Œ€๊ธฐ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  1. ์•ฑ์„ ์™„์ „ํžˆ ์ข…๋ฃŒํ•˜๊ณ  ์žฌ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค
  2. ์˜ˆ์•ฝ ๋ชฉ๋ก ํ™”๋ฉด์—์„œ ์•„๋ž˜๋กœ ๋‹น๊ฒจ ์ƒˆ๋กœ๊ณ ์นจํ•ฉ๋‹ˆ๋‹ค
  3. ๋ฌธ์ œ๊ฐ€ ์ง€์†๋˜๋ฉด ์•ฑ ์บ์‹œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค

๊ด€๋ฆฌ์ž ์กฐ์น˜

  • API ์‘๋‹ต ์บ์‹œ ์„ค์ • ํ™•์ธ (์บ์‹œ TTL์ด ๋„ˆ๋ฌด ๊ธด ๊ฒฝ์šฐ)
  • DB ์กฐํšŒ ์ฟผ๋ฆฌ์—์„œ ์ƒํƒœ ํ•„ํ„ฐ๋ง ์˜ค๋ฅ˜ ์—ฌ๋ถ€ ํ™•์ธ

๋กœ๊ทธ ํ™•์ธ ๋ฐฉ๋ฒ•

์„œ๋ฒ„ ๋กœ๊ทธ (Vercel)

Hono API๋Š” Vercel Serverless Functions๋กœ ๋ฐฐํฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Vercel ๋Œ€์‹œ๋ณด๋“œย ์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค
  2. StudioGo ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค
  3. Logs ํƒญ์—์„œ ์‹ค์‹œ๊ฐ„ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

์ฃผ์š” ๋กœ๊ทธ ํ•„ํ„ฐ

ํ•„ํ„ฐ์šฉ๋„
level:error์—๋Ÿฌ ๋กœ๊ทธ๋งŒ ํ•„ํ„ฐ๋ง
path:/api/bookings์˜ˆ์•ฝ ๊ด€๋ จ API ํ˜ธ์ถœ๋งŒ ํ•„ํ„ฐ๋ง
path:/api/auth์ธ์ฆ ๊ด€๋ จ API ํ˜ธ์ถœ๋งŒ ํ•„ํ„ฐ๋ง
path:/api/slots์Šฌ๋กฏ ๊ด€๋ จ API ํ˜ธ์ถœ๋งŒ ํ•„ํ„ฐ๋ง
status:5xx์„œ๋ฒ„ ์—๋Ÿฌ ์‘๋‹ต๋งŒ ํ•„ํ„ฐ๋ง

DB ๋กœ๊ทธ (Neon)

  1. Neon ์ฝ˜์†”ย ์— ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค
  2. StudioGo ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค
  3. Monitoring ํƒญ์—์„œ ์ฟผ๋ฆฌ ์„ฑ๋Šฅ๊ณผ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค

์ฃผ์š” ํ™•์ธ ํ•ญ๋ชฉ

ํ•ญ๋ชฉ์ •์ƒ ๊ธฐ์ค€์ด์ƒ ์ง•ํ›„
์—ฐ๊ฒฐ ์ˆ˜10๊ฐœ ๋ฏธ๋งŒ50๊ฐœ ์ด์ƒ์ด๋ฉด ์ปค๋„ฅ์…˜ ํ’€ ์„ค์ • ํ™•์ธ
์ฟผ๋ฆฌ ์‘๋‹ต ์‹œ๊ฐ„100ms ๋ฏธ๋งŒ500ms ์ด์ƒ์ด๋ฉด ์ธ๋ฑ์Šค ํ™•์ธ
์—๋Ÿฌ์œจ0%1% ์ด์ƒ์ด๋ฉด ์ฟผ๋ฆฌ/์Šคํ‚ค๋งˆ ์ ๊ฒ€

์•ฑ ๋กœ๊ทธ (Expo)

๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ Expo DevTools๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

# ๊ฐœ๋ฐœ ์„œ๋ฒ„์—์„œ ๋กœ๊ทธ ํ™•์ธ npx expo start --dev-client

ํ”„๋กœ๋•์…˜ ์•ฑ์˜ ํฌ๋ž˜์‹œ ๋กœ๊ทธ๋Š” Expo Application Services(EAS)์—์„œ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ ์ฒดํฌ

์ •ํ•ฉ์„ฑ ๋ฌธ์ œ ์œ ํ˜•

์œ ํ˜•์„ค๋ช…์˜ํ–ฅ
์œ ๋ น HoldHold๊ฐ€ ๋งŒ๋ฃŒ๋˜์—ˆ์œผ๋‚˜ DB์— ๋‚จ์•„ ์žˆ์Œ๊ฐ€์šฉ ์Šฌ๋กฏ์ด ์ค„์–ด ๋ณด์ž„
์ƒํƒœ ๋ถˆ์ผ์น˜์˜ˆ์•ฝ ์ƒํƒœ์™€ ์Šฌ๋กฏ ์ƒํƒœ๊ฐ€ ๋ถˆ์ผ์น˜์ด์ค‘ ์˜ˆ์•ฝ ๊ฐ€๋Šฅ์„ฑ
๊ณ ์•„ ์˜ˆ์•ฝ์‚ญ์ œ๋œ ์ŠคํŠœ๋””์˜ค์— ์˜ˆ์•ฝ์ด ๋‚จ์•„ ์žˆ์Œ์‚ฌ์šฉ์ž ํ˜ผ๋ž€
์‹œ๊ฐ„๋Œ€ ์˜ค๋ฅ˜์„œ๋ฒ„/ํด๋ผ์ด์–ธํŠธ ์‹œ๊ฐ„๋Œ€ ๋ถˆ์ผ์น˜์ž˜๋ชป๋œ ์‹œ๊ฐ„์— ์Šฌ๋กฏ ํ‘œ์‹œ

SQL ์ ๊ฒ€ ์ฟผ๋ฆฌ

Neon ์ฝ˜์†”์˜ SQL Editor์—์„œ ๋‹ค์Œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ •ํ•ฉ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋งŒ๋ฃŒ๋œ Hold ํ™•์ธ

-- ๋งŒ๋ฃŒ ์‹œ๊ฐ„์ด ์ง€๋‚œ Hold ์ƒํƒœ ์Šฌ๋กฏ ์กฐํšŒ SELECT s.id, s.studio_id, s.start_time, s.hold_expires_at FROM slots s WHERE s.status = 'HOLD' AND s.hold_expires_at < NOW();

์ƒํƒœ ๋ถˆ์ผ์น˜ ํ™•์ธ

-- ์˜ˆ์•ฝ์€ ์ทจ์†Œ์ธ๋ฐ ์Šฌ๋กฏ์ด ์—ฌ์ „ํžˆ ์˜ˆ์•ฝ ์ƒํƒœ์ธ ๊ฑด SELECT b.id AS booking_id, s.id AS slot_id, b.status AS booking_status, s.status AS slot_status FROM bookings b JOIN slots s ON b.slot_id = s.id WHERE b.status IN ('CANCELLED', 'REJECTED') AND s.status = 'BOOKED';

๊ณ ์•„ ์˜ˆ์•ฝ ํ™•์ธ

-- ์‚ญ์ œ๋œ ์ŠคํŠœ๋””์˜ค์— ๋‚จ์•„ ์žˆ๋Š” ๋ฏธ๋ž˜ ์˜ˆ์•ฝ SELECT b.id, b.studio_id, b.start_time, b.status FROM bookings b LEFT JOIN studios st ON b.studio_id = st.id WHERE st.id IS NULL AND b.start_time > NOW();

์ •ํ•ฉ์„ฑ ๋ณต๊ตฌ

๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋ฉด ๋‹ค์Œ ์ ˆ์ฐจ๋กœ ๋ณต๊ตฌํ•ฉ๋‹ˆ๋‹ค.

  1. ์œ ๋ น Hold ์ •๋ฆฌ: ๋งŒ๋ฃŒ๋œ Hold๋ฅผ AVAILABLE๋กœ ๋ณ€๊ฒฝ
UPDATE slots SET status = 'AVAILABLE', hold_expires_at = NULL, hold_user_id = NULL WHERE status = 'HOLD' AND hold_expires_at < NOW();
  1. ์ƒํƒœ ๋ถˆ์ผ์น˜ ๋ณต๊ตฌ: ์ทจ์†Œ/๊ฑฐ์ ˆ๋œ ์˜ˆ์•ฝ์˜ ์Šฌ๋กฏ์„ AVAILABLE๋กœ ๋ณ€๊ฒฝ
UPDATE slots s SET status = 'AVAILABLE' FROM bookings b WHERE s.id = b.slot_id AND b.status IN ('CANCELLED', 'REJECTED') AND s.status = 'BOOKED';
  1. ๊ณ ์•„ ์˜ˆ์•ฝ ์ •๋ฆฌ: ์‚ญ์ œ๋œ ์ŠคํŠœ๋””์˜ค์˜ ๋ฏธ๋ž˜ ์˜ˆ์•ฝ์„ ์ทจ์†Œ ์ฒ˜๋ฆฌ
UPDATE bookings b SET status = 'CANCELLED', cancelled_at = NOW(), cancel_reason = '์ŠคํŠœ๋””์˜ค ์‚ญ์ œ' FROM ( SELECT b2.id FROM bookings b2 LEFT JOIN studios st ON b2.studio_id = st.id WHERE st.id IS NULL AND b2.start_time > NOW() ) orphan WHERE b.id = orphan.id;

์ •๊ธฐ ์ ๊ฒ€ ๊ถŒ์žฅ ์ฃผ๊ธฐ

์ ๊ฒ€ ํ•ญ๋ชฉ๊ถŒ์žฅ ์ฃผ๊ธฐ์ž๋™ํ™” ์—ฌ๋ถ€
์œ ๋ น Hold ์ •๋ฆฌ๋งค 5๋ถ„O (Cron Job)
์ƒํƒœ ๋ถˆ์ผ์น˜ ํ™•์ธ๋งค์ผ ์ƒˆ๋ฒฝ 3์‹œO (Cron Job)
๊ณ ์•„ ์˜ˆ์•ฝ ํ™•์ธ๋งค์ฃผ ์›”์š”์ผ์ˆ˜๋™
DB ๋ฐฑ์—… ํ™•์ธ๋งค์ผO (Neon ์ž๋™)

๊ธด๊ธ‰ ์—ฐ๋ฝ์ฒ˜

์žฅ์•  ๋ฐœ์ƒ ์‹œ ์—ฐ๋ฝ ์ˆœ์„œ

์ˆœ์„œ๋‹ด๋‹น์—ญํ• ์—ฐ๋ฝ์ฒ˜
1์‹œ์Šคํ…œ ๊ด€๋ฆฌ์ž์„œ๋ฒ„/DB ์žฅ์•  ๋Œ€์‘๋‚ด๋ถ€ Slack #studiogo-ops
2๋ฐฑ์—”๋“œ ๋‹ด๋‹นAPI/๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ด์Šˆ๋‚ด๋ถ€ Slack #studiogo-dev
3์นด์นด์˜ค ๊ธฐ์ˆ ์ง€์›์•Œ๋ฆผํ†ก/OAuth ์ด์Šˆ์นด์นด์˜ค ๋น„์ฆˆ๋‹ˆ์Šค ๊ณ ๊ฐ์„ผํ„ฐย 
4Vercel ์ง€์›๋ฐฐํฌ/์„œ๋ฒ„๋ฆฌ์Šค ์ด์ŠˆVercel Supportย 
5Neon ์ง€์›DB ์—ฐ๊ฒฐ/์„ฑ๋Šฅ ์ด์ŠˆNeon Supportย 
6Expo ์ง€์›์•ฑ ๋นŒ๋“œ/ํ‘ธ์‹œ ์ด์ŠˆExpo Supportย 

์žฅ์•  ๋Œ€์‘ ์ ˆ์ฐจ

  1. ์ฆ์ƒ ํŒŒ์•…: ์–ด๋–ค ๊ธฐ๋Šฅ์ด ์˜ํ–ฅ ๋ฐ›๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
  2. ๋ฒ”์œ„ ํŒ๋‹จ: ์ „์ฒด ์žฅ์• ์ธ์ง€, ํŠน์ • ๊ธฐ๋Šฅ ์žฅ์• ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
  3. ๋กœ๊ทธ ํ™•์ธ: Vercel Logs, Neon Monitoring์—์„œ ์—๋Ÿฌ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค
  4. 1์ฐจ ์กฐ์น˜: ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ฆ‰์‹œ ์กฐ์น˜ํ•ฉ๋‹ˆ๋‹ค (์žฌ๋ฐฐํฌ, ์บ์‹œ ์ดˆ๊ธฐํ™” ๋“ฑ)
  5. ์‚ฌ์šฉ์ž ๊ณต์ง€: ์žฅ์•  ์‹œ๊ฐ„์ด 10๋ถ„์„ ์ดˆ๊ณผํ•˜๋ฉด ์ธ์•ฑ ๊ณต์ง€๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค
  6. ๊ทผ๋ณธ ์›์ธ ๋ถ„์„: ์žฅ์•  ํ•ด์†Œ ํ›„ ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ  ์žฌ๋ฐœ ๋ฐฉ์ง€ ์กฐ์น˜๋ฅผ ์ˆ˜๋ฆฝํ•ฉ๋‹ˆ๋‹ค
  7. ํฌ์ŠคํŠธ๋ชจํ…œ ์ž‘์„ฑ: ์žฅ์•  ํƒ€์ž„๋ผ์ธ, ์›์ธ, ์กฐ์น˜ ๋‚ด์—ญ, ๊ฐœ์„  ์‚ฌํ•ญ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค

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