0. ๋ค์ด๊ฐ๋ฉฐDB์์ ํต์ ๊ณผ์ ์์ ๋ถํ๋ฅผ ์ค์ด๋ ๋ฐฉ๋ฒ์ผ๋ก ์ธ๋ฑ์ค, ์ง์ฐ๋ก๋ฉ, ์บ์ฑ ๋ฑ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ ํ์ฉํด๋ณผ ์ ์๋ค. ์ค๋์ ๊ธฐ์กด์ ์ ์๊ฐํด๋ณด์ง ๋ชปํ๋ ์ํฐํฐ ์กฐํ ๋ฐฉ๋ฒ์ ๋งํด๋ณด๋ ค๊ณ ํ๋ค. ํ์์ JPA๋ฅผ ์ด์ฉํด์ ์ํฐํฐ๋ฅผ ์กฐํํ๊ณ ํด๋ผ์ด์ธํธ ์์ฒญ์ ์๋ตํ ๋, ๋ณดํต์ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ์๋ค. public interface UserRepository extends JpaRepository { Optional findById(Long id); }@Builder@Getterpublic class UserResponseDto { Long id; String email; String name; public static UserResponseDto from(User u..
0. ๋์์ฑ ์ด์์ ํด๊ฒฐ ๋ฐฉ๋ฒ๋์์ฑ ์ด์๋ ์ฌ๋ฌ ์ค๋ ๋๋ ํ๋ก์ธ์ค๊ฐ ๋์์ ๊ฐ์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ค ํ ๋ ๋ฐ์ํ๋ค. ๋์์ฑ ์ด์๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค. ์ด๋ฒ ํ๋ก์ ํธ์์ ๋ฐ์ํ ๋์์ฑ ์ด์๋ฅผ ํด๊ฒฐํด ๋ณด๋ ค๊ณ ํ๋ค. ๋จผ์ , Spring Boot ํ๊ฒฝ์์ ๋์์ฑ ์ด์๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ์์๋ณด๊ฒ ๋ค. 0-1. ๋ฝ (Lock)๋ฝ์ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์ ๊ณต์ ๋ฆฌ์์ค์ ๋ํ ๋์ ์ ๊ทผ์ ์ ์ดํ๋ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ด๋ค. ๋ฝ์ ํตํด ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ์ ์งํ๊ณ Race Condition์ ๋ฐฉ์งํ๋ค. 0-1-1. ๋๊ด์ ๋ฝ (Optimistic Lock)๋๊ด์ ๋ฝ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋ ๋ฝ์ ๊ฑธ์ง ์๋๋ค. ๋ณดํต ๋ฒ์ ๋ฒํธ๋ ํ์์คํฌํ๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๊ฐ์งํ๋ค. ์ถฉ๋์ด ๊ฐ์ง๋๋ฉด ์์ธ๋ฅผ ๋ฐ์์ํค..
๋ฒ์ Spring Boot 3AWS SDK for java v2firebase-admin 6.5.00. ๋์
๋ฐฐ๊ฒฝ๊ธฐ์กด ๊ตฌ์กฐ๊ธฐ์กด์๋ ํธ์ ์๋ฆผ ์์ฒญ์ ๋ฐ๋ผ์ ์๋ฒ ๋ด์์ ๋ฉ์ธ์ง๋ฅผ ์์ฑํ๊ณ Firebase๋ก ๋ฉ์ธ์ง๋ฅผ ์ ์กํ๋ค. ํ์ง๋ง, ์ฌ๊ธฐ์ ํธ์ ์๋ฆผ์ ๋ณด๋ผ ์ฌ์ฉ์๊ฐ ๋ง๋ช
, 10๋ง๋ช
, 100๋ง๋ช
์ด ๋๋ค๋ฉด... ๋ชจ๋ ์ฌ์ฉ์์ ๋ํ ์๋ฆผ์ ์ผ๊ด์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค. ์ผ๊ด ์ฒ๋ฆฌ๋ฅผ ์ํ Firebase์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณด์. ๋จผ์ ํ๊บผ๋ฒ์ ๋ณด๋ด๋ sendAll์ Deprecate๋์๊ณ , ๋์ sendEach๋ฅผ ์จ์ผํ๋ค. sendEach()๋ ๊ฐ ํ ํฐ๋ณ ์ฌ๋ฌ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ ์ ์์ง๋ง, ๊ฐ ๋ฉ์ธ์ง๋ง๋ค ๋ณ๋์ HTTP ์์ฒญ์ ๋ง๋ค์ด๋ธ๋ค. 10๋ง๊ฐ์ ์์ฒญ์ด๋ฉด 10๋ง๊ฐ์ HTTP ์์ฒญ์ด ์์ฑ๋๋ค๋ ๊ฒ์ด๋ค. ์ฌ์ง์ด, mes..
Spring Security 6 ๋ฒ์ ๊ธฐ์ค ์ต๊ทผ Spring Security ๋ฅผ ์ด์ฉํ JWT๊ธฐ๋ฐ ์ธ์ฆ ์๋ฒ๋ฅผ ๋ฆฌํฉํ ๋ง ํ๋ฉด์ ์ธ์ฆ/์ธ๊ฐ์ ๋ํ ๋ถ๋ถ์ ๋ค๋ค๋ณด์๋ค. ์ฌ๋ฌ ๋ ํฌ์ ๋ธ๋ก๊ทธ ๊ธ์ ๋ง์ด ๋ณด์์ง๋ง ๊ตฌํ ๋ฐฉ๋ฒ์ ๋ชจ๋ ๋ฌ๋๋ค. ๊ทธ๋์ Spring Security ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ ๊ตฌํํด ๋ณด์๋ค. ๊ทธ ์ค ์ธ๊ฐ(Authorization) ๋ฐฉ๋ฒ์ ์ค์ ์ ์ผ๋ก ๋ค๋ค๋ณผ ๊ฒ์ด๋ค. 1. AuthUser์ด ํด๋์ค๋ ์๋น์ค๋จ์์ ์ฌ์ฉํ ์ฌ์ฉ์์ uniqueํ ์๋ณ์๋ค์ ์ ๋ณด๋ฅผ ๋ฃ์ด ์ ๋ฌ๋๋ ์์ ๊ฐ์ฒด๋ก,ํ์ฌ ์ธ๊ฐ๋ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ด์ ์ฌ์ฉ๋ ๊ฒ์ด๋ค. @Getter@AllArgsConstructorpublic class AuthUser { private final Long id; ..
0. Application Events์คํ๋ง์์ ์ง์ํ๋ ์ด๋ฒคํธ๋ก, ๋ด๋ถ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค. Spring Event๋ฅผ ํตํด ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ
์ฒ(Event-Driven Architecture)๋ฅผ ๊ตฌํํ ์ ์๋ค. 1. ์ฌ์ฉ ์ด์ ํ ์์๋ฅผ ์์๋ณด์.@Servicepublic class UserService { private final UserRepository userRepository; private final EmailService emailService; @Transactional public void registerUser(User user) { userRepository.save(user); //์ฌ์ฉ์ ์ ์ฅ emailService..
๋ฐฐ๊ฒฝ ํ์์๋ JPA ๊ด๋ จ ๋ฉ์๋๋ค์ ์ธ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฒ๋ฆฌํ์๋ค.User user = userRepository.findById(id).orElseThrow(...); orElseThrow() ๋ Optional ํด๋์ค์ ๋ฉ์๋๋ก, ๋จ์ํ๊ฒ ๊ฐ์ด null์ด๋ผ๋ฉด Exception์ ๋์ ธ์ฃผ๊ณ , null์ด ์๋๋ผ๋ฉด ๋ฐํํ๋ ํจ์์ด๋ค. ์ด๋ ๋จ์ํ ๊ฒฐ๊ณผ๊ฐ null์์ ์ฒ๋ฆฌํ ์ ๋ฐ์ ์์๋ค. ์ง๊ธ๊น์ง JPA๋ฉ์๋์์ Exception์ด ๋์ ธ์ง๋ ์ผ์ ์์์ง๋ง,JPA ๋๋ Hibernate์์ ๋์ ธ์ง๋ Exception ๋ํ ์ฒ๋ฆฌํ ์ ์์ด์ผ ํ๊ฒ ๋ค๊ณ ์์ฌํด ๋ณด์๋ค. Repository Exception ์์ฃผ ์ฌ์ฉํ๋ findById์์๋ ๋ง์ฝ id๊ฐ null์ผ ๊ฒฝ์ฐ IllegalArgumentExcept..