๊ฐ์์ฑํ
๋ฐฉ ๋ฉ์ธ์ง ์ฝ์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ฌ์ฉ์๊ฐ ๋ง์ง๋ง์ผ๋ก ์ฝ์ ๋ฉ์ธ์ง๋ฅผ ์ถ์ ํ์ฌ, ์ฝ์ง ์์ ๋ฉ์ธ์ง์ ๊ฐ์๋ฅผ ํ์ธํ๊ณ ๊ฐ ๋ฉ์ธ์ง์ ๋ํด '์ฝ์ง ์์ ๊ฐ์ (Unread Count)'๋ฅผ ํ์ํฉ๋๋ค. ๊ธฐ์กด์ ๋ฉ์ธ์ง ์ฝ์ ์ฒ๋ฆฌ ๊ตฌ์กฐ๋ ๊ฐ ๋ฉ์ธ์ง๋ง๋ค ํด๋น ๋ฉ์ธ์ง๋ฅผ ์ฝ์ ์ ์ ์ ID ๋ฆฌ์คํธ๋ฅผ ๊ธฐ๋กํ๊ณ , ์ฝ์ ์ ์ ID ๋ฐฐ์ด์ ๊ธธ์ด๋ฅผ ํตํด '์ฝ์ง ์์ ๊ฐ์ (Unread Count)'๋ฅผ ๊ณ์ฐํ์ต๋๋ค. ํ์ง๋ง ์ฌ์ฉ์๊ฐ ๋ง์ ์ฑํ
๋ฐฉ์ ์ฌ์ฉ์๊ฐ ์ ์ ์ฑํ
๋ฐฉ์ ๋นํด ๋ ๋ง์ ๋ฉ์ธ์ง๊ฐ ์ค๊ฐ๋ฏ๋ก, ์์ ํด์ผํ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ ๊ธฐํ๊ธ์์ ์ผ๋ก ๋์ด๋๊ฒ ๋ฉ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฉ์ธ์ง ์ฝ์ ์ฒ๋ฆฌ ๋ก์ง์ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. ๊ธฐ์กด์ ๋ฉ์ธ์ง ์ฝ์ ์ฒ๋ฆฌ ๋ก์ง๋จผ์ , ๊ธฐ์กด์ ์ฑํ
์์คํ
์ ๋ฉ์ธ์ง ์ฝ์ ์ฒ๋ฆฌ ๋ก์ง์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์์ ์ค..
๋ค์ด๊ฐ๋ฉฐ์ด๋ฒ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ๋ก์ปฌ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ผ๊ด์ฑ๊ณผ ํจ์จ์ฑ์ ๋ํด ๊ณ ๋ฏผ์ด ์์์ต๋๋ค. ํ ํ๋ก์ ํธ๊ฐ ์งํ๋จ์ ๋ฐ๋ผ, ์ฌ๋ฌ ๋ช
์ ๊ฐ๋ฐ์๊ฐ ๋์์ ์์
์ ์์ํ๊ฒ ๋์๊ณ , ํ๋ก์ ํธ๋ฅผ GitHub์์ ํด๋ก ํ ๋ค, ๋น ๋ฅด๊ฒ ๊ฐ๋ฐ์ ์์ํ ์ ์๋ ํ๊ฒฝ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํ๋ค๋ ์ ์ ๊นจ๋ฌ์์ต๋๋ค. ์ด๊ธฐ์๋ ๊ฐ ๊ฐ๋ฐ์๊ฐ Redis, MySQL, MongoDB์ ๊ฐ์ ์ธ๋ถ ๋ฐ๋ชฌ์ ๋ณ๋๋ก ์ค์นํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์๊ณ , ๊ทธ๋ก ์ธํด ์ค์ ์๋ง ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ฑฐ๋, ํ๊ฒฝ ์ธํ
์ ํ์ง ๋ชปํ ์ฑ๋ก ์งํ๋๋ ๊ฒฝ์ฐ๋ ์์์ต๋๋ค. ๋ฐ๋ผ์, ํ๋ก์ ํธ๋ฅผ ํด๋ก ํ ํ ๋ฐ๋ก ์คํ ๊ฐ๋ฅํ ํ๊ฒฝ์ ๊ตฌ์ฑํด์ผ ํ๋ค๋ ์๊ฐ์ด ๋ค์๊ณ , ์ด๋ฅผ ์ํด ๋ก์ปฌ์์ ๋
๋ฆฝ์ ์ผ๋ก ์คํํ ์ ์๋ ๊ธฐ์ ์ด ํ์ํ๋ค๊ณ ํ๋จํ์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ..
๋ค์ด๊ฐ๊ธฐ ์์ํ๋ก์ ํธ ์งํ ์ค ๋์ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ํฌ๋กค๋งํ์ฌ HashMap์ ์ ์ฅํ๋ ๋ก์ง์ ๊ตฌํํ์ต๋๋ค. ๋ชฉํ๋ 100๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๋ ๊ฒ์ด์์ผ๋, HashMap์ ์ฌ์ฉํ๋ฉด์ ๋ฐ์ดํฐ ๊ฐ์๊ฐ ์ผ์นํ์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค.๋ฌธ์ ์์ธ์ ๋ถ์ํ ๊ฒฐ๊ณผ, ๋น๋๊ธฐ ์์
์์ ๋ฐ์ํ๋ ๋์์ฑ ๋ฌธ์ ๋ก ์ธํด HashMap๋ง์ผ๋ก๋ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ์ด๋ ค์์ด ์๋ค๋ ์ ์ ์๊ฒ ๋์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด HashMap, HashTable, ConcurrentHashMap์ ์ฐจ์ด์ ์ ์ดํด๋ณด๊ณ , ๊ฐ ์๋ฃ๊ตฌ์กฐ๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋์ํ๋์ง ๋น๊ตํด๋ณด๋ ค ํฉ๋๋ค. HashMapkey์ value์ null ํ์ฉ๋๊ธฐํ๋ฅผ ๋ณด์ฅํ์ง ์์HashMap์ ์ค๋ ๋ ์์ (thread-safe)์ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์, ์ฃผ๋ก ์ฑ๊ธ ์ค๋ ..
๋ค์ด๊ฐ๊ธฐ ์์ํ๋ก์ ํธ๋ฅผ ์งํ ์ค, ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๋ถ ๊ป์ ๋ณ์ ๊ธฐ๋ฅ์์ ๋ณ์ ๊ฐ์ด ์ ๋๋ก ์
๋ฐ์ดํธ๋์ง ์๋ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์
จ์ต๋๋ค. ๋ฌธ์ ๋ฅผ ์ ํํ ํ์
ํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํ์ธํด๋ณธ ๊ฒฐ๊ณผ, ๋์ผํ ๋ณ์ ๋ฐ์ดํฐ๊ฐ 2๊ฐ ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์์์ต๋๋ค. public RatingCreateResponse createRating(Long userId, RatingCreateServiceRequest request) { User user = userRepository.findById(userId) .orElseThrow(() -> new BusinessException(USER_NOT_FOUND)); Book book = bookRepository.findById(request.getBookIsbn()) ..
๋ค์ด๊ฐ๊ธฐ ์์์ธํฐ๋ท์ ์ฌ์ฉํ ๋ ์ฐ๋ฆฌ๋ ๋งค์ผ HTTP์ HTTPS๋ฅผ ์ ํ๊ฒ ๋ฉ๋๋ค. ์น ์ฌ์ดํธ์ ์ ์ํ ๋ http:// ๋๋ https:// ๋ก ์์ํ๋ URL์ ๋ณด๊ฒ ๋๋๋ฐ, ์ด ๋ ํ๋กํ ์ฝ์ด ๋ฌด์์ธ์ง, ๊ฐ ํ๋กํ ์ฝ์ ์ญํ ์ด ๋ฌด์์ธ์ง ์ ์ดํดํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์ด ๊ธ์์๋ HTTP์ HTTPS์ ๊ธฐ๋ณธ ๊ฐ๋
์ ์ค๋ช
ํ๊ณ , ๊ฐ๊ฐ์ ๊ธฐ๋ฅ๊ณผ ํน์ง์ ๋น๊ตํ์ฌ HTTPS๋ง์ด ๊ฐ์ง๋ ํน๋ณํ ๋์ ๋ฐฉ์์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค. HTTPHTTP (HyperText Transfer Protocol)๋ ์น์์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ๊ธฐ๋ณธ ํ๋กํ ์ฝ์
๋๋ค. ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์น ํ์ด์ง๋ฅผ ์์ฒญํ๋ฉด, ์๋ฒ๋ ํด๋น ์์ฒญ์ ๋ํ ์๋ต์ ๋ณด๋ด์ค๋๋ค. HTTP๋ ์ฌ์ฉ์๊ฐ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ์ง์์ ์ผ๋ก ์์ฒญ๊ณผ ์๋ต์ ์ฃผ..
๋ค์ด๊ฐ๊ธฐ ์์์ ๋ณด ๋ณด์ ๋ถ์ผ์์ 'ํค' ๋ผ๋ ๊ฐ๋
์ ๋ฐ์ดํฐ ๋ณดํธ์ ๊ทผ๋ณธ์ ์ธ ์์๋ก ์๋ฆฌ ์ก๊ณ ์์ต๋๋ค. ํค๋ ํ๋ฌธ์ ์ํธ๋ฌธ์ผ๋ก ๋ณํํ๊ณ , ๋ค์ ์ํธ๋ฌธ์ ํ๋ฌธ์ผ๋ก ๋ณตํธํํ๋ ๊ณผ์ ์์ ํต์ฌ์ ์ธ ์ญํ ์ ํฉ๋๋ค. ์ด๋ฌํ ์ํธํ ๋ฐฉ์์ ์ฐ๋ฆฌ์ ์์คํ ์ ๋ณด๋ฅผ ์์ ํ๊ฒ ์งํค๊ธฐ ์ํด ํ์์ ์
๋๋ค. ์ค๋๋ ๋ค์ํ ๋ฐ์ดํฐ ์ ์ก๊ณผ ์ ์ฅ ๋ฐฉ์์ด ์กด์ฌํ์ง๋ง, ๊ทธ ์ค์์๋ ๋์นญ ํค์ ๋น๋์นญ ํค(๊ณต๊ฐ ํค)๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋ ๊ฐ์ง ์ํธํ ๋ฐฉ์์
๋๋ค. ์ด ๋ ๊ฐ์ง ๋ฐฉ์์ ๊ฐ๊ฐ ๋
ํนํ ์๋ฆฌ์ ํน์ง์ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ์๋ก ๋ค๋ฅธ ์ํฉ์์ ํ์ฉ๋ ์ ์์ต๋๋ค. ์ด ๊ธ์์๋ ๋์นญ ํค์ ๋น๋์นญ ํค์ ๊ฐ๋
์ ์ดํด๋ณด๊ณ , ์ด๋ค์ด ์ด๋ป๊ฒ ์ ๋ณด ๋ณดํธ์ ๊ธฐ์ฌํ๋์ง๋ฅผ ์์๋ณด๊ฒ ์ต๋๋ค. ๋์นญ ํค๋์นญ ํค ์ํธํ ๋ฐฉ์์ ๋์ผํ ํค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์..
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ๋ ์ถJava 8 ๋ถํฐ ๋์
๋ CompletableFuture์ ForkJoinPool์ ๋น๋๊ธฐ ๋ฐ ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ด ๋ ๊ฐ์ง๋ ์๋ก ๋ณด์์ ์ธ ๊ด๊ณ์ ์์ผ๋ฉฐ, ํจ์จ์ ์ธ ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด๋ฒ ๊ธ์์๋ ์ด๋ค์ด ์ด๋ป๊ฒ ํจ๊ป ์ํธ ๋ณด์์ ์ผ๋ก ๋์ํ๋์ง์ ์ฃผ์ํด์ผ ๋ ์ ์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค. CompletableFutureCompletableFuture๋ ๊ธฐ์กด์ Future ์ธํฐํ์ด์ค๊ฐ ์ ๊ณตํ์ง ๋ชปํ๋ ๋น๋๊ธฐ ๊ฒฐ๊ณผ ๊ฐ์ ์กฐํฉ๊ณผ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํจ์ฌ ๋ ํจ๊ณผ์ ์ผ๋ก ์ํํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ธํฐํ์ด์ค์
๋๋ค. ์ด ์ธํฐํ์ด์ค๋ฅผ ํ์ฉํ๋ฉด ๋๊ธฐ์ ์ธ ์ํ ๋ฐฉ์์ ๋น๋๊ธฐ์ ์ธ ์ํ ๋ฐฉ์์ผ๋ก ๋ณํํ์ฌ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ , ๋ ์ ์ฐํ ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ก์ง์ ๊ตฌํ..
๋ค์ด๊ฐ๊ธฐ ์์์ ํฌ ํ๋ก์ ํธ์์๋ ๋งค์ผ ์ค์ 4์์ ๋ฒ ์คํธ ์
๋ฌ ๋์ 100๊ถ์ ์ ๋ณด๋ฅผ ํฌ๋กค๋งํ์ฌ ์๋ฒ์ ์ ์ฅํ๋ ์์
์ ์ํํด์ผ ํ์ต๋๋ค. ์ฒ์์๋ ๋๊ธฐ์ ์ธ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ์ฌ ์ด ์์
์ ํ
์คํธํด ๋ณด์์ผ๋, ์ด ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ฐ์ดํฐ ํฌ๋กค๋ง์ ๋ง์ ์๊ฐ์ด ์์๋์๊ณ , ์ ์ฒด ํ๋ก์ธ์ค ํจ์จ์ฑ์ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค. ์ด์ ๋ฐ๋ผ, ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด CompletableFuture๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ์ ํ์ฉํ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ ์ ์๋ํ์ต๋๋ค. ์ด ๊ธ์์๋ ๊ธฐ์กด ๋๊ธฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์์ ๊ฒช์๋ ๋ฌธ์ ์ ๊ทธ๋ก ์ธํด ๋ฐ์ํ ์ง์ฐ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์๋ก์ด ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ ๋ ํจ์จ์ฑ์ ๋ํด ๊ณต์ ํ๋ ค ํฉ๋๋ค. ๋ฌธ์ ์ํฉ@Component@RequiredArgsConstructorpublic..