ํ์ : ๊ฐ์ธ ํ๋ก์ ํธ
๊ธฐ๊ฐ : 2025.01 ~ ์งํ ์ค
๋งํฌ : https://github.com/M-ung/TicToc_Server
์๋น์ค ๋ด์ฉ : ๋น์ ์ ์๊ฐ์ ๊ฐ์น๋ฅผ ๋งค๊ธฐ๋ค, ์๊ฐ ๊ฑฐ๋ ๊ฒฝ๋งค ํ๋ซํผ
์ฐ๋ฆฌ ์๋น์ค "TicToc"์ ๊ฐ์ฅ ์ค์ํ ํต์ฌ ๊ธฐ๋ฅ์ ๋ํด์ ๊ณ ๋ฏผํ ์๊ฐ์ด๋ค. ๋ฐ๋ก "์
์ฐฐ ๊ธฐ๋ฅ" ์ด๋ค.
๋จ์ํ Bid ์ํฐํฐ๋ฅผ ์ ์ฅํด์ ์
์ฐฐ์ ํ๋ ๋ฐฉ์์ ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ฌ๊ธฐ์ ๋์์ฑ ๋ฌธ์ ๋?
๋์์ฑ ๋ฌธ์ ๋ ์ฌ๋ฌ ๊ฐ์ ํธ๋์ญ์ ์ด ๋์ผํ ๋ฐ์ดํฐ์ ๋์ ์ ๊ทผํ์ฌ ์๊ธฐ์น ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ TicToc ์๋น์ค์ ์ ์ฐฐ ๊ธฐ๋ฅ์ ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ๊ฐ์ ๊ฒฝ๋งค์ ๋์์ ์ ์ฐฐํ ๋, ์ ์ฐฐ ๊ฒฐ๊ณผ๊ฐ ์์๊ณผ ๋ค๋ฅด๊ฒ ๋ฐ์๋๊ฑฐ๋ ๋ฐ์ดํฐ ์ถฉ๋์ด ๋ฐ์ํ ์ ์๋ค.
์ฐ๋ฆฌ ์๋น์ค๋ ๋์ผ๋ก ์ ์ฐฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ ํํ ์ ์ฐฐ ๊ฒฐ๊ณผ๋ฅผ ์๋ ค์ผ ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ "์ ์ฐฐ ๊ธฐ๋ฅ"์ ๊ตฌํํ๋ฉด์ ์ค๋ ๊ณ ๋ฏผ์ ํ๊ฒ ๋์๋ค.
๊ถ๊ธ์ ์ผ๋ก ๋ฌธ์ ๋ ์๋์ ๊ฐ๋ค.
1. ๋์ผํ ๋ฐ์ดํฐ์ ๋์ ์ ๊ทผํ๋ ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ
2. ์ฌ๋ฌ ์ ๊ทผ ์ค์ ๋ฑ ํ๋์ ์ ๊ทผ๋ง ๊ฐ์ ธ์ค๊ณ ๋๋จธ์ง๋ ๋กค๋ฐฑ
์ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด ๋ถ์ฐ ๋ฝ์ ์ ์ฉํ์ฌ ํ๋๋ง์ ํธ๋์ญ์ ์ ์ ์ดํ๋๋ก ํ๊ณ ์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ "์ ์ฐฐ ๊ธฐ๋ฅ"์ ๊ธ์ ์ด ์ค๊ณ ๊ฐ๋ ๊ธฐ๋ฅ์ด๊ธฐ์ ๋ถ์ฐ ๋ฝ ์ธ์ ์ถ๊ฐ์ ์ธ ์์ ์ฅ์น๋ฅผ ๋ํ๊ธฐ๋ก ํ๋ค.
๋จผ์ ๋ถ์ฐ ๋ฝ์ ํ์ฉํด์ ๋จ ํ๋์ ์ ์ฐฐ๋ง ์ฑ๊ณตํ ์ ์๊ฒ ๊ตฌํํ๋ค.
๋ ๋จ์ํ ๋ถ์ฐ ๋ฝ๋ง ์ ์ฉํ๋ ๊ฒ์ด ์๋๋ผ ๋ฝ์ ํ๋ํ์ ๋, ์์์ ์ฐ์ฐ์ ํตํด ๋ฐ๋ก currentPrice๋ฅผ ์ฆ์ DB์ ์ ๋ฐ์ดํธํด ์ฃผ์๋ค.
๊ทธ ํ ์
์ฐฐ ๋ก์ง์ ์์ฐจ์ ์ผ๋ก ์งํํ๊ณ , ๋ฐ๋ก ๋ฝ์ ํด์ ํ์ ๋ ๋๊ธฐ ์ค์ด์๋ ์
์ฐฐ์ด ์ฑ๊ณต๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด Thread.sleep(RedisConstants.LOCK_LEASE_TIME * 1000);
๋ฅผ ์ถ๊ฐํ์ฌ ๋๋ ์ด ์ ๋ต์ ์ ์ฉํ๋ค.
๋ง์ง๋ง์ผ๋ก Bid ํ
์ด๋ธ์ beforePrice
๋ผ๋ ์
์ฐฐ ์ฑ๊ณต ์ ๊ฐ๊ฒฉ์ ์ ์ฅํ๊ณ , @Table(name = "bid", uniqueConstraints = @UniqueConstraint(columnNames = {"auctionId", "beforePrice"}))
์ ๋ํฌ ์ ์ฝ ์กฐ๊ฑด์ ์ถ๊ฐํ๋ค.
์ ๋ํฌ ์ ์ฝ ์กฐ๊ฑด์ผ๋ก ์ธํด Bid ํ ์ด๋ธ์๋ ํ๋์ auctionId์๋ ์ค๋ณต๋๋ beforePrice๊ฐ ์ฌ ์ ์๊ธฐ์ ๊ฐ์ ๊ฒฝ๋งค๊ฐ์ ์ ์ฐฐ์ ์ฑ๊ณตํ๋ Bid๊ฐ 2๊ฐ ์ด์ ์กด์ฌํ ์ ์๊ฒ ๋๋ค.
๋ฌธ์ ํด๊ฒฐ๋ก ์๋์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์๋ค.
1. โ์์์ ์ฐ์ฐ + ๋ถ์ฐ ๋ฝ + ๋๋ ์ด + ์ ๋ํฌ ์ ์ฝ ์กฐ๊ฑดโ โ ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ.
2. 5,000๊ฑด ๊ธฐ์ค, ๋์ ์
์ฐฐ ์์ฒญ ์ค 1๊ฑด ์ฑ๊ณต, 4,999๊ฑด ์คํจ.
3. ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ 100% ๋ณด์ฅ.
4. ์๋น์ค์ ํต์ฌ ๊ธฐ๋ฅ โ์
์ฐฐโ ์ ๋งค์ฐ ์์ ํ๊ฒ ์ด์ ๊ฐ๋ฅ.
์ต์ข ์ ์ผ๋ก "์์์ ์ฐ์ฐ + ๋ถ์ฐ ๋ฝ + ๋๋ ์ด + ์ ๋ํฌ ์ ์ฝ ์กฐ๊ฑด" ์ ํ์ฉํ์ฌ 5000๋ช ์ด ๋์์ ์ ์ฐฐ ์๋๋ฅผ ํ์ ๋, "1๋ช ๋ง ์ ์ฐฐ ์ฑ๊ณต โ , 4999๋ช ์ ์ฐฐ ์คํจ โ" ํ ์คํธ๋ฅผ ํต๊ณผํ ์ ์์๋ค.
"์ ์ฐฐ ๊ธฐ๋ฅ" ํ๋๋ฅผ ๊ตฌํํ๋ ๋ฐ์ ๋ง์ ์๊ฐ ๋์ ๋ง์ ๊ณต๋ถ๋ฅผ ํ ์ ์์๋ค. ๋จ์ํ ์ด๋ ธํ ์ด์ ์ ๋ถ์ด ๋์์ฑ ์ ์ด์์ ๋๋ด๋ ๊ฒ์ด ์๋ Redis๋ฅผ ํ์ฉํ์ฌ ๋ถ์ฐ ๋ฝ์ ํ์ฉํ๊ณ , ๋จ์ํ ๋ถ์ฐ ๋ฝ์์ ๋๋ด๋ ๊ฒ์ด ์๋ ๋๋ ์ด ์ ๋ต์ ํ์ฉํด ์์ ์ฑ์ ๋ณด์ฅํ๋ค. ๋ ์ด์์ ๋๋ด๋ ๊ฒ์ด ์๋, ์์์ ์ฐ์ฐ๊ณผ ์ ๋ํฌ ์ ์ฝ ์กฐ๊ฑด์ ํตํด ๋์ฑ ์์ ์ฑ์ ๋ณด๊ฐํ๋ค.
์ด๋ฒ ๊ฒฝํ์ ํตํด ๋์์ฑ ์ ์ด์ ์ค์์ฑ์ ๋ค์ ๊นจ๋ฌ์๊ณ , ํ ์คํธ ์ฝ๋์ ์ ๋ขฐ์ฑ์ด ์๋น์ค ์์ ์ฑ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ค๋ ์ ์ ๋ฐฐ์ธ ์ ์์๋ค. ์์ผ๋ก ํ ์คํธ ์ฝ๋๋ฅผ ๊พธ์คํ ์์ฑํ์ฌ ๋์ฑ ์์ ์ฑ๊ณผ ์ ๋ขฐ์ฑ์ ๋ณด์ฅํ๋ ๊ฐ๋ฐ์๋ก ์ฑ์ฅํด์ผ๊ฒ ๋ค.