์ „์ฒด

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..
ยท CS
0. ๋””์ž์ธ ํŒจํ„ด์ด๋ž€?ํ”„๋กœ๊ทธ๋žจ ์„ค๊ณ„ ์‹œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋“ค์„ ๊ฐ์ฒด ๊ฐ„์˜ ์ƒํ˜ธ ๊ด€๊ณ„ ๋“ค์„ ์ด์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋‚˜์˜ ๊ทœ์•ฝ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด ๋†“์€ ๊ฒƒ   1. ์‹ฑ๊ธ€ํ†ค ํŒจํ„ด Singleton Patternํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ์˜ค์ง ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๊ฐ€์ง€๋Š” ํŒจํ„ด. ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ชจ๋“ˆ์— ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์–ด๋‘๊ณ , ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์ด ๊ณต์œ ํ•˜๋ฉฐ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋น„์šฉ์ด ์ค„์–ด๋“œ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์˜์กด์„ฑ์ด ๋‚ฎ์•„์ง„๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. class Singleton { private static class singleInstanceHolder { private static final Singleton INSTANCE = new Singleton(); } pu..
Spring Security 6 ๋ฒ„์ „ ๊ธฐ์ค€ ์ตœ๊ทผ Spring Security ๋ฅผ ์ด์šฉํ•œ JWT๊ธฐ๋ฐ˜ ์ธ์ฆ ์„œ๋ฒ„๋ฅผ ๋ฆฌํŒฉํ† ๋ง ํ•˜๋ฉด์„œ ์ธ์ฆ/์ธ๊ฐ€์— ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ๋‹ค๋ค„๋ณด์•˜๋‹ค. ์—ฌ๋Ÿฌ ๋ ˆํฌ์™€ ๋ธ”๋กœ๊ทธ ๊ธ€์„ ๋งŽ์ด ๋ณด์•˜์ง€๋งŒ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์€ ๋ชจ๋‘ ๋‹ฌ๋ž๋‹ค. ๊ทธ๋ž˜์„œ Spring Security ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค. ๊ทธ ์ค‘ ์ธ๊ฐ€(Authorization) ๋ฐฉ๋ฒ•์„ ์ค‘์ ์ ์œผ๋กœ ๋‹ค๋ค„๋ณผ ๊ฒƒ์ด๋‹ค. 1. AuthUser์ด ํด๋ž˜์Šค๋Š” ์„œ๋น„์Šค๋‹จ์—์„œ ์‚ฌ์šฉํ•  ์‚ฌ์šฉ์ž์˜ uniqueํ•œ ์‹๋ณ„์ž๋“ค์„ ์ •๋ณด๋ฅผ ๋„ฃ์–ด ์ „๋‹ฌ๋˜๋Š” ์ž„์‹œ ๊ฐ์ฒด๋กœ,ํ˜„์žฌ ์ธ๊ฐ€๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด์•„ ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋‹ค. @Getter@AllArgsConstructorpublic class AuthUser { private final Long id; ..
๊ฐœ๋ฐœ์€ ๊ธ€์ง“๊ธฐ์™€ ๋น„์Šทํ•˜๋‹ค. ๋จผ์ € ์ƒ๊ฐ์„ ๊ธฐ๋กํ•œ ํ›„ ์ฝ๊ธฐ ์ข‹๊ฒŒ ๋‹ค๋“ฌ๋Š” ๊ณผ์ •์ด ์ง„ํ–‰๋œ๋‹ค. ํ•จ์ˆ˜๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋‹ค. ๋จผ์ € ๋กœ์ง์„ ๋‚˜์—ดํ•˜๊ฒŒ ์ถ”ํ›„์— ๋ฆฌํŒฉํ† ๋ง์ด ์ง„ํ–‰๋œ๋‹ค. ์˜ค๋Š˜์€ ๊ตฌ์กฐ์ ์œผ๋กœ๋„ ์ข‹์œผ๋ฉฐ ์ฝ๊ธฐ ์ข‹์€ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ฒ ๋‹ค. ์ž‘๊ฒŒ ๋งŒ๋“ค๊ธฐ์ข‹์€ ํ•จ์ˆ˜ ๊ตฌ์กฐ๋Š” ๋Œ€๊ฐœ ์ž‘๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค. ๊ฐ ํ•จ์ˆ˜๊ฐ€ ํ•˜๋‚˜์˜ ์ด์•ผ๊ธฐ๋ฅผ ํ‘œํ˜„ํ•˜๋Š”๊ฒŒ ์ข‹๋‹ค.  ๋ณดํ†ต ์•„๋ž˜์™€ ๊ฐ™์€ ํ•จ์ˆ˜์˜ ๊ธธ์ด ์ •๋„๊ฐ€ ์ ํ•ฉํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.public static String renderPageWithSetupsAndTeardowns( PageData pageData, boolean isSuite) throws Exception { if (isTestPage(pageData)) includeSetupdAndTeardownPages(pageDa..
์ฝ”๋“œ์—์„œ ๋„ค์ด๋ฐ์€ ์–ด๋Š ์ƒํ™ฉ์—์„œ๋‚˜ ์“ฐ์ธ๋‹ค. ์ข‹์€ ๋„ค์ด๋ฐ์€ ๊ณ ๋ฏผํ•˜๋Š” ์‹œ๊ฐ„๋ณด๋‹ค ์ ˆ์•ฝํ•˜๋Š” ์‹œ๊ฐ„์ด ๋” ๋งŽ์•„์ง„๋‹ค. ์˜ค๋Š˜์€ ๋„ค์ด๋ฐ์„ ์ž˜ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ช‡๊ฐ€์ง€ ์•Œ์•„๋ณด๊ฒ ๋‹ค.  ์˜๋„๋ฅผ ๋‹ด์€ ์ด๋ฆ„๋ณ€์ˆ˜, ํ•จ์ˆ˜, ํด๋ž˜์Šค์˜ ์ด๋ฆ„์—๋Š” ๋ถ„๋ช…ํ•œ ์˜๋„๋ฅผ ๋‹ด๋Š”๊ฒŒ ์ข‹๋‹ค. - ์กด์žฌ ์ด์œ - ์ˆ˜ํ–‰ ๊ธฐ๋Šฅ- ์‚ฌ์šฉ ๋ฐฉ๋ฒ• ๋„ค์ด๋ฐ ๊ทœ์น™์ค‘์— ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๊ทœ์น™์ด๋‹ค. ํ•ด๋‹น ์ด๋ฆ„์„ ํ†ตํ•ด ์–ด๋–ค ์˜๋„๋ฅผ ํ•˜๋ ค๊ณ  ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค. public List a() { //์‹คํ–‰ ๋กœ์ง ..} ๋‹น์—ฐํ•˜๊ฒŒ๋„ ์œ„ ํ•จ์ˆ˜ ์ด๋ฆ„์œผ๋กœ๋ถ€ํ„ฐ๋Š” ์–ด๋–ค User๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฑด์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. public List getActiveUsers() { //์‹คํ–‰ ๋กœ์ง ..} ๋„ค์ด๋ฐ์— ์˜๋„๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ํ™œ์„ฑ ์‚ฌ์šฉ์ž๋ฅผ ์–ป๊ธฐ ์œ„ํ•œ ๋ชฉ์ ,์‚ฌ์šฉ์ž๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ธฐ๋Šฅ,get์„ ํ†ตํ•ด ์กฐํšŒํ•˜๋Š” ์šฉ๋„..
ddonghyeo
'๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก