๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

react38

[Spring] ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ํ•ด๊ฒฐํ•ด๋ณด์ž!_ ๋ฆฌํŒฉํ† ๋ง ๋งŒ๋“ค์—ˆ๋˜ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋‹ˆ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ์• ๋งคํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.์ข€ ๋” ํ™•์‹คํ•˜๊ฒŒ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋ณด์ž. 1. ์›์ธ์ดˆ๋ฐ˜ ๋กœ์งif (customerRepository.existsByCode(code)) { throw new DuplicateCodeException("์ดˆ๋Œ€์ฝ”๋“œ๊ฐ€ ์ค‘๋ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");}customerRepository.save(customer);customerSearchRepository.save(toSearchEntity(customer));CustomerService ์ค‘ save ๋ฉ”์„œ๋“œ์˜ ์ผ๋ถ€๋ถ„์ด๋‹ค. ์ฒ˜์Œ ๊ณ ๊ฐ ๋“ฑ๋ก ๋กœ์ง์€ ์ด๋Ÿฐ ํ๋ฆ„์ด์—ˆ๋‹ค. code๊ฐ€ ๋“ค์–ด์˜ค๋ฉด existsByCode๋กœ code๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ๋ณด๊ณ , ์กด์žฌํ•˜๋ฉด DuplicateCodeException์„ ๋˜์กŒ๋‹ค.๋‘.. 2026. 6. 8.
[Spring, React] ๊ฐ์ฒด ์ค‘์‹ฌ์ธ JPA์— ๋งž์ถฐ์„œ ์ฝ”๋“œ ์ˆ˜์ •ํ•˜๊ธฐ. ์ดˆ๋ฐ˜์— DB ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ,ํ…Œ์ด๋ธ” ์ค‘์‹ฌ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.๊ทธ๋Ÿฌ๋‚˜ JPA๋Š” ๊ฐ์ฒด ์ค‘์‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์—์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผํ•  ํ•„์š”์„ฑ์„ ๋А๊ผˆ๋‹ค. 1. ์ƒํ™ฉ์„ค๋ช…์ดˆ๋ฐ˜ ํ”„๋กœ์ ํŠธ๋Š” ๊ด€๋ฆฌ์ž ์˜์—ญ์—์„œ ์ด 3๊ฐœ์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.AdminRepository : ๊ด€๋ฆฌ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.PemissionRepository : ๊ถŒํ•œ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค. ์ง€๊ธˆ ํ”„๋กœ์ ํŠธ์—์„  ์ด 5๊ฐ€์ง€ ๊ถŒํ•œ์ด ์žˆ๋‹ค. ์กฐํšŒ | ์ถ”๊ฐ€ | ์ˆ˜์ • | ์‚ญ์ œ | ๊ฒ€์ƒ‰์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๊ฐ๊ฐ 1๋ฒˆ, 2๋ฒˆ, 3๋ฒˆ... ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฒˆํ˜ธ๋ฅผ ๋ถ€์—ฌํ–ˆ๋‹ค.AdminPermissionRepository : ์–ด๋–ค ๊ด€๋ฆฌ์ž๊ฐ€ ์–ด๋–ค ๊ถŒํ•œ์„ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€ ์ €์žฅํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด id๊ฐ€ 1๋ฒˆ์ธ ๊ด€๋ฆฌ์ž๊ฐ€ ์กฐํšŒ, ์ˆ˜์ • ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด '1-1', '1-3' ๋Œ€์ถฉ ์ด๋Ÿฐ์‹์œผ๋กœ ์ •๋ณด๊ฐ€ ์ €.. 2026. 6. 4.
[Spring, React] flush( )๋ฅผ ์‚ฌ์šฉํ•ด์„œ DB ์˜ค๋ฅ˜ ํ•ด๊ฒฐํ•˜๊ธฐ ๊ด€๋ฆฌ์ž ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ–ˆ๋”๋‹ˆ์ค‘๋ณต ์ €์žฅ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.์—๋Ÿฌ์˜ ์›์ธ์„ ์ฐพ๊ณ  ์ˆ˜์ •ํ•ด๋ณด์ž. 1. ์—๋ŸฌDuplicate entry '2-3' for key 'admin_permission.uk_admin_permission'์ฒ˜์Œ ๋กœ์ง์€ ์ด๋žฌ๋‹ค. [ ๊ด€๋ฆฌ์ž ์ •๋ณด ์ˆ˜์ • ] - [ ๊ธฐ์กด ๊ถŒํ•œ ์‚ญ์ œ ] - [์ƒˆ ๊ถŒํ•œ ๋‹ค์‹œ ์ €์žฅ] ํ๋ฆ„์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ƒ๊ฐํ•œ ํ๋ฆ„๋Œ€๋กœ ์ผ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์€ ๋ชจ์–‘์ด๋‹ค. ์–ด๋””์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€ DB๋ถ€ํ„ฐ ๋‹ค์‹œ ์‚ดํŽด๋ดค๋‹ค.AdminService์˜ update ์ฝ”๋“œ ์ค‘ ์ผ๋ถ€// ๊ธฐ์กด ๊ถŒํ•œ ์‚ญ์ œadminPermissionRepository.deleteByAdminId(id);// ๋‹ค์‹œ ์ €์žฅsavePermissions(id, request.getPermissions());โ€‹ DB๋ฅผ 3๊ฐœ๋กœ.. 2026. 6. 2.
[React, Next.js] Zod ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ํ•˜๊ณ  ์ฝ”๋“œ ์ž‘์„ฑํ•ด๋ณด์ž ์‚ฌ์šฉ์ž ์„ ํƒ ์˜ต์…˜์„ ๊ฒ€์‚ฌํ•˜๊ณ ๋กœ๋˜ ๊ฒฐ๊ณผ ์‘๋‹ต์„ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ดZod ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.Zod๊ฐ€ ์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ์ง€ ์•Œ์•„๋ณด๊ณ ์ฝ”๋“œ ์ž‘์„ฑ์„ ํ•ด๋ณด์ž - ๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ ๋งˆ๋ฒ•์ง„ ๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ ๋งˆ๋ฒ•์ง„ํ–‰์šด ์š”์†Œ 3๊ฐœ๋ฅผ ์„ ํƒํ•˜๋ฉด ์˜ค๋Š˜์˜ ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ํ–‰์šด ์ ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.lotto-magic-frontend.vercel.app 1. ZodTypeScript๋ฅผ ์œ„ํ•œ ์Šคํ‚ค๋งˆ ์„ ์–ธ ๋ฐ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.๋ฐ์ดํ„ฐ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํ˜•ํƒœ์™€ ๊ทœ์น™์„ ์ •ํ™•ํžˆ ๊ฐ–์ถ”๊ณ  ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค.TypeScript๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์—๋งŒ ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•ด์ค€๋‹ค.์ฝ”๋“œ๊ฐ€ ๋ณ€ํ™˜๋˜์–ด ์‹ค์ œ๋กœ ์›น๋ธŒ๋ผ์šฐ์ €๋‚˜ ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋  ๋•Œ๋Š” ์ˆœ์ˆ˜ํ•œ JavaScript๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€์ž… ๊ฒ€์‚ฌ๊ฐ€ ๋ถˆ๊ฐ€ํ•˜๋‹ค.๋งŒ์•ฝ ์„œ๋ฒ„ API์—์„œ ์ˆซ์ž๋ฅผ .. 2026. 5. 30.
[Spring, React] react-query ์ถ”๊ฐ€ ํ›„ ๊ธฐ๋Šฅ ๋จนํ†ต ์˜ค๋ฅ˜ ๋ฐœ์ƒ,,, ํ•ด๊ฒฐํ•ด๋ณด์ž! ๋ฆฌ์•กํŠธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•œ ๋’ค๊ฒ€์ƒ‰์ฐฝ์— ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  ์—”ํ„ฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด์™„์ „ํžˆ ํ™”๋ฉด์ด ๋ฉˆ์ถฐ๋ฒ„๋ฆฌ๋Š” ์ด์ƒํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.์™œ ๊ทธ๋Ÿฐ์ง€ ์ฐพ์•„๋ณด๊ณ  ํ•ด๊ฒฐํ•ด๋ณด์ž. 1. ๋ฌธ์ œ ์ƒํ™ฉ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฒ€ํ† ํ•˜๋ฉด์„œ ์†Œ์†Œํ•˜๊ฒŒ ์ˆ˜์ •ํ•ด์•ผํ•  ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋ถˆํŽธํ–ˆ๋˜ ์ , ์•„์‰ฌ์› ๋˜ ๋ถ€๋ถ„ ๋“ฑ ์—ฌ๋Ÿฌ๊ตฐ๋ฐ ์ˆ˜์ •์„ ์ง„ํ–‰ํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ ๋’ค๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜์ง€ ์•Š์•˜๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚˜์˜ ๋ฌธ์ œ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ณ ์น  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํ™•์ธํ–ˆ์–ด์•ผํ–ˆ์ง€๋งŒ ๊ฒ€์ƒ‰๋งŒ ๋นผ๊ณ  ํ™•์ธํ•˜๋Š” ๋ฐ”๋žŒ์— ์ด ๋ฌธ์ œ๊ฐ€ ์–ธ์ œ๋ถ€ํ„ฐ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.F12๋ฅผ ๋ˆŒ๋Ÿฌ์„œ network๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€, ์™œ ๋จนํ†ต์ด ๋œ๊ฑด์ง€ ์•Œ๊ณ  ์‹ถ์–ด๋„ F12์กฐ์ฐจ ๋ˆŒ๋ฆฌ์ง€ ์•Š์•˜๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋„ ์•Š๊ณ  run์€ ์ž˜ ๋Œ์•„๊ฐ€๊ณ  ์žˆ์—ˆ๊ธฐ์— ์‰ฝ๊ฒŒ ์ด์œ ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์—ˆ๋‹ค.. 2026. 5. 26.
[Spring, React] ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํŒจ๊ฐ€ ๋œจ๋Š” ์›์ธ์„ ์ฐพ์•„ ์ˆ˜์ •ํ•ด๋ณด์ž. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์—๋Ÿฌ๋ฅผ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ–ˆ๋‹ค.๊ทธ๋Ÿฐ๋ฐ ์ž๊พธ๋งŒ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํŒจํ•œ๋‹ค.์™œ๊ทธ๋Ÿฐ์ง€ ๋ถ„์„ํ•˜๊ณ  ๊ณ ์ณ๋ณด์ž! https://lotto-magic-frontend.vercel.app/ ๋กœ๋˜ ๋ฒˆํ˜ธ ์ƒ์„ฑ ๋งˆ๋ฒ•์ง„ํ–‰์šด ์š”์†Œ 3๊ฐœ๋ฅผ ์„ ํƒํ•˜๋ฉด ์˜ค๋Š˜์˜ ๋กœ๋˜ ๋ฒˆํ˜ธ์™€ ํ–‰์šด ์ ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค.lotto-magic-frontend.vercel.app 1. ์˜ค๋ฅ˜ ๋ถ„์„LottoControllerErrorTest.java์—๋Ÿฌ๋ฅผ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ๋ณด๋Š” ํ…Œ์ŠคํŠธ ํด๋ž˜์Šค@WebMvcTest(LottoController.class)@Import(GlobalExceptionHandler.class)class LottoControllerErrorTest { @Autowired p.. 2026. 5. 21.