BackEnd/Spring Boot

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..
ddonghyeo
'BackEnd/Spring Boot' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก