์ค์ ์ ๋ค์ด์ค๋ฉด์ ์ฒ์์ผ๋ก ๊ฒช์ด๋ณด๊ณ ๋ง์ด ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ธ ๋์์ฑ ์ ์ด ๐ค
์ด๋จ๋ ๋์์ฑ ์ ์ด๊ฐ ํ์ํ๊ณ , ์ด๋ป๊ฒ ์ ์ดํด์ผํ ๊น?!์ ๋ํด ์์ฒญ๋๊ฒ ๋ง์ด ๊ณ ๋ฏผํ๋ ๊ฒ ๊ฐ๋ค.
๋์์ฑ ์ ์ด ์ ํ์ํ๋ฐ? ๐
ํํ ์ด๋ธ์ ์์ฝ๊ณผ ์คํ ์ด ์ ๋ณด ์กฐํ ๋ฑ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋๋ฐ,
์ด์ค์์ ๋๊ธฐ์ ๋ฑ๋ก๊ณผ ์คํ ์ด ์ ๋ณด ๊ฐฑ์ ๋ถ๋ถ์์ ๋์์ฑ ์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ค.
๋์์ฑ ์ค๋ฅ๋ ์ด๋ ํ ๊ณต์ ์์์ ๋์์ ์์ ์ด ์ด๋ฃจ์ด์ง ๋(insert, update, delete ๋ฑ) ์คํ ์์๊ฐ ๋ค์ฃฝ๋ฐ์ฃฝ์ด ๋๋ฉด์
์ค๋ฅ๊ฐ ์๊ธฐ๋๊ฒ์ด์๋๋ฐ ๋์์ฑ ์ ์ด๋ฅผ ํตํด ์ฌ๋ฌ ํธ๋์ญ์ ๋ค์ด ์ฑ๊ณต์ ์ผ๋ก ๋์์ ์คํ๋ ์ ์๋๋ก ํด์ฃผ์ด์ผํ๋ค.
๊ทธ๋ผ ๊ณต์ ์์์ ์ฐ๋๊ณณ์๋ ๋ค Lock์ ๊ฑธ๋ฉด ๋๋๊ฑฐ ์๋์ผ? ๐ ๐ป
๋์์ฑ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๋ถ๋ถ์ ๋ชจ๋ Lock์ ๊ฑธ์ด์ ๋์์ฑ์ ์ ์ดํ๋ค๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ ๊ฒ์ด๊ณ , Lock์ ๋ํ ๋น์ฉ์ด ์ฆ๊ฐํ ๊ฒ์ด๋ค.
๊ทธ๋์ ๊ผญ ํ์ํ ๋ถ๋ถ์๋ง Lock์ ๊ฑธ๋๋ก ํด์ผํ๊ณ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ ์ค ์๋ง๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ์ฉํด์ผํ๋ค.
๊ธฐ์ ์ ์ ํ โ
๐ป ๋น๊ด์ ๋ฝ
: ํธ๋์ญ์
์ ์ถฉ๋์ด ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํ๊ณ ํ๋์ ํธ๋์ญ์
์ด ์์์ ์ ๊ทผ์ ๋ฝ์ ๊ฑธ๊ณ , ๋ค๋ฅธ ํธ๋์ญ์
์ด ์ ๊ทผํ์ง ๋ชปํ๋๋ก ํจ
1. Shared Lock
- ์ ๊ทผํ ํธ๋์ญ์ ์ด ์์ ์ค์ผ ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ์ฝ๊ธฐ๋ง ๊ฐ๋ฅํ๊ณ , Exclusive Lock ์ ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.
2. Exclusive Lock
- ์ ๊ทผํ ํธ๋์ญ์ ์ด ์์ ์ค์ผ ๋ ๋ค๋ฅธ ํธ๋์ญ์ ์์๋ ์ฝ๊ธฐ/์ฐ๊ธฐ๊ฐ ๋ชจ๋ ๋ถ๊ฐ๋ฅํ๊ณ Shared/Exclusive Lock ์ ์ฉ์ด ์ถ๊ฐ์ ์ผ๋ก ๋ถ๊ฐ๋ฅ
public interface BoardRepository extends JpaRepository<Board, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("select b from Board b where b.id = :id")
Board findByIdForUpdate(Long id);
}
*/ LockMode ์ข
๋ฅ
LockModeType.PESSIMISTIC_WRITE
- ์ผ๋ฐ์ ์ธ ์ต์
. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๊ธฐ ๋ฝ
- ๋ค๋ฅธ ํธ๋์ญ์
์์ ์ฝ๊ธฐ๋ ์ฐ๊ธฐ๋ ๋ชปํจ. (Exclusive lock)
LockModeType.PESSIMISTIC_READ
๋ฐ๋ณต ์ฝ๊ธฐ๋งํ๊ณ ์์ ํ์ง ์๋ ์ฉ๋๋ก ๋ฝ์ ๊ฑธ ๋ ์ฌ์ฉ
๋ค๋ฅธ ํธ๋์ญ์
์์ ์ฝ๊ธฐ๋ ๊ฐ๋ฅํจ. (Shared Lock)
LockModeType.PESSINISTIC_FORCE_INCREMENT
Version ์ ๋ณด๋ฅผ ์ฌ์ฉํ๋ ๋น๊ด์ ๋ฝ
3. ์ฅ์ ๊ณผ ๋จ์ :
์ถฉ๋์ด ์์ฃผ ๋ฐ์ํ๋ ํ๊ฒฝ์์ ๋กค๋ฐฑ์ ํ์๋ฅผ ์ค์ผ ์ ์๊ณ , ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๋ ์์ค์ด ๋งค์ฐ ๋์!
๐ป ๋๊ด์ ๋ฝ:
ํธ๋์ญ์
์ด ์ถฉ๋์ด ๋ฐ์ํ์ง ์์๊ฒ์ด๋ผ๋ ๊ฐ์ ์ ํ์ฌ ์ถฉ๋์ ๋ง์ง์๊ณ ์ถฉ๋์ด ๋๊ฒ์ ๊ฐ์งํ๋ฉด ๊ทธ๋ ์ฒ๋ฆฌ
=> version์ ์ํ๋ฅผ ๋ณด๊ณ ์ถฉ๋์ ํ์ธํ๋ฉฐ ์ถฉ๋์ด ํ์ธ๋ ๊ฒฝ์ฐ Rollback ํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ
@Entity
public class Board {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Version// ์ํฐํฐ๋ฅผ ์์ ํ ๋ ๋ง๋ค ๋ฒ์ ์ด ์ฆ๊ฐํจprivate Long version;
}
1. ์ฅ์ ๊ณผ ๋จ์
: ์ฆ์ ์ถฉ๋์ด ์ผ์ด๋๋ ๊ฒฝ์ฐ ๋กค๋ฐฑ ์ฒ๋ฆฌ์ ๋ํ ๋น์ฉ(์์ฒญ์ด ์คํจํ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๊ฐ ์ง์ ๋กค๋ฐฑ์ฒ๋ฆฌ๋ฅผ ํด์ผํจ) ์ด ๋ง์ด ๋ค์ด ์ํด ๋ฐ์
: ํธ๋์ญ์
์ ์ปค๋ฐํ๊ธฐ์ ์๋ ์ถฉ๋ ์ฌ๋ถ๋ฅผ ์ ์ ์์
: ์ถฉ๋์ด ๋์ง ์๋๋ค๋ ๊ฐ์ ํ์ ๋์ ์์ฒญ์ ๋ํด ์ฒ๋ฆฌ ์ฑ๋ฅ์ด ์ข์
๐ป Synchronized :
- Synchronized๋ฅผ ๋ฉ์๋์ ๋ช ์ํด์ฃผ๋ฉด ํ๋์ ์ค๋ ๋๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
- ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์ค๋ ๋๊ฐ ๋ฐ์ดํฐ ๋๊ธฐํ๋ฅผ ์์ผ์ฃผ๊ธฐ ์ํด์ ์๋ฐ์์ ์ ๊ณตํ๋ ํค์๋์ด๋ค.
- Java์์ ์ง์ํ๋ synchronized๋, ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ํด๋น ์ค๋ ๋๋ฅผ ์ ์ธํ๊ณ ๋๋จธ์ง ์ค๋ ๋๋ค์ ๋ฐ์ดํฐ ์ ๊ทผ์ ๋ง์ ์์ฐจ์ ์ผ๋ก ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋๋ก ํด์ค๋ค.
๐งจ Synchronized์ ๋ฌธ์ ์
- Java์ Sychronized๋ ํ๋์ ํ๋ก์ธ์ค ์์์๋ง ๋ณด์ฅ์ด ๋๋ค.
- ์ฆ, ์๋ฒ๊ฐ 1๋์ผ๋๋ ๋ฌธ์ ๊ฐ ์์ง๋ง ์๋ฒ๊ฐ 2๊ฐ ์ด์์ผ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ ๋ํ ์ ๊ทผ์ ๋ง์ ์ ์๋ค.
⇒ Synchronized๋ ์ฐ๋ฆฌ ์์คํ ํ๊ฒฝ(์ด์คํ ํ๊ฒฝ)์์๋ ์ฌ์ฉํ ์๊ฐ ์๋ค.
๐ป ReentrantLock
- Java์ ์ ์ผ ๋ํ์ ์ธ ๊ธฐ๋ฒ์ธ synchronized lock์ ๊ฒ์ ์ synchronized block ์ ์ง์ ๋ฐ ํ์ถ ์์ฒด์ ๋น์ฉ์ด ์๋ชจ๋๊ธฐ ๋๋ฌธ์ ๋จ๋ฐํ๊ฒ ๋ ๊ฒฝ์ฐ ์ฑ๋ฅ ์์ ๋ฌธ์ ๊ฐ ๋ ์ ์๊ณ , ์ธ์ธํ ์์ (ํน์ ์๊ฐ์ ๊ธฐ๋ค๋ฆฌ๊ณ , ๊ทธ ์์ ์ฒ๋ฆฌ๊ฐ ์๋ ๊ฒฝ์ฐ ํจ์ค ํน์ lock์ ์ก๋ ์์๋ฅผ ๋ณด์ฅ ๋ฑ) ๋ํ ์ด๋ ค์์ด ์๋ค.
- Syncronized๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋์ Thread๊ฐ ์ํ ์ ๋ณด๋ฅผ ์ป์ ์ ์๊ณ , Syncronized ๊ตฌ๋ฌธ์ ๋ง์ฃผํ์ ๋ ๋๊ตฐ๊ฐ ํด๋น ๊ฐ์ฒด์ Locking์ Release ํ๊ธฐ๊น์ง ๋ฌดํํ ๊ธฐ๋ค๋ฆฌ๋ ์ ๋ฐ์ ์๋ค.
- ReentrantLock์ ๊ฒฝ์ฐ ์์ ๋จ์ ์ ๋ณด์ํ์ฌ ๋น๊ต์ ๊ฐํธํ๊ฒ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
๐งจ ReentrantLock์ ๋ฌธ์ ์
- Synchronized์ ๋์ผํ๊ฒ ReentrantLock๋ ์ดํ๋ฆฌ์ผ์ด์ ๋ด์์ ๋ฉํฐ์ค๋ ๋๊ฐ ๋์์ ์ง์ ํ๋๊ฒ์ ๋ง๋๊ฒ๋ง ๊ฐ๋ฅํ๊ณ ,
- ๋ค์์ ์๋ฒ๊ฐ ์๋ํ๊ณ ์์ ๋ ๊ฐ ์๋ฒ์ ์ค๋ ๋์ ๋์ ์ ๊ทผ์ ๋ง์ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ ์๋น์ค์์๋ ์ฌ์ฉํ ์ ์๋ค.
๐ป Redisson Lock
- Redisson Client์ ๋ถ์ฐ๋ฝ ๊ธฐ๋ฒ :
- Lock์ ํ์์์์ ์ง์ ํ ์ ์์ด์ ๋ฌดํ์ ๋๊ธฐ ์ํ๋ก ๋น ์ง ์ ์๋ ์ํ์ด ์์
- pub/sub๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ์คํ๋ฝ์ ์ฌ์ฉํ์ง ์์<aside> ๐ pub/sub ๊ธฐ๋ฅ์ ์ด์ฉํ Redisson์ Lock ํ๋ ํ๋ก์ธ์ค2.1 ๋ฝ ํ๋์ ์คํจํ๋ฉด ๋ค์ ๋ฝ ํด์ ๋ฉ์ธ์ง๋ฅผ ๊ธฐ๋ค๋ฆผ 2.2 ํ์์์์๊น์ง ์ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ณตํ๋ค๊ฐ ํ์์์ ์๊ฐ์ด ์ง๋๋ฉด ์ต์ข ์ ์ผ๋ก false๋ฅผ ๋ฐํํ๊ณ ๋ฝ ํ๋์ ์คํจํ์์ ์๋ฆผ
- </aside>
- 1. tryLock์ ํธ์ถํ์ฌ ๋ฝ ํ๋์ ์ฑ๊ณตํ๋ฉด True๋ฅผ ๋ฐํ 2. Pubsub๋ฅผ ์ด์ฉํ์ฌ ๋ฉ์ธ์ง๊ฐ ์ฌ ๋ ๊น์ง ๋๊ธฐํ๋ค๊ฐ ๋ฝ์ด ํด์ ๋์๋ค๋ ๋ฉ์ธ์ง๊ฐ ์ค๋ฉด ๋๊ธฐ๋ฅผ ํ๊ณ ๋ค์ ๋ฝ ํ๋์ ์๋
- ⇒ ๋ฝ์ด ํด์ ๋๋ฉด ๋ฝ์ subscribeํ๋ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฝ์ด ํด์ ๋์๋ค๋ ์ ํธ๋ฅผ ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ํด๋ผ์ด์ธํธ๋ค์ ๋ฝ ํ๋ ํ์ธ ์์ฒญ์ redis๋ก ๋ณด๋ด์ง ์์
โ Redisson์ผ๋ก ์ ํํ ์ด์
- Redisson์ TryLock ๋ฉ์๋์ ํ์์์์ด ๊ตฌํ๋์ด ์์ ⇒ ํ์์์์ ์ค์ ํ์ฌ ๋ฐ๋๋ฝ์ ๋ฐฉ์ง
- ์คํ๋ฝ์ ์ฌ์ฉํ์ง ์์์ Redis์ ๋ง์ ๋ถํ๋ฅผ ๊ฐํ์ง ์์ ⇒ pub/sub(๋ฐํ/๊ตฌ๋ ) ์์คํ ์ ์ด์ฉํ์ฌ ์คํ๋ฝ์ ์ฌ์ฉํ์ง์์
- ๋ค์์ ์๋ฒ์ ํ๊ฒฝ์์ ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ์ ์ํด์ DB Lock ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ์ผํ๊ณ Redis๋ฅผ ์ด๋ฏธ ๊ตฌ์ถํ์ฌ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํ์ฉํ์ฌ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ก ํจ
Lock ์ธ์ ๋น๋๊ธฐ์ ์ผ๋ก ํด๊ฒฐํ ์๋ ์์๊น? ๐
Spring Batch + Scheduler๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ์ ๋ฐ์ดํธ ์ฒ๋ฆฌ!
- ๋ฆฌ๋ทฐ ๋ฑ๋ก์ ์คํ ์ด ์ ๋ณด๊ฐ ๊ฐฑ์ ๋์ด์ผ ํ๋ ํ๋ก์ธ์ค
- ๋งค๋ฒ ๋ฆฌ๋ทฐ๊ฐ ์์ฑ๋ ๋ ๋ง๋ค ์คํ ์ด ์ ๋ณด๊ฐ ์ ๋ฐ์ดํธ๊ฐ ๋ ๊ฒฝ์ฐ ๋ฆฌ๋ทฐ ์์ฑ ํ์๊ฐ ๋ง์ด ๋ฐ์ํ๋ ํ๊ฒฝ์์๋ ์๋น์ค์ ๋ถ๋ด ๊ณผ์ค
- ๋ฆฌ๋ทฐ ๋ฑ๋ก ์ ๋ฝ์ ์ฌ์ฉํ์ง์๊ณ ์ ๋ฐ์ดํธ๊ฐ ๋ ํญ๋ชฉ๋ค์ Redis Cache์ ์ ์ฅํ๊ณ ์๋ค๊ฐ ์ผ๊ด์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ๋ณ๊ฒฝ
1๏ธโฃ. ๋ฆฌ๋ทฐ ์์ฑ ์ Database์ ๋ฆฌ๋ทฐ๋ฅผ ์ ์ฅํ๊ณ , Redis Cache์๋ ๋ฆฌ๋ทฐ๊ฐ ์์ฑ๋ ์คํ ์ดID๋ฅผ ์ ์ฅํ๋ค
2๏ธโฃ. ์ผ์ ์๊ฐ๋ง๋ค ์ค์ผ์ค๋ฌ๊ฐ ๋์ํ๋ฉด์ Redis Cache์ ์ ์ฅ๋ ์คํ ๋ฆฌ ID๋ฅผ ์ฝ๊ณ , ๋ฐฐ์น ํ์ดํ๋ผ์ธ์ ํตํด ์คํ ์ด ์ ๋ณด๋ฅผ ๊ฐฑ์ ํ๋ค.
→ https://www.notion.so/With-Redis-6ecbacdfa5fc450081528e56ef5e1d83
์คํ ์ด ์ ๋ณด ๊ฐฑ์ ๋ฐฉ๋ฒ(With.Redis)โ
์์ฑ์ : kyuu ๐
www.notion.so
3๏ธโฃ. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๋ณด๊ฐ ์ ๋ฐ์ดํธ๋๋ฉด Logstash๊ฐ ๋ณ๊ฒฝ๋ ์ ๋ณด๋ฅผ ์ถ์ ํ์ฌ Elastic Search์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
๊ทธ ์ธ ๐
์ด๋ฐ์๋ ๋์์ฑ ์ด์ ๊ด๋ จ ๋ด์ฉ์ ์๋์ ๋ ธ์ ์ ์ฐธ์กฐํด์ฃผ์ธ์~!
https://www.notion.so/PIN-TABLE-721fb45b91454dda8255e0de4ac757ca
[PIN-TABLE] ๋์์ฑ ์ ์ด
๋์ ์ด์
www.notion.so
'๐ ํด์ 99 ์ค์ ํ๋ก์ ํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํญํด99] ์ค์ ํ๋ก์ ํธ ๋ง์ง๋ง WIL (1) | 2023.02.19 |
---|---|
[๊ณ ๋ฏผ ์กฐ๊ฐ ๋ชจ์] 06. ๋์ฉ๋ ํธ๋ํฝ ๋ถํ๋ถ์ฐ (0) | 2023.02.19 |
[๊ณ ๋ฏผ ์กฐ๊ฐ ๋ชจ์] 04. ๊ฒ์ ์ฑ๋ฅ ๊ฐ์ (0) | 2023.02.19 |
[๊ณ ๋ฏผ ์กฐ๊ฐ ๋ชจ์] 03. Front ๊ตฌ์ฑ (0) | 2023.02.19 |
[๊ณ ๋ฏผ ์กฐ๊ฐ ๋ชจ์] 02. ์ํคํ ์ฒ ์ค๊ณ (0) | 2023.02.12 |