3. Technical Issue - tastingcode/standard GitHub Wiki
โ ๋์ ์ฃผ๋ฌธ ์ฒ๋ฆฌํ๊ธฐ
- ์ํ ๋์ ์ฃผ๋ฌธ
- synchronized ์ ์ธ
- Facade Layer ์ฃผ๋ฌธ ์ฒ๋ฆฌ
- ๋๊ด์ ๋ฝ ๋ชจ๋ ์ ์ฉ
- ๊ฒฐ๋ก - ๋์์ฑ ์ด์ ํด๊ฒฐ
- ๐ Issue Posting
1. ์ํ ๋์ ์ฃผ๋ฌธ
- ๋ค์๊ณผ ๊ฐ์ ์ํ์ 20๋ช ์ด ๋์์ 5๊ฐ์ฉ ๊ตฌ๋งคํ๋ค๋ฉด ๊ฒฐ๊ณผ๋ ์ด๋ป๊ฒ ๋์ฌ ๊ฒ์ธ๊ฐ?
์ํ๋ช : A ์ฌ๊ณ : 100
๐ ์ํ ๋์ ์ฃผ๋ฌธ ํ ์คํธ
๊ฒฐ๊ณผ : 20๊ฐ์ ์ฃผ๋ฌธ ์ฒ๋ฆฌ ์ค 3๊ฑด๋ง ์ฒ๋ฆฌ๋จ
2. synchronized ์ ์ธ
- ์ฃผ๋ฌธ ์ฒ๋ฆฌ ๋ก์ง์ synchronized๋ฅผ ์ ์ธํ๋ฉด ์ ์์ ์ธ ์ฌ๊ณ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ๊ฒ์ธ๊ฐ?
๊ฒฐ๊ณผ : ์ฒ๋ฆฌํ ์ ์๋ ์ฃผ๋ฌธ์ ์์ ๋์์ผ๋ ์ฌ์ ํ ๋์์ฑ ์ด์๋ฅผ ํด๊ฒฐํ์ง ๋ชปํจ
๐ซ ์ฌ์ ํ ๋์์ฑ ์ด์๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ ํธ๋์ญ์ ์ ๋์์๋ฆฌ์ ๊ธฐ์ธํ ๊ฒ์ด๋ค.
๐ @Transactional์ ๋์์๋ฆฌ
- @Transactional์ด ์ ์ฉ๋ ํด๋์ค๋ CGLIB์ ์ํด์ ํด๋์ค ๊ธฐ๋ฐ ํ๋ก์๊ฐ ์์ฑ๋๋ค.
- ํด๋น ๋ก์ง์ผ๋ก ์ง์ ํ๊ธฐ ์ /ํ AOP Proxy๋ฅผ ํตํด์ ๋ค์๊ณผ ๊ฐ์ด ํธ๋์ญ์ ์ ์์ ๋ฐ ์ปค๋ฐ/๋กค๋ฐฑ์ด ์งํ๋๋ค.
- ์ฃผ๋ฌธ์ฒ๋ฆฌ ๋ก์ง์ synchronized๊ฐ ์ ์ธ๋์ด, ๋จผ์ ๋์ฐฉํ ์ฐ๋ ๋๊ฐ ํด๋น ๋ก์ง์ ์ฒ๋ฆฌํ ๋ Monitor Lock์ ํ๋ํ๊ฒ ๋๋ค.
- Lock์ ํ๋ํ์ง ๋ชปํ ๋๋จธ์ง ๋ชจ๋ ์ฐ๋ ๋๋ค์ Lock์ ํ๋ํ๊ธฐ ์ํด ๋๊ธฐํ๋ค.
- ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด Thread-1 ์ด ๋ก์ง์ ๋ง์น๊ณ ์ปค๋ฐ/๋กค๋ฐฑ ์์ ์ผ๋ก ์ง์ ํ๋ ๊ทธ ์๊ฐ ๋ค์ ์ฐ๋ ๋๊ฐ Lock์ ํ๋ํ๊ณ ๋ก์ง์ ์ํํ๋ค.
- ์ด ๋ Thread-1์ด commit๋๊ธฐ ์ ์ด๋ฏ๋ก ํน์ ์ํ์ ์ฌ๊ณ ์ฒ๋ฆฌ๊ฐ ์ด๋ฃจ์ด์ง์ง ์์ ์ฑ Thread-2์ ์ฃผ๋ฌธ์ฒ๋ฆฌ๊ฐ ์งํ๋๋ค.
๐ซ ์์ ๊ฐ์ ์ด์ ๋ก ๋์์ฑ ์ด์๊ฐ ๋ฐ์ํ๊ณ ์๋ ์ํฉ์ด๋ค.
3. Facade Layer ์ฃผ๋ฌธ ์ฒ๋ฆฌ
- ํธ๋์ญ์ ์ ๋์์๋ฆฌ์ ๊ธฐ์ธํ ๋์์ฑ ์ด์๊ฐ ๋ฐ์ํ์ง ์๋๋ก Facade Layer์์์ ์ฃผ๋ฌธ ์ฒ๋ฆฌ
๐ ๊ธฐ์กด์ synchronized๋ฅผ ์ง์ฐ๊ณ Facade Layer์ ์ฃผ๋ฌธ ์ฒ๋ฆฌ ๋ก์ง์ synchronized ์ ์ธ
๊ฒฐ๊ณผ : Facade Layer์์ ์ฃผ๋ฌธ ์ฒ๋ฆฌ ์๋น์ค๋ฅผ ํธ์ถํ์ฌ ๋์ ์ฃผ๋ฌธ ์ฒ๋ฆฌ๋ฅผ ๋ชจ๋ ์ ์์ ์ผ๋ก ์ํํจ.
4. ๋๊ด์ ๋ฝ ๋ชจ๋ ์ ์ฉ
- ์๊ณ ์์ญ๋ง ์ ํํ๋๊ฒ์ด ์๋ ๋ฉ์๋๋ ์ฝ๋ ๋ธ๋ก์ ๋๊ธฐํ ํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ์ฑ๋ฅ ์ ํ๊ฐ ์ฐ๋ ค๋๋ค.
- ๋ฝ ๊ฒฝํฉ : ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์ผํ synchronized ๋ธ๋ก์ ์ง์ ํ๋ ค๊ณ ํ ๋ ๊ฒฝํฉ์ด ๋ฐ์
- ์ค๋ ๋ ๋๊ธฐ : synchronized ๋ธ๋ก์ ์ง์ ํ์ง ๋ชปํ ์ค๋ ๋๋ ๋๊ธฐ --> ๋ฆฌ์์ค ๋ญ๋น์ ๋๊ธฐ ์๊ฐ ์ฆ๊ฐ
์์ ๊ฐ์ ์ด์ ๋ก ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์กฐ ๋ณ๊ฒฝ
- ์ผํ๋ชฐ ํน์ฑ ์ ๋์ ์ฃผ๋ฌธ ์์ฒญ์ ๋ฐ๋ฅธ ์ฆ์ ํธ๋์ญ์ ์ถฉ๋์ด ์ผ์ด๋ ๊ฒ์ผ๋ก ๋ณด์ด์ง ์์
- synchronized โก @lock-optimistic
5. ๊ฒฐ๋ก - ๋์์ฑ ์ด์ ํด๊ฒฐ
โ ๊ฒฐ๋ก : ์์ ๊ฐ์ด ์ํ ์กฐํ ์ ๋๊ด์ ๋ฝ ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ๊ฐ ๊ฒฉ๋ฆฌ์ฑ ๋ณด์ฅ์ผ๋ก ๋์์ฑ ์ด์๋ฅผ ํด๊ฒฐํจ
๐ Issue Posting
โ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๊ด๋ฆฌํ ๊น?
- ์นดํ ๊ณ ๋ฆฌ ์ค๊ณ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๊ด๋ฆฌโ๐ค
- Enum์ผ๋ก ๊ด๋ฆฌโ๐
- ๐ Enum : Category
- Json์ผ๋ก ๋ณํ ๐
- ๊ฒฐ๋ก - Enum์ผ๋ก ๊ด๋ฆฌ
1. ์นดํ ๊ณ ๋ฆฌ ์ค๊ณ
- ์ํ ์นดํ
๊ณ ๋ฆฌ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ค๊ณ
- ์นดํ ๊ณ ๋ฆฌ ๋ณ๋ก depth๋ฅผ ๊ฐ์ง ์ ์๋ค.
- ์ํ์ ์ถ๊ฐ๋ ๋ง์ง๋ง ์นดํ ๊ณ ๋ฆฌ(๋ฆฌํ ์นดํ ๊ณ ๋ฆฌ)์์๋ง ํ ์ ์๋ค.
- ์ํ์ ์นดํ ๊ณ ๋ฆฌ๋ก ์กฐํํ ์ ์๋ค.
- ์นดํ ๊ณ ๋ฆฌ ์กฐํ ์ ํ์ ์นดํ ๊ณ ๋ฆฌ ์กฐํ๊ฒฐ๊ณผ๋ฅผ ํฌํจํด์ผ ํ๋ค.
2. ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๊ด๋ฆฌโ๐ค
- ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ก ๊ด๋ฆฌํ ์ ์๊ธฐ๋ ํ๋ฐ...
๐ซ ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ์ ๋ค์ด ์กด์ฌํจ
-
ํด๋ผ์ด์ธํธ์ ์์ฒญ๋ง๋ค ๋งค๋ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํด์ผ ํ๋ค.
- ํธ๋ํฝ์ด ๋ง์ ์๋น์ค๋ผ๊ณ ๊ฐ์ ํ ๋, ์นดํ ๊ณ ๋ฆฌ์ ์ํด์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ๋งค๋ฒ ๋ณต์กํ ์ฟผ๋ฆฌ ์กฐํ๋ก ์ธํ ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํจ๋ค.
-
RDB ํ ์ด๋ธ์ด ์นดํ ๊ณ ๋ฆฌ ๊ณ์ธตํ ๊ตฌ์กฐ๋ฅผ ํํํ๊ธฐ์ ์ ํฉํ์ง ์๋ค.
- ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ํํํ๊ธฐ ์ํด depth, ๋ถ๋ชจ, ์์ ์นดํ ๊ณ ๋ฆฌ์ ๊ฐ ๋ฑ์ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์ปฌ๋ผ์ผ๋ก ์กด์ฌํด์ผ ํ๋ค.
- ์ด๋ ๊ณ์ธต ๊ตฌ์กฐ ํ์ ๋ฐ ์ํ๋ ์นดํ ๊ณ ๋ฆฌ์ ์ ๊ทผํ๋ ๋ฐ ์์ด์ ์ฟผ๋ฆฌ์ ๋ณต์ก๋๋ฅผ ์ฆ๊ฐ์ํจ๋ค.
-
๊ธฐํ
- ์ํ๊ณผ ์ํ์นดํ ๊ณ ๋ฆฌ ํ ์ด๋ธ์ ์กฐ์ธ ๋ฐ์์ผ๋ก ์ธํ ์ฑ๋ฅ ์ด์
- ์ฝ๋ ๋ ๋ฒจ์ด ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ ๋ฒจ์์ ์นดํ ๊ณ ๋ฆฌ ๊ด๋ฆฌ ๋ฑ
3. Enum์ผ๋ก ๊ด๋ฆฌโ๐
- ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก Enum์ผ๋ก ๊ด๋ฆฌ
- ์นดํ ๊ณ ๋ฆฌ๋ ๋ณ๊ฒฝ๋ ์ผ์ด ๊ฑฐ์ ์์
- DB๋ฅผ ํตํด ์ ๊ทผํ์ง ์์์ผ๋ก์จ ์ฑ๋ฅ ํฅ์
- ๊ฐ๋ฐ ๋ฐ ์ด์ ์ ํ ๋์ ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ํ์ธ ๊ฐ๋ฅ
๐ Enum : Category
4. Json์ผ๋ก ๋ณํ ๐
Enum ํ์ ์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ Json์ผ๋ก ๋ณํํ๊ธฐ ์ํด ๋ค์ ๊ณผ์ ์ ์ํํ๋ค.
- ObjectMapper๋ฅผ ์ฌ์ฉํ์ฌ JSON ๋ ธ๋ ์์ฑ
- ๊ธฐ๋ณธ ์์ฑ ์ถ๊ฐ - code, name
- ํ์ ์นดํ ๊ณ ๋ฆฌ๋ฅผ ์ฌ๊ท์ ์ผ๋ก ์ฒ๋ฆฌ
๐ @Service : CategoryService
๋ฐํ๋๋ CategoryNode๋ ๋ค์๊ณผ ๊ฐ์ด 3์ฐจ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
5. ๊ฒฐ๋ก - Enum์ผ๋ก ๊ด๋ฆฌ
โ ๊ฒฐ๋ก : ์ ์ ๋ฐ์ดํฐ์ ๊ฐ๊น์ด ์นดํ ๊ณ ๋ฆฌ๋ฅผ ํ ์ด๋ธ์ด ์๋ Enum์ ํ์ฉํ์ฌ ๋ค์ํ ์ด์ ์ ์ป์ ์ ์๋ค.
โ ํ์ด์ง ์ฒ๋ฆฌ ์ฌ์ฌ์ฉํ๊ธฐ
- ํ์ด์ง ์ฒ๋ฆฌ ๊ณ ๋ฏผ
- ํ์ด์ง ์ฒ๋ฆฌ ์ค๊ณ
- ํ์ด์ง ์ฒ๋ฆฌ ๊ตฌํ
- ๐ PageResultDto
- ํ์ด์ง ์ฒ๋ฆฌ ํ
์คํธ
- ๐ Method : getReviewList
- ๐ Test : getReviewList
- ๊ฒฐ๋ก - ๋คํ์ฑ ๊ตฌํ
1. ํ์ด์ง ์ฒ๋ฆฌ ๊ณ ๋ฏผ
- ๋ฐ์ดํฐ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ
ํ๋ฆฟํ ํ ์ ์์๊น?
- ์ผ๋ฐ์ ์ผ๋ก ์น์์ ๋ฐ์ดํฐ๋ค์ ์กฐํํ ๋ ๋๋ถ๋ถ ํ์ด์ง ์ ๋ณด๊ฐ ํฌํจ๋์ด ์๋ค.
- ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํ์ด์ง ํ ํ๋ฆฟ์ ๋ง๋ค๋ฉด ๋ค์ํ ๊ณณ์์ ํ์ฉ๋ ์ ์๋ค.
- โ ์์ํ ์ํฐํฐ์ ๋ฐ์ดํฐ ํ์ด์ง ์ฒ๋ฆฌ๋ฅผ ํ ํ๋ฆฟํ ํ์ฌ ์ํํ์ ์กฐํํด๋ณด์!
2. ํ์ด์ง ์ฒ๋ฆฌ ์ค๊ณ
- ํ์ด์ง ๋ฐ์ดํฐ๋ dto ๋ชฉ๋ก๊ณผ ํ์ด์ง ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
- ๋ค์ํ ํ์ ์ ์ํฐํฐ๋ฅผ dto ๋ชฉ๋ก์ผ๋ก ๋ณํํ ์ ์์ด์ผ ํ๋ค.
- ์ฌ์ฌ์ฉ์ ์ํด ์ ๋ค๋ฆญ๊ณผ Function ๊ฐ์ฒด๋ฅผ ์ ๊ทน ํ์ฉํ๋ค!
3. ํ์ด์ง ์ฒ๋ฆฌ ๊ตฌํ
๋ค์๊ณผ ๊ฐ์ด PageResultDto๋ฅผ ๊ตฌํํ ์ ์๋ค.
- ๋คํ์ฑ์ ๊ตฌํํ๊ธฐ ์ํด ์ ๋ค๋ฆญ๊ณผ ํจ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค. ๐ PageResultDto
4. ํ์ด์ง ์ฒ๋ฆฌ ํ ์คํธ
ํ์ด์ง ์ฒ๋ฆฌ๋ ์ํํ๋ค์ ์กฐํํ๊ธฐ ์ํด ์๋์ ๊ฐ์ด ์งํํ๋ค.
- ์ํ์ ๋ณด์ pageable์ ์ด์ฉํด ํ์ด์ง ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ค.
- ์ํฐํฐ๋ฅผ dto๋ก ๋ณํํ๋ ํจ์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ค.
- ํ์ด์ง ๋ฐ์ดํฐ์ ํจ์ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ PageResultDto๋ฅผ ์์ฑํ๋ค.
PageResultDto๋ฅผ ์ฌ์ฉํ์ฌ ์ํํ ์กฐํ ํ
์คํธ ๊ฒฐ๊ณผ ๋ชจ๋ ์ ์ ํต๊ณผํ์์์ ํ์ธํ ์ ์๋ค.
๐ Test : getReviewList
5. ๊ฒฐ๋ก - ๋คํ์ฑ ๊ตฌํ
โ ๊ฒฐ๋ก : ๋ค์๊ณผ ๊ฐ์ด ๋คํ์ฑ์ ๊ตฌํํ PageResultDto์ ์ฌ์ฉํ์ฌ ์ํํ์ ์กฐํํ ์ ์๋ค.