BackEnd๐ฑ/Spring45 Spring Data Redis์ @Indexed ์ฌ์ฉ ์ ์ฃผ์์ @Indexed๋? @Indexed๋ Spring Data Redis ๋ชจ๋์ ์ฃผ์ ์ด๋ ธํ ์ด์ ์ค ํ๋์ ๋๋ค. ์ฃผ ๋ชฉ์ ์ผ๋ก๋ Redis์ ๋ณด์กฐ ์ธ๋ฑ์ค(Secondary Index) ์์ฑ์ ์ฌ์ฉ๋๋ฉฐ, @Id๊ฐ ๋ถ์ฌ์ง ๊ฐ์ฒด ์ธ์๋ @Indexed๊ฐ ๋ถ์ฌ์ง ๊ฐ์ฒด๋ก๋ ๊ฐ์ ์กฐํํ ์ ์๊ฒ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์๋์ ์ฝ๋์์๋ id๋ฟ๋ง ์๋๋ผ name์ผ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๋ค. @RedisHash("Person") public class Person { @Id private String id; @Indexed private String name; private int age; } ์์ ํ๋ฒ Person("dkswnkk", "JuHyeong", 26)์ ์ ์ฅํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. @Indexed ์์ด .. 2023. 8. 7. WebClient์์ ์๋ฌ ์ฒ๋ฆฌ์ ์ฌ์๋ํ๋ ๋ฐฉ๋ฒ ์๋ก HTTP ์์ฒญ์ ๋คํธ์ํฌ ์ง์ฐ, ์ผ์์ ์ธ ์๋ฒ ์ค๋ฅ, ์๋ชป๋ ์์ฒญ ๋ฑ ๋ค์ํ ์ด์ ๋ก ์คํจํ ์ ์์ต๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ ํ๋ฆ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๊ธฐ์ ์๋ฌ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์ด๋ฒ ๊ธ์์๋ WebClient๋ฅผ ์ฌ์ฉ์ HTTP์์ฒญ ๊ณผ์ ์์ ๋ฐ์ํ ์๋ฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ณต๊ตฌํ๊ธฐ ์ํด ์ฌ์๋ ์ฒ๋ฆฌํ๋ ์ ๋ต์ ๋ํด ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ฌ ์ฒ๋ฆฌ onErrorReturn() onErrorReturn()์ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ฃผ์ด์ง default ๊ฐ์ ๋ฐํํ๋ ๋ฉ์๋์ ๋๋ค. ์ด๋ ๋น๋๊ธฐ ํต์ ์์ ์ค์ํ ์ญํ ์ ํ๋๋ฐ, ํนํ ๋คํธ์ํฌ ์ค๋ฅ ๋๋ ์๋ฒ์ ๋ฌธ์ ๋ก ์ธํ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ํต์ ์์ฒด๋ฅผ ์ค๋จ์ํค์ง ์๊ณ , ๋ํดํธ ๊ฐ์ ๋ฐํํ์ฌ ์ ์์ ์ผ๋ก ๊ณ์ ์๋ํ ์ ์๋๋ก ํ ์ ์๊ธฐ ๋.. 2023. 8. 3. Spring Batch๋? ๊ฐ๋จํ ๊ฐ๋ ๊ณผ ์ฝ๋ ์ดํด๋ณด๊ธฐ ์๋ก ์คํ๋ง ๋ฐฐ์น(Spring Batch)๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํ๋ ์์ํฌ๋ก, ์คํ๋ง ํ๋ ์์ํฌ ๊ธฐ๋ฐ์์ ์๋ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์น ์์ ์ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋, ์ฃผ๊ธฐ์ ์ด๊ณ ๋ฐ๋ณต์ ์ธ ์์ ์ ์คํํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, ์คํ๋ง ๋ฐฐ์น๋ ์ด๋ฌํ ์์ ์ ํจ์จ์ ์ด๊ณ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ ๋ํ์ ์ผ๋ก ์๋์ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ์ ๊ณตํฉ๋๋ค. ๋ก๊น ๋ฐ ์ถ์ ํธ๋์ญ์ ๊ด๋ฆฌ ์์ ์ฒ๋ฆฌ ํต๊ณ ์์ ์ฌ์์ ๊ฑด๋๋ฐ๊ธฐ ๋ฆฌ์์ค ๊ด๋ฆฌ Batch์ Scheduler์ ์ฐจ์ด ๋ฐฐ์น(Batch)๋ ๋ ผ๋ฆฌ์ ๋๋ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๊ด๋ จ๋ ์ผ๋ จ์ ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋ฃนํํ์ฌ ์ผ๊ด ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ฉด์ ์ค์ผ์ค๋ฌ(Scheduler)๋ ์ฃผ์ด์ง ์์ ์ ๋ฏธ๋ฆฌ ์ ์๋ ์๊ฐ์ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ๋ ์ํํธ์จ์ด๋ฅผ ์๋ฏธํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฃผ์ํ ์ .. 2023. 7. 29. ์คํ๋ง์์ @Async๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์์ ๊ฐ์๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ์ ์ค๋๋ ์ ์ํํธ์จ์ด ๊ฐ๋ฐ์์ ๋งค์ฐ ์ค์ํ ๊ฐ๋ ์ ๋๋ค. ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ, ๋๋ฆฐ I/O ์์ , ๋ณต์กํ ๊ณ์ฐ ๋ฑ ๋ค์ํ ์์ ์ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํ๋ฉด์ ์์คํ ์ ์๋ต ์๊ฐ์ ๊ฐ์ ํ๊ณ , ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋๋ฐ ๋์์ด ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.์คํ๋ง์์๋ @Async ์ด๋ ธํ ์ด์ ์ ํตํด ์ด๋ฌํ ๋น๋๊ธฐ ๋ฉ์๋๋ฅผ ๊ฐ๋จํ๊ฒ ์คํํ ์ ์๋๋ฐ, ์ด๋ฌํ @Async ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ ๋ ์ฃผ์ํด์ผ ํ ์ฌ๋ฌ ๊ฐ์ง ์ฌํญ์ ๋ํด์ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค. ์ฃผ์์ Exception Handling๋ฉ์๋ ํธ์ถ๋ฆฌํด ํ์ ํธ๋์ญ์ ๊ด๋ฆฌExecution Exception Handling๊ธฐ๋ณธ์ ์ผ๋ก @Async ๋ฉ์๋์์ ๋ฐ์ํ๋ ์์ธ๋ ํธ์ถ์์๊ฒ ์ ํ๊ฐ ๋์ง ์์ต๋๋ค. ์ด๋ @Async ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ๋ฉ์๋๊ฐ ๋ณ๋์ ์ค๋ ๋.. 2023. 7. 24. Kafka ๊ฐ๋ ๊ณผ Spring Boot + Kafka ๊ฐ๋จํ ์ฐ๋ ์๋ก ๊ธฐ์กด ๋ฐ์ดํฐ ์์คํ ์ ๊ตฌ์กฐ๋ ๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ end-to-end๋ก ์ง์ ์ฐ๊ฒฐ๋์ด ์์์ต๋๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋ ๊ฐ๋จํ์ง๋ง ๊ฐ๊ฐ์ ๋ฐ์ดํฐ ํ์ดํ๋ผ์ธ์ด ๋ถ๋ฆฌ๋์ด ์์ด, ์๊ตฌ์ฌํญ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ ์์คํ ์ ๋ณต์ก๋๋ฅผ ๋์ด๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์๊ณ , ํฌ๊ฒ ์๋์ ๊ฐ์ ๋ฌธ์ ์ ๋ค์ด ๋ฐ์ํ์ต๋๋ค.์์คํ ๋ณต์ก๋์ ์ฆ๊ฐ์ค์ํ๋ ๋ฐ์ดํฐ ์ ์ก ์์ญ์ด ์์ด, ๋ฐ์ดํฐ์ ํ๋ฆ์ ํ์ ํ๊ธฐ ์ด๋ ต๊ณ , ์์คํ ๊ด๋ฆฌ๊ฐ ๋ณต์กํจ.์์คํ ์ ์ผ๋ถ๋ถ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด, ์ฐ๊ฒฐ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ ํ์ธํด์ผ ํจ.๋ฐ์ดํฐ ์ผ๊ด์ฑ ์ ์ง์ ์ด๋ ค์๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ์์คํ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ถ์ฐ๋์ด ์๋ ๊ฒฝ์ฐ, ํ ์์คํ ์์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ์์คํ ์ ์ฆ์ ๋ฐ์๋์ง ์์ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๊ธฐ ์ด๋ ค์.๋ฐ์ดํฐ ์ค์๊ฐ ์ฒ๋ฆฌ์ ์ด๋ ค์์ ํต์ ์ธ ๋ฉ์์ง ํ ์์ค.. 2023. 7. 19. ์คํ๋ง ์ด๋ฒคํธ ๋ฐํ๊ณผ ๊ตฌ๋ ์ผ๋ก ํธ๋์ญ์ ๋ถ๋ฆฌํ๊ธฐ ์๋ก ์๋น์ค๋ฅผ ๋ง๋ค๋ค ๋ณด๋ฉด ๋ค์ํ ์ธ๋ถ ๋ชจ๋์ด๋ ์์คํ ์ ์ฐ๋ํด์ผ ํ๋ ์ํฉ์ด ์๊ธฐ๊ฒ ๋ฉ๋๋ค. ๋ํ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์ํฉ์ ๋ค ์ ์์ต๋๋ค.์ฝ๋๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.@Service@Transactional(readOnly = true)@RequiredArgsConstructorpublic class UserService { private final MessageService messageService; private final UserRepository userRepository; @Transactional public void signUp(String email) { // ์ ์ ์ ์ฅ userRepository.save(new User(email)); .. 2023. 7. 9. SSE๋ก ์๋ฆผ ๊ธฐ๋ฅ ๊ตฌํํ๊ธฐ with Spring ์๋ก ์ธํฐ๋ท์ ์น ๋ธ๋ผ์ฐ์ ์ ์น ์๋ฒ ๊ฐ์ ๋ฐ์ดํฐ ํต์ ์ ์ํด์ HTTP ํ์ค ์์ ๊ตฌ์ถ๋์ด ์์ต๋๋ค. ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์น ๋ธ๋ผ์ฐ์ ์ธ ํด๋ผ์ด์ธํธ๊ฐ HTTP ์์ฒญ์ ์๋ฒ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ์ ์ ํ ์๋ต์ ๋ฐํํ๋๋ฐ ์ด๋ฐ ์๋ณต ํต์ ์ 'https://www.google.com'๊ณผ ๊ฐ์ ์ฃผ์๋ฅผ ๋ธ๋ผ์ฐ์ ์ ์ ๋ ฅํ์ ๋ ์น ํ์ด์ง๋ฅผ ๋ฐ๊ฒ ๋๋ ๊ณผ์ ์ ๋๋ค. ์ด๋ฌํ HTTP ํ์ค์ ๊ด๋ฒ์ํ๊ฒ ์ง์๋์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฐ์์ ์ธ ์ ๋ณด๋ฅผ ์๋ฒ์ ์ ์กํ๊ฑฐ๋, ์ค์๊ฐ์ผ๋ก ์ ๋ฐ์ดํธ๋ ์๋ฒ์ ์ ๋ณด๋ฅผ ํด๋ผ์ด์ธํธ์๊ฒ ๋ณด๋ด์ผ ํ๋ ๊ฒฝ์ฐ ์ง์์ ์ธ HTTP ์์ฒญ์ ํ๊ฒ ๋๊ธฐ์ ๋น์ฉ๋ฉด์์ ๋งค์ฐ ๋น ํจ์จ์ ์ ๋๋ค. ์ด๋ฐ ์ํฉ์์ ํด๋ง, ์น์์ผ, ๊ทธ๋ฆฌ๊ณ SSE๊ฐ ๋ฑ์ฅํ๋๋ฐ, ์ด๋ค์ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ์๋์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ์ ์ค์ ์ ๋ ํ๋กํ ์ฝ ๋ค์ ๋.. 2023. 6. 18. Gradle๋ก ๋ฉํฐ๋ชจ๋ ํ๋ก์ ํธ ๊ตฌ์ฑํ๊ธฐ ์๋ก ํ์ฌ ์ ๊ฐ ์๋ ๋ถ์์์๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ณต์ ํ๋ ๋ค์์ ํ๋ก์ ํธ๊ฐ ์กด์ฌํ๋๋ฐ, ํ๋์ ๋๋ฉ์ธ์ ๊ณต์ ํ๊ณ ๊น์ ๋ฐ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด ๋๋ฉ์ธ ํด๋์ค๋ค์ ๋ฉํฐ ํ๋ก์ ํธ์ Nexus Maven ์ ์ฅ์๋ฅผ ์ด์ฉํด์ ๋๋ฉ์ธ ํด๋์ค๋ฅผ ๋ถ๋ฆฌํ๋ ํํ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ ๋ ์ด๋ฏธ ์ธํ ์ด ๋ ํ๊ฒฝ์์ ๊ฐ๋ฐ์ ํ๊ณ ์๊ธฐ์ ๋ฐ๋ก ์ค์ ์ ๊ดํด์๋ ๊ฑด๋๋ฆด ๋ถ๋ถ์ด ์๊ธฐ๋ ํ๊ณ , ์ง์ ๊ตฌ์ฑํด ๋ณธ ์ ๋ ์์ด์ ์ด๋ฒ๊ธฐํ์ ์ ๋ฆฌ์ ํจ๊ป ์ง์ ํ๊ฒฝ ๊ตฌ์ฑ์ ํด๋ณด๊ณ ์ ํฌ์คํ ํ๊ฒ ๋์์ต๋๋ค. ์ด๋ฒ ๊ฒ์๊ธ์์๋ ๋ฉํฐ๋ชจ๋์ ์ ์์ Gradle์ ์ด์ฉํ ๋ฉํฐ๋ชจ๋์ ๊ตฌ์ฑ์ ๋ํด ์ ๋ฆฌํด๋ณด๊ฒ ์ต๋๋ค. ๋ชฉ์ฐจ ๋ฉํฐ๋ชจ๋์ด๋? Gradle๋ก ๋ฉํฐ๋ชจ๋ ๊ตฌ์ฑํ๊ธฐ ํ ์คํธ ํ ์คํธ ํ๊ฒฝ Apple Silicon (M1), IntelliJ Java 11, Spr.. 2023. 3. 4. ํธ๋์ญ์ (Transaction)์ ์์ธ(Exception)์ ๋ฐ๋ฅธ ๋กค๋ฐฑ ์ฒ๋ฆฌ ์๋ก ์ด์ ์ Java์ Checked Exception๊ณผ UnChecked Exception์ ๋ํด ์ ๋ฆฌํ ์ ์ด ์์ต๋๋ค. ๋ค์ ์์ฝํ๋ฉด RuntimeException์ ์์ํ์ง ์๋ ํด๋์ค๋ Checked Exception, ์์ํ ํด๋์ค๋ Unchecked Exception์ด๋ฉฐ, Checked Exception์ try-catch์ ํตํด ์์ธ๋ฅผ ๊ผญ ์ฒ๋ฆฌํด ์ฃผ์ด์ผ ์ปดํ์ผ์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.์ด๋ฒ ํฌ์คํ ์์๋ ์ด๋ฌํ ๊ฐ๊ฐ์ ์์ธ๋ค์ ๋ํ์ฌ Transaction์์ ๋กค๋ฐฑ์ด ์ด๋ป๊ฒ ๋ฐ์๋๋์ง ํ๋ฒ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค. ๊ณตํต ์ฝ๋@Entity@NoArgsConstructor(access = AccessLevel.PROTECTED)public class User { @Id @GeneratedVa.. 2023. 2. 5. ์ด์ 1 2 3 4 5 ๋ค์