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

๐Ÿ–ฅ๏ธ ์ด์ปค๋จธ์Šคํ”„๋กœ์ ํŠธ15

[๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ •] Lock ์ „๋žต ๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ • ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋ฉด, ๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋„˜์–ด "์–ด๋–ค ๊ธฐ์ˆ ์„ ์„ ํƒํ•  ๊ฒƒ์ธ๊ฐ€?"์— ๋Œ€ํ•œ ์ค‘์š”ํ•œ ๊ณ ๋ฏผ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ด์ปค๋จธ์Šค ํ”„๋กœ์ ํŠธ(EvoStyle)์—์„œ ์„ ์ฐฉ์ˆœ ํ• ์ธ ์ฟ ํฐ ๋ฐœ๊ธ‰ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ ์–ด๋–ค Lock ์ „๋žต์„ ์„ ํƒํ–ˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ธ์ง€ ์ •๋ฆฌํ•  ์˜ˆ์ •์ด๋‹ค. ๋ฐฐ๊ฒฝ์ด์ปค๋จธ์Šค ์„œ๋น„์Šค์—์„œ๋Š” ์ด๋ฒคํŠธ ์ฟ ํฐ์ฒ˜๋Ÿผ ๋‹ค์ˆ˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ๋ฐœ๊ธ‰ ์š”์ฒญ์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด ์ž์ฃผ ๋ฐœ์ƒํ•œ๋‹ค.์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋„ ์ฟ ํฐ ์ค‘๋ณต ๋ฐœ๊ธ‰ ๋ฐฉ์ง€, ์žฌ๊ณ  ์ดˆ๊ณผ ์‚ฌ์šฉ ๋ฐฉ์ง€, ์š”์ฒญ ์†๋„ ๊ด€๋ฆฌ์™€ ๊ฐ™์€ ์š”๊ตฌ์‚ฌํ•ญ์ด ํ•ต์‹ฌ ๊ณผ์ œ๊ฐ€ ๋˜์—ˆ๋‹ค.ํ˜„์žฌ๋Š” ๋‹จ์ผ ์„œ๋ฒ„ ํ™˜๊ฒฝ์ด์ง€๋งŒ, ํ–ฅํ›„ ์ˆ˜ํ‰ ํ™•์žฅ(๋ฉ€ํ‹ฐ ์„œ๋ฒ„)์„ ๊ณ ๋ คํ•œ ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ–ˆ๋‹ค. ๋ฌธ์ œ ์ •์˜๋™์ผํ•œ ์ฟ ํฐ์„ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์š”์ฒญํ–ˆ์„ ๋•Œ, ๋ณ„๋‹ค๋ฅธ ๋™์‹œ์„ฑ ์ œ์–ด ์—†์ด ์ฒ˜๋ฆฌํ•˜๋ฉด ๋‹ค์Œ .. 2025. 5. 14.
[ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] Spring Security 401/403 ์—๋Ÿฌ๊ฐ€ HTML๋กœ ๋‚ด๋ ค์˜ฌ ๋•Œ, JSON ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์œผ๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ ๐Ÿ”ฅ Spring Security ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… (401/403 HTML ๋ฐ˜ํ™˜ ๋ฌธ์ œ ํ•ด๊ฒฐ) Spring Security๋ฅผ ์ด์šฉํ•ด์„œ ์ธ์ฆ/์ธ๊ฐ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ •์—์„œ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.๋ฐ”๋กœ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฐ›๋Š” ์‘๋‹ต์ด JSON์ด ์•„๋‹ˆ๋ผ HTML ํŽ˜์ด์ง€์˜€๋˜ ๊ฒƒ์ด๋‹ค!๋ฌธ์ œ ํŒŒ์•…๊ณผ CustomAuthEntryPoint์™€ CustomAccessDeniedHandler๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์„œ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ๊ธฐ๋กํ•˜๋ ค๊ณ  ํ•œ๋‹ค! ๐Ÿค– ๋ฌธ์ œ ์ƒํ™ฉ: ์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ HTML ์‘๋‹ตSpring Security ๊ธฐ๋ณธ ์„ค์ •๋งŒ ํ–ˆ์„ ๋•Œ, ์ธ์ฆ ์‹คํŒจ๋‚˜ ๊ถŒํ•œ ๊ฑฐ๋ถ€๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์‘๋‹ต์ด ์ด๋ ‡๊ฒŒ ๋‚ด๋ ค์™”๋‹ค.๐Ÿ‘‰ HTTP Status๋Š” ๋งž๊ฒŒ ๋–จ์–ด์ง„๋‹ค. (401 / 403)๐Ÿ‘‰ ๊ทธ๋Ÿฐ๋ฐ ๋ณธ๋ฌธ์ด Spring.. 2025. 5. 13.
[ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] ์ฟ ํฐ ๋ฐœ๊ธ‰ํ•˜๋‹ค ํ„ฐ์ง„ Deadlock, ๊ทธ๋ฆฌ๊ณ  Redisson์œผ๋กœ ํ•ด๊ฒฐํ•œ ์ด์•ผ๊ธฐ ๐Ÿ’ฃ ๋™์‹œ์„ฑ ํ…Œ์ŠคํŠธ ์ค‘ Deadlock ๋ฐœ์ƒ! ๊ทธ๋ฆฌ๊ณ  Redisson ๋ฝ๊นŒ์ง€ ๋„์ž…ํ•œ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ์„ ์ฐฉ์ˆœ ํ• ์ธ ์ฟ ํฐ ๋ฐœ๊ธ‰ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๋ฉด์„œ ๊ฒช์—ˆ๋˜ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ณผ์ •์„ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค!Deadlock์ด ์‹ค์ œ๋กœ ๋ฐœ์ƒํ–ˆ๋˜ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ์™€, ๋ฝ ์ „๋žต์„ ๊ณ ๋ฏผํ•˜๊ณ  ์ตœ์ข…์ ์œผ๋กœ Redisson ๋ฝ์„ ๋„์ž…ํ•˜๊ธฐ๊นŒ์ง€์˜ ์‹ค์ œ ๊ฒฝํ—˜์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ’€์–ด๋‚ธ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ธฐ๋ก์ด๋‹ค! ๐Ÿ›ซ ๋ฌธ์ œ ์ƒํ™ฉ: Deadlock ๋ฐœ์ƒ ์‹คํ—˜๊ธฐ๋ณธ์ ์ธ ์ฟ ํฐ ๋ฐœ๊ธ‰ API๋งŒ ์ž‘์„ฑํ•œ ์ƒํƒœ์—์„œ, ๋‹ค์ˆ˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ๋ฐœ๊ธ‰์„ ์š”์ฒญํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ์ผ์–ด๋‚ ๊นŒ ๊ถ๊ธˆํ–ˆ๋‹ค.๊ทธ๋ž˜์„œ JMeter๋ฅผ ์ด์šฉํ•ด ๊ฐ„๋‹จํ•œ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ด ๋ดค๋‹ค.ํ…Œ์ŠคํŠธ ์กฐ๊ฑดํ•ญ๋ชฉ๊ฐ’ํ…Œ์ŠคํŠธ ๋„๊ตฌApache JMeter์Šค๋ ˆ๋“œ ์ˆ˜100๋ช…๋ฃจํ”„ ํšŸ์ˆ˜1ํšŒ (1๋ช…๋‹น 1ํšŒ ๋ฐœ๊ธ‰ ์‹œ๋„)์ฟ ํฐ ์ˆ˜๋Ÿ‰10๊ฐœ๋Œ€์ƒ API/api/co.. 2025. 5. 13.
[ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…] Spring Boot JWT ์ธ์ฆ ํ๋ฆ„ ๋งŒ๋“ค๊ณ  200 OK๋งŒ ๋‚˜์˜ค๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ ๐Ÿ”ฅ JWT ์ธ์ฆ ๊ตฌํ˜„ & ํ•„ํ„ฐ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ํ”„๋กœ์ ํŠธ์—์„œ JWT ์ธ์ฆ์„ ์ฒ˜์Œ์œผ๋กœ ์ง์ ‘ ๊ตฌํ˜„ํ•ด ๋ดค๋‹ค.ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ๊นŒ์ง€๋Š” ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ–ˆ์ง€๋งŒ.. ๋ฌธ์ œ๋Š” ๊ทธ ์ดํ›„์˜€๋‹ค.Controller๋กœ ์š”์ฒญ์ด ๋„˜์–ด๊ฐ€์ง€ ์•Š๊ณ , 200 OK๋งŒ ๋‚˜์˜ค๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.๋ฌธ์ œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•ด์„œ ํ•œ์ฐธ์„ ํ—ค๋งค๋‹ค๊ฐ€, ๊ฒฐ๊ตญ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๋ฉด์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค. โœ๏ธ JwtUtil ํด๋ž˜์ŠคJWT๋ฅผ ๋ฐœ๊ธ‰ํ•˜๊ณ , ๊ฒ€์ฆํ•˜๊ณ , Claim ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ํด๋ž˜์Šค์ด๋‹ค.@Slf4j(topic = "JwtUtil")@Component@RequiredArgsConstructorpublic class JwtUtil { private static final String BEARER_PREFIX = "Bearer "; privat.. 2025. 5. 13.
[KPTํšŒ๊ณ ] ์ด์ปค๋จธ์Šค ํ”„๋กœ์ ํŠธ ์ด์ปค๋จธ์Šค ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๊ฐœ์ธ KPT ํšŒ๊ณ  Keep: ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์œ ์ง€ํ–ˆ์œผ๋ฉด ํ•˜๋Š” ๋ถ€๋ถ„์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋‘๋ ค์›€์„ ๋А๋ผ์ง€ ์•Š์€ ์ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์ฒ˜์Œ์œผ๋กœ ์ธ์ฆ/์ธ๊ฐ€ ๋ถ€๋ถ„์„ ๋งก์•„ JWT์™€ Spring Security๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๋ถ„์•ผ๋ผ์„œ ๋‘๋ ค์›€๋„ ์žˆ์—ˆ์ง€๋งŒ, ๋„์ „ํ•˜๋Š” ์˜์ง€๊ฐ€ ๋” ๊ฐ•ํ•ด์„œ ๋งก์€ ์—ญํ• ์„ ๋๊นŒ์ง€ ํ•ด๊ฒฐํ•ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.๋™์‹œ์„ฑ ์ œ์–ด๋„ ์ฒ˜์Œ ๊ฒฝํ—˜ํ•˜๋Š” ์˜์—ญ์ด์—ˆ์ง€๋งŒ, ๊ฐœ๋…๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ ์ •๋ฆฌํ•˜๋ฉฐ ํ•™์Šต์„ ์ง„ํ–‰ํ–ˆ๊ณ  ๋ฌด์‚ฌํžˆ ๋งˆ๋ฌด๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.์›ํ™œํ•œ ์˜์‚ฌ์†Œํ†ตํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋‹ค๋ฅธ ํŒ€์›์ด ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„์ด ์ดํ•ด๋˜์ง€ ์•Š์„ ๋•Œ๋Š” ๋ฐ”๋กœ ์ฐพ์•„๊ฐ€์„œ ์งˆ๋ฌธํ•˜๊ณ  ์ดํ•ดํ•˜๋ ค๋Š” ๋…ธ๋ ฅ์„ ์•„๋ผ์ง€ ์•Š์•˜๋‹ค.์ ๊ทน์ ์œผ๋กœ ์˜๊ฒฌ์„ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉฐ, ๋” ๋‚˜์€ ๊ฒฐ๊ณผ๋ฅผ ๋„์ถœํ•˜๊ธฐ ์œ„ํ•ด ํ•จ๊ป˜ ๊ณ ๋ฏผํ•˜๊ณ  ํ˜‘๋ ฅํ–ˆ๋‹ค.๊ผผ๊ผผํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ.. 2025. 5. 12.
[TIL] ๋‹ค์‹œ ์‹œ์ž‘ํ•ด๋ณด๋Š” ํ”„๋กœ์ ํŠธ 18์ผ์ฐจ.. ๐ŸŒž ์˜ค๋Š˜์€ ์–ด๋–ค ํ•˜๋ฃจ์˜€์ง€..์˜ค๋Š˜ ์ƒ๊ฐ๋ณด๋‹ค ์ง‘์ค‘์ด ์ž˜ ์•ˆ ๋˜๋Š” ํ•˜๋ฃจ์˜€๋‹ค.์˜ค์ „์—๋Š” JPQL๋กœ ๊ตฌํ˜„ํ–ˆ๋˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ „๋ถ€ QueryDSL๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ”๊พธ๋Š” ์ž‘์—…์„ ํ–ˆ๋‹ค.์ตœ์ข… ํ”„๋กœ์ ํŠธ ๋•Œ ์—ด์‹ฌํžˆ QueryDSL๋ฅผ ์‚ฌ์šฉํ•œ ๋ณด๋žŒ์ด ์žˆ์—ˆ๋Š”์ง€, ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ•œ ์ฟผ๋ฆฌ์—ฌ์„œ ๊ทธ๋žฌ๋Š”์ง€ ์ฒ˜์Œ ์‚ฌ์šฉํ•  ๋•Œ๋ณด๋‹ค๋Š” ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.์˜คํ›„์—๋Š” ํŒ€์›๋“ค์ด ์˜ฌ๋ฆฐ PR์„ ํ™•์ธํ•˜๊ณ  ํ”„๋กœ์ ํŠธ ์ž‘์—…ํ–ˆ๋˜ ๋‚ด์šฉ๋“ค์„ ๋ฌธ์„œํ™”ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.์ž˜ ์ •๋ฆฌํ•ด๋‘ฌ์•ผ ๋‚˜์ค‘์— ๊นŒ๋จน์—ˆ์„ ๋•Œ ๋ณด๊ณ  ๊นŒ๋จน์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์•„์„œ ๊ผผ๊ผผํ•˜๊ฒŒ ํ•ด ๋†”์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.์˜ค๋Š˜ ๋ฌธ์„œํ™”๋ฅผ ์‹œ์ž‘ํ•ด์„œ ์ด๋ฒˆ ์ฃผ ์ฃผ๋ง๊นŒ์ง€๋Š” ๋๋‚ผ ์˜ˆ์ •์ด๋‹ค. ๐Ÿ’ก ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ ๋œ ๋‚ด์šฉ์€ ๋ญ๊ฐ€ ์žˆ๋”๋ผ..?!์–ด๋ผ.. ์ƒˆ๋กœ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์ด ์—†์–ด์„œ ์—ฌ๊ธฐ ์ ์„ ๋‚ด์šฉ์ด ์—†๋„ค....... ๐Ÿ—“๏ธ ๋‚ด์ผ์€ ๋ญ ํ•˜์ง€?!โœ”๏ธ ํ”„.. 2025. 5. 8.