๐ ์ค๋์ ์ด๋ค ํ๋ฃจ์์ง..
MVP ๊ตฌํํ ๊ฒ ์ค์์ ๋ถ์กฑํ ๋ถ๋ถ์ ์ฑ์ ๋ฃ๊ณ GlobalExceptionHandler๋ฅผ ํ์ฉํด์ ์์ธ ์ฒ๋ฆฌ๋ค์ ์์ ํ๋ค.
ํ๋ฐฐ์ฌ, ์ถ๊ณ ์ง(๋ฌผ๋ฅ์ผํฐ), ๋ฐฐ์ก, ์ก์ฅ ๋๋ฉ์ธ์ ์ฒ์ฒํ ๋๋ฌ๋ณด๋ฉด์ ๋น ์ง ๋ก์ง์ ์ถ๊ฐํ๊ณ , ์ข ๋ ํจ์จ์ ์ผ ์ ์๋๋ก ์์ ์ ์งํํ๋ค.
๊ทธ ๊ณผ์ ์์ ์ถ๊ฐ์ ์ผ๋ก ์ฌ๊ณ ๋ถ๋ถ์ ๋งก๊ธฐ๋ก ํด์ ์ด๋์ ์ฌ๊ณ ๊ด๋ จ ๋ก์ง์ด ๋ค์ด๊ฐ๋ฉด ์ข์์ง ์๊ฐ๋ ํด๋ดค๋ค.
์์ง ๋ก์ง์ด ํ์คํ๊ฒ ๋จธ๋ฆฌ์ ์กํ์ง ์์์ ๊ณ์ ์๊ฐ์ ํด๋ด์ผ ํ ๊ฒ ๊ฐ๋ค.
๐ก ์๋กญ๊ฒ ์๊ฒ ๋ ๋ด์ฉ์ ๋ญ๊ฐ ์๋๋ผ..?!
๐ก findById() vs getReferenceById() ์ฐจ์ด ์์ ์ ๋ฆฌ
Spring Data JPA๋ฅผ ์ฌ์ฉํ ๋, ์ํฐํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ผ๋ก findById()์ getReferenceById()๊ฐ ์๋ค.
๋ ๋ฉ์๋๋ ์ ์ฌํด ๋ณด์ด์ง๋ง ๋์ ๋ฐฉ์๊ณผ ์ฌ์ฉ ์ ์ฃผ์์ฌํญ์ด ๋ค๋ฅด๋ค.
โ ๊ธฐ๋ณธ ์ค๋ช
๋ฉ์๋ | ์ค๋ช |
findById() | ์ฆ์ DB์์ ์กฐํํ์ฌ ์ค์ ์ํฐํฐ๋ฅผ ๋ฐํ. Optional<T> ํํ๋ก ๋ฐํ๋จ |
getReferenceById() | ํ๋ก์ ๊ฐ์ฒด ๋ฐํ. ์ค์ ํ๋์ ์ ๊ทผํ๋ ์๊ฐ DB์์ ์กฐํ๋จ (Lazy Loading) |
โ ์ฌ์ฉ ์์
๐ findById()
Courier courier = courierRepository.findById(id)
.orElseThrow(() -> new RuntimeException("์กด์ฌํ์ง ์๋ ํ๋ฐฐ์ฌ์
๋๋ค."));
- DB์ ์ฆ์ ์ฟผ๋ฆฌ๊ฐ ์คํ๋จ
- ์กด์ฌํ์ง ์์ผ๋ฉด ๋ฐ๋ก ์์ธ๋ฅผ ๋์ง ์ ์์
๐ getReferenceById()
Courier courier = courierRepository.getReferenceById(id);
- ์ฟผ๋ฆฌ๊ฐ ๋ฐ๋ก ์คํ๋์ง ์์
- ์ค์ ๋ก courier.getName()์ฒ๋ผ ํ๋์ ์ ๊ทผํ ๋ DB ์กฐํ๊ฐ ์ผ์ด๋จ
- ํด๋น ID๊ฐ ์กด์ฌํ์ง ์์ ๊ฒฝ์ฐ, ๊ทธ๋ EntityNotFoundException ๋ฐ์
โ ์ฐจ์ด์ ๋น๊ตํ
ํญ๋ชฉ findById() getReferenceById()
ํญ๋ชฉ | findById() | getReferenceById() |
๋ฐํ ๊ฐ์ฒด | Optional<T> | ํ๋ก์ ๊ฐ์ฒด (T) |
DB ์ ๊ทผ ์์ | ์ฆ์ ์ฟผ๋ฆฌ ์คํ | ์ค์ ํ๋ ์ ๊ทผ ์์ |
์์ธ ๋ฐ์ ์์ | ์กฐํ ์ฆ์ orElseThrow() | ํ๋ ์ ๊ทผ ์์ |
ํธ๋์ญ์ ํ์ ์ฌ๋ถ | ์์ด๋ ๊ฐ๋ฅ | ๋ฐ๋์ ํ์ (Lazy Loading) |
์ฃผ์ ์ฌ์ฉ ์ฉ๋ | ์ํฐํฐ ์ค์ ์กฐํ | ์ฐธ์กฐ๋ง ํ์ํ ๊ฒฝ์ฐ (ex. ์ธ๋ ํค ๋งคํ ๋ฑ) |
โ ์ฌ์ฉ ์์ ์ถ์ฒ
์ํฉ ์ถ์ฒ ๋ฉ์๋ ์ด์
์ํฉ | ์ถ์ฒ ๋ฉ์๋ | ์ด์ |
์ํฐํฐ๋ฅผ ์ค์ ๋ก ์ฌ์ฉํด์ผ ํ ๋ | findById() | ์์ ์ ์ด๊ณ ๋ช ํํ ์์ธ ์ฒ๋ฆฌ ๊ฐ๋ฅ |
์ฐ๊ด ์ํฐํฐ๋ฅผ ๋จ์ํ ๋งคํํ ๋ (ํ๋ ์ ๊ทผ ์ ํ ๋) | getReferenceById() | ํ๋ก์๋ง ์ฃผ์ ํ๋ฏ๋ก ์ฑ๋ฅ ํจ์จ์ |
์กด์ฌ ์ฌ๋ถ๋ง ๋จผ์ ํ์ธํ๊ณ ์ถ์ ๊ฒฝ์ฐ | existsById() + getReferenceById() | ๋จ, ์ฟผ๋ฆฌ 2๋ฒ ๋ฐ์ํ๋ฏ๋ก ์ํฉ์ ๋ฐ๋ผ ์กฐ์ |
โ ๏ธ ์ฃผ์์ฌํญ
- getReferenceById()๋ ํธ๋์ญ์ ์ด ์ ์ง๋์ง ์์ผ๋ฉด LazyInitializationException์ด ๋ฐ์ํ ์ ์๋ค.
- getReferenceById()๋ก ๋ฐํ๋ ํ๋ก์๋ ํ๋ ์ ๊ทผ ์์ ์ ์์ธ๊ฐ ๋ฐ์ํ๋ฏ๋ก ๋๋ฒ๊น ์ด ์ด๋ ค์ธ ์ ์๋ค.
- ์ค๋ฌด์์๋ ๋๋ถ๋ถ findById().orElseThrow() ๋ฐฉ์์ด ๋ ์์ ์ ์ด๋ค.
โจ ๊ฒฐ๋ก
- ์ผ๋ฐ์ ์ธ CRUD ์ฒ๋ฆฌ์์๋ findById() ์ฌ์ฉ์ ๊ธฐ๋ณธ์ผ๋ก ํ์.
- ์ฑ๋ฅ์ ๋ฏธ์ธํ๊ฒ ์ต์ ํํ๊ฑฐ๋, ์ฐ๊ด ๊ด๊ณ๋ง ๋งบ๊ณ ํ๋ ์ ๊ทผ์ด ์๋ ๊ฒฝ์ฐ์๋ getReferenceById()๋ ์ ํจํ๋ค.
๐ ๋ง๋ฌด๋ฆฌ ์์ฝ
โ findById()๋ ์ง๊ธ ๋น์ฅ DB์์ ๊บผ๋ด์ค๋ ๋ฐฉ์
โ getReferenceById()๋ "ํ์ํ๋ฉด ๊ฐ์ ธ์ฌ๊ฒ"๋ผ๋ ์ง์ฐ ๋ก๋ฉ ๋ฐฉ์
๐ ๋ฝ ๊ฒฝํฉ (Lock Contention)์ด๋?
โ ๊ฐ๋
- "์ฌ๋ฌ ํธ๋์ญ์ ์ด ๋์์ ๊ฐ์ ์์(๋ ์ฝ๋)์ ์ ๊ทธ๋ ค ํ๋ฉด์ ์ถฉ๋์ด ๋ฐ์ํ๋ ํ์"
- ๋ํ์ ์ผ๋ก ๋น๊ด์ ๋ฝ(FOR UPDATE) ์ฌ์ฉ ์ ๋ฐ์
โ ์์ ์ํฉ
- ์ํ ์ฌ๊ณ ๊ฐ 5๊ฐ์ธ๋ฐ 100๋ช ์ด ๋์์ ๋ฐฐ์ก์ ์์ฒญํจ
- ์ฒซ ๋ฒ์งธ ํธ๋์ญ์ ์ด ๋ฝ์ ์ก๋ ๋์ ๋๋จธ์ง๋ ๋๊ธฐ
- ์ด๋ก ์ธํด ์์คํ ์๋ต ์ง์ฐ, ํ์์์, ์ปค๋ฅ์ ๊ฒฝํฉ์ด ๋ฐ์
โ ๋ฌธ์ ์
- ๋๊ธฐ ์๊ฐ ์ฆ๊ฐ → ์ฌ์ฉ์ ์๋ต ์ง์ฐ
- ๋ฝ ๋๊ธฐ ์ค ํธ๋์ญ์ ์ด ๋๋ฌด ์ค๋ ๋จธ๋ฌด๋ฅด๋ฉด LockTimeoutException ๋ฐ์ ๊ฐ๋ฅ
- ๋ฝ ๋๊ธฐ ์๊ฐ ๋ง์์ง๋ฉด DB ์ปค๋ฅ์ ๊ณ ๊ฐ ์ํ
๐ง ํด๊ฒฐ ๋ฐฉ๋ฒ
- ํธ๋์ญ์ ๋ฒ์ ์ต์ํ: ๋ถํ์ํ ์์ ์ ๋ฝ ๋ฐ์์ ์ฒ๋ฆฌ
- ๋ฝ ํ์์์ ์ค์ (innodb_lock_wait_timeout)
- ์์๋ณ๋ก ๋ถ๋ฆฌ๋ ๋ฝ์ ์ฌ์ฉํ์ฌ ์ถฉ๋ ๋ถ์ฐ (ex. ์ํ ID ๋จ์๋ก ๋ฝ)
- ์ฑ๋ฅ์ด ์ค์ํ ๊ฒฝ์ฐ ๋๊ด์ ๋ฝ ๋๋ ๋ฉ์์ง ํ ๋ฐฉ์์ผ๋ก ๊ตฌ์กฐ ์ ํ ๊ณ ๋ ค
๐๏ธ ๋ด์ผ์ ๋ญ ํ์ง?!
'๐ฅ๏ธ ๋ญ๊ฐ๋ญ๊ฐํ๋ก์ ํธ > โ๏ธ TIL' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[TIL] ํ๋ก์ ํธ 9์ผ์ฐจ.. ์ฌ๊ณ ๊ฐ์ ๋ก์ง ๊ตฌํ ๋๋ด๊ธฐ!! (0) | 2025.05.27 |
---|---|
[TIL] ํ๋ก์ ํธ 8์ผ์ฐจ.. ์ถ๊ฐ ๋ก์ง ์๊ฐํ๋ค ๋จธ๋ฆฌ๊ฐ ํฐ์ ธ๋ฒ๋ ค.. (1) | 2025.05.26 |
[TIL] ํ๋ก์ ํธ 3์ผ์ฐจ!! (0) | 2025.05.22 |
[TIL] ํ๋ก์ ํธ 2์ผ์ฐจ!! (0) | 2025.05.22 |
[TIL] ํ๋ก์ ํธ ์์!! (0) | 2025.05.19 |