Skip to content

๐Ÿ”ฅ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‚˜์š”? ๋„์ „ํ•ด๋ณด์„ธ์š”!

Notifications You must be signed in to change notification settings

aengdulab/concurrency-ticket

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

10 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๋ฏธ์…˜ - ์šฐ์ฃผ์—ฌํ–‰ ํ‹ฐ์ผ“ ์žฌ๊ณ  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ์„ค๊ณ„

๐Ÿ” ์ง„ํ–‰ ๋ฐฉ์‹

  • ๋ฏธ์…˜์€ ์‹œ์Šคํ…œ ์š”๊ตฌ ์‚ฌํ•ญ, ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ ๋‘ ๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
  • ๋‘ ๊ฐœ์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•œ๋‹ค. ํŠนํžˆ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋ฉฐ ๋งˆ์ฃผํ•˜๋Š” ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ ๊ณผ์ •์„ ๊ธฐ๋กํ•˜๋Š” ๋ฐ์— ์ง‘์ค‘ํ•œ๋‹ค.
  • ์‹œ์Šคํ…œ ์š”๊ตฌ ์‚ฌํ•ญ์— ๊ธฐ์žฌ๋˜์ง€ ์•Š์€ ๋‚ด์šฉ์€ ์Šค์Šค๋กœ ํŒ๋‹จํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

๐Ÿ“ฎ ๋ฏธ์…˜ ์ œ์ถœ ๋ฐฉ๋ฒ•

  • ๋ฏธ์…˜ ๊ตฌํ˜„์„ ์™„๋ฃŒํ•œ ํ›„ GitHub์„ ํ†ตํ•ด ์ œ์ถœํ•ด์•ผ ํ•œ๋‹ค.
    • Repository๋ฅผ forkํ•œ ์ดํ›„, ๋ฏธ์…˜์„ ๊ตฌํ˜„ํ•˜๊ณ  commit & pushํ•œ๋‹ค.
    • ๋ฏธ์…˜์„ ์™„๋ฃŒํ•œ ์ดํ›„, ๋ณธ์ธ์˜ Github ๋‹‰๋„ค์ž„์˜ ๋ธŒ๋žœ์น˜์— Pull Request๋ฅผ ๋ณด๋‚ธ๋‹ค.
    • ๋ณธ์ธ์˜ Github ๋‹‰๋„ค์ž„์˜ ๋ธŒ๋žœ์น˜๋Š” ๊ด€๋ฆฌ์ž์—๊ฒŒ ์š”์ฒญํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ docs ํด๋”์˜ how-to-solve.md ํŒŒ์ผ์„ ์ž‘์„ฑํ•œ๋‹ค.
    • ๋ธ”๋กœ๊ทธ, ๋…ธ์…˜ ๋“ฑ ๊ฐœ์ธ ํ•™์Šต ๋…ธํŠธ์— ์ž‘์„ฑํ•œ ๊ธ€์„ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ์˜จ๋ผ์ธ์œผ๋กœ ๊ฒŒ์‹œ๋œ ๊ธ€์˜ ๋งํฌ๋ฅผ ์ฒจ๋ถ€ํ•ด๋„ ๋œ๋‹ค.

๐Ÿš€ ์‹œ์Šคํ…œ ์š”๊ตฌ ์‚ฌํ•ญ

๋ชฉํ‘œ: 1๋ถ„ ๋‚ด์— ๋งค์ง„๋˜๋Š” ์ธ๊ธฐ ์žˆ๋Š” ํ–‰์„ฑ ์—ฌํ–‰ ํ‹ฐ์ผ“ ํŒ๋งค ์‹œ์Šคํ…œ์„ ์œ„ํ•œ ํ‹ฐ์ผ“ ์žฌ๊ณ  ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„

  1. ๊ณ„์ •๋‹น ๊ตฌ๋งค ๊ฐ€๋Šฅ ์ˆ˜๋Ÿ‰ ์ œํ•œ

    • ๊ณ„์ •๋‹น ๊ตฌ๋งคํ•  ์ˆ˜ ์žˆ๋Š” ํ™”์„ฑ(Mars)์„, ๊ธˆ์„ฑ(Venus)์„ ํ‹ฐ์ผ“์„ ์ด 2์žฅ์œผ๋กœ ์ œํ•œํ•œ๋‹ค.
    • ์˜ˆ) ๊ธˆ์„ฑ์„ 2์žฅ๊ณผ ํ™”์„ฑ์„ 2์žฅ(์ด 4์žฅ)์€ ๊ตฌ๋งค ๋ถˆ๊ฐ€. ๊ธˆ์„ฑ์„ 1์žฅ๊ณผ ํ™”์„ฑ์„ 1์žฅ(์ด 2์žฅ)์€ ๊ตฌ๋งค ๊ฐ€๋Šฅ.
  2. ํ‹ฐ์ผ“ ์ดˆ๊ณผ ํŒ๋งค ๋ฐฉ์ง€

    • ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š” ํ‹ฐ์ผ“๋ณด๋‹ค ๋” ๋งŽ์€ ํ‹ฐ์ผ“์ด ํŒ๋งค๋˜์ง€ ์•Š๋„๋ก ์žฌ๊ณ ๋ฅผ ์ฒ ์ €ํžˆ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
    • ๋งคํฌ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ถ€์ • ์‚ฌ์šฉ์ž๋กœ ์ธํ•ด ํ•˜๋‚˜์˜ ๊ณ„์ •์—์„œ ์ˆ˜๋งŽ์€ ํ‹ฐ์ผ“ ๊ตฌ๋งค ์š”์ฒญ์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.
  3. ์ดˆ๋‹น ์ตœ์†Œ 1,000์žฅ์˜ ํ‹ฐ์ผ“ ๊ตฌ๋งค ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ์š”๊ตฌ

    • 5๋งŒ ์žฅ์˜ ํ‹ฐ์ผ“์ด 1๋ถ„ ๋‚ด์— ๋งค์ง„๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ดˆ๋‹น ์ตœ์†Œ 1,000์žฅ์˜ ํ‹ฐ์ผ“ ๊ตฌ๋งค๊ฐ€ ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ด์•ผ ํ•œ๋‹ค.
    • ๊ตฌ๋งค์— ์‹คํŒจํ•œ ์š”์ฒญ(๊ณ„์ขŒ ์ž”์•ก ๋ถ€์กฑ, ์นด๋“œ ๋น„๋ฐ€๋ฒˆํ˜ธ ์˜ค๋ฅ˜ ๋“ฑ)๋„ ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ดˆ๋‹น 1,000๊ฐœ ์ด์ƒ์˜ ๊ตฌ๋งค ์š”์ฒญ์ด ๋ฐœ์ƒํ•  ๊ฒƒ์„ ์—ผ๋‘์— ๋‘ฌ์•ผ ํ•œ๋‹ค.

์œ„ ์š”๊ตฌ์‚ฌํ•ญ์ด ๋งŒ์กฑ๋˜์—ˆ์Œ์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆ๋˜์–ด์•ผ ํ•œ๋‹ค.
com.aengdulab.ticket.MissionTest์˜ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ชจ๋‘ ํ†ต๊ณผํ•˜๋ฉด ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•œ๋‹ค.


๐ŸŽฏ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์š”๊ตฌ ์‚ฌํ•ญ

  • JDK 21 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค.
  • README.md์™€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์ˆ˜์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํ…Œ์ŠคํŠธ๋ฅผ ์ œ์™ธํ•œ build.gradle, docker-compose.yml ๋“ฑ ๋ชจ๋“  ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•ด๋„ ๋œ๋‹ค.
  • ๋ช…ํ™•ํ•œ ์ด์œ  ์—†์ด๋Š” ํŒŒ์ผ, ํŒจํ‚ค์ง€ ์ด๋ฆ„์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์œ ์ง€ํ•œ๋‹ค.

๐Ÿ“ ํžŒํŠธ

๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋„์›€์ด ๋ ๋งŒํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•œ๋‹ค.

๋ฏธ์…˜ ์‹œ์ž‘ - Docker ์‹คํ–‰ ๋ฐฉ๋ฒ•

๋ฏธ์…˜์—์„œ ์‚ฌ์šฉํ•˜๋Š” MySQL์€ Docker ์ปจํ…Œ์ด๋„ˆ์™€ Docker Compose ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค. Docker๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
์•„๋ž˜ ๋ช…๋ น์–ด๋Š” ๋ชจ๋‘ Docker Compose ๋ช…๋ น์–ด๋กœ docker-compose.yml์ด ์žˆ๋Š” ./docker ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ด์„œ ์ž…๋ ฅํ•ด์•ผ ํ•œ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    docker-compose up -d
  • ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    docker-compose ps
  • ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ๋ฅผ ํ™•์ธํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    docker-compose logs -f
  • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    docker-compose down
  • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ข…๋ฃŒํ•˜๊ณ  ์‚ญ์ œํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    docker-compose down --rmi all
  • MySQL ์ปจํ…Œ์ด๋„ˆ์— ์ ‘์†ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    docker-compose exec mysql mysql -u root -p
  • MySQL ์Šคํ‚ค๋งˆ(schema.sql)๋ฅผ ๋ณ€๊ฒฝํ•œ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ์„ ๋ฐ˜๋“œ์‹œ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.
    • ./docker/db/mysql/data ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ญ์ œํ•œ๋‹ค.
    • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค.
      docker-compose down --rmi all
      docker-compose up -d

๋ฏธ์…˜ ํ•™์Šต ํ‚ค์›Œ๋“œ

๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉํ–ฅ์„ฑ์„ ์žก์ง€ ๋ชปํ•  ๋•Œ, ๋‹ค์Œ ํ‚ค์›Œ๋“œ๋ฅผ ํ•™์Šตํ•ด ๋ณด์ž.

  • ํŠธ๋žœ์žญ์…˜(Transaction)
  • Deadlock
  • S-๋ฝ(Shared Lock), X-๋ฝ(Exclusive Lock)
  • Java synchronized
  • Spring @Transactional ํ”„๋ก์‹œ
  • ๋‚™๊ด€๋ฝ(Optimistic Locking), ๋น„๊ด€๋ฝ(Pessimistic Locking)
  • ์žฌ์‹œ๋„(Retry)

About

๐Ÿ”ฅ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‚˜์š”? ๋„์ „ํ•ด๋ณด์„ธ์š”!

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages