์„œ๋น„์Šค ํ™•์žฅ์„ ์œ„ํ•œ ํŠธ๋žœ์žญ์…˜ ๋ถ„๋ฆฌ์™€ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„
ยท
๐Ÿ’ป ๊ฐœ๋ฐœ/๐Ÿ€ Spring
๋“ค์–ด๊ฐ€๋ฉฐ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ์—์„œ ํŠธ๋žœ์žญ์…˜์˜ ๋ฒ”์œ„์™€ ์„œ๋น„์Šค ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋Š” ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์— ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ๊ธฐ์กด ๋กœ์ง์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ ๋ถ€๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„๋ฅผ ์ตœ์ ํ™”ํ•˜๋Š” ๊ฒƒ์€ ์„œ๋น„์Šค์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š” ์ค‘์š”ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ํ˜„์žฌ ์ฝ˜์„œํŠธ ์˜ˆ์•ฝ ์„œ๋น„์Šค์˜ ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„๋ฅผ ๋ถ„์„ํ•˜๊ณ , ์„œ๋น„์Šค๋“ค์„ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฆฌํ•˜๋ฉฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์„ค๊ณ„๋ฅผ ๋„์ž…ํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.   ํ˜„์žฌ ์ฝ”๋“œ์˜ ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ ๋ถ„์„ ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„ํ˜„์žฌ ์ฝ”๋“œ์—์„œ @Transactional์ด ์ ์šฉ๋œ ํ•ต์‹ฌ ๋กœ์ง ์ค‘ ์˜ˆ์•ฝ ์ƒ์„ฑ๊ณผ ๊ฒฐ์ œ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋กœ์ง์— ๋Œ€ํ•ด ํŠธ๋žœ์žญ์…˜ ๋ฒ”์œ„๋ฅผ ๋ถ„์„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‘ ๋กœ์ง์€ ์•„๋ž˜๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.   ์˜ˆ์•ฝ ์ƒ์„ฑ@Serviceclass ReservationService( ..
Redis ๊ธฐ๋ฐ˜์˜ ์บ์‹ฑ ๋ฐ ๋Œ€๊ธฐ์—ด ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•œ ์ฝ˜์„œํŠธ ์˜ˆ์•ฝ ์„œ๋น„์Šค ์„ฑ๋Šฅ ๊ฐœ์„ 
ยท
๐Ÿ’ป ๊ฐœ๋ฐœ/๐Ÿ€ Spring
๋“ค์–ด๊ฐ€๋ฉฐ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ฝ˜์„œํŠธ ์˜ˆ์•ฝ ์„œ๋น„์Šค์˜ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์‹œ๋‚˜๋ฆฌ์˜ค์˜ ์กฐํšŒ API ์ค‘ ์บ์‹ฑ์„ ์ ์šฉํ•  ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด ๋ณด๊ณ , ๊ธฐ์กด RDB์—์„œ ์ž‘๋™๋˜๊ณ  ์žˆ๋˜ ๋Œ€๊ธฐ์—ด ๋กœ์ง์„ Redis๋กœ ์ด๊ด€ํ•˜๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋˜ ์บ์‹ฑ ์ „ํ›„ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์–ผ๋งˆ๋‚˜ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜๋Š”์ง€๋„ ์ฒดํฌํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.    ์บ์‹œ ์ ์šฉ ๊ธฐ์ค€์šฐ์„  ์บ์‹œ๋ฅผ ์ ์šฉํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ๊ธฐ์ค€์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. 1. ์กฐํšŒ ๋น„์šฉ์ด ๋†’์€์ง€๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๋น„์šฉ์ด ํฐ ๊ฒฝ์šฐ ์บ์‹ฑ์„ ํ†ตํ•ด ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 2. ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์กฐํšŒ๋˜๋Š”์ง€๋ฐ˜๋ณต์ ์ธ ์š”์ฒญ์ด ๋งŽ์€ ๊ฒฝ์šฐ ์บ์‹œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 3. ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์— ์ด์Šˆ๊ฐ€ ์—†๋Š”์ง€์บ์‹œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์บ์‹œ๋œ ๋ฐ์ดํ„ฐ์™€ ์›๋ณธ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ์ •ํ•ฉ..
๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ (synchronized, reentrantLock)
ยท
๐Ÿ’ป ๊ฐœ๋ฐœ/๐Ÿ€ Spring
1. ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋Š” ์™œ ํ•˜๋Š”๊ฑธ๊นŒ?๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์œผ๋ฉด ์œ ์ €๊ฐ€ ํฌ์ธํŠธ๋ฅผ ๋™์‹œ์— ์ถฉ์ „ ๋˜๋Š” ์‚ฌ์šฉํ•  ๋•Œ ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ฉด์„œ ๋ฐœ์ƒํ•˜๋Š” Race Condition(๊ฒฝ์Ÿ ์ƒํƒœ) ํ˜„์ƒ์ด๋ผ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, Race Condition์ด๋ž€ ๊ณต์œ  ์ž์›์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•  ๋•Œ, ์‹คํ–‰ ์ˆœ์„œ๋‚˜ ์‹œ๊ฐ„์— ์˜ํ•ด ๊ฒฐ๊ณผ ๊ฐ’์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ทธ๋ฆผ์„ ํ†ตํ•ด Race Condition์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.์œ„ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด 2๊ฐœ์˜ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋œ ๊ฐ๊ฐ์˜ ํƒœ์Šคํฌ๊ฐ€ point๋ผ๋Š” ๋ณ€์ˆ˜์— ๋™์‹œ์— ์ ‘๊ทผํ•˜์—ฌ ์ดˆ๊ธฐ๊ฐ’ 0์„ ์ฝ์–ด์™”์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ 500์„ ๋”ํ•˜๋Š” ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , point์— ๊ฒฐ๊ณผ ๊ฐ’์„ ๋Œ€์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋Œ€์™€..
Spring Security ๋‚ด๋ถ€ ํ๋ฆ„ ์ดํ•ดํ•˜๊ธฐ
ยท
๐Ÿ’ป ๊ฐœ๋ฐœ/๐Ÿ€ Spring
๋งค๋ฒˆ ์ธ์ฆ, ์ธ๊ฐ€์— ๋Œ€ํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ œ๋Œ€๋กœ ์ˆ™์ง€ํ•˜์ง€ ์•Š๊ณ , ์ฝ”๋“œ๋งŒ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค. ํšŒ์‚ฌ์—์„œ๋„ ์ด์— ๋Œ€ํ•ด ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์—†๋‹ค ๋ณด๋‹ˆ ์ตœ๊ทผ ํ† ์ด ํ”„๋กœ์ ํŠธ๋กœ ํŒจ์…˜ ์ด์ปค๋จธ์Šค ํ”Œ๋žซํผ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์— ๋Œ€ํ•ด ๊ณต๋ถ€๋„ ํ•ด๋ณด๊ณ , ์–ด๋Š ์ •๋„ ๊ธฐ๋ณธ์ ์ธ ์ดํ•ด๋ฅผ ํ•˜๋ฉฐ ์ ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ฃผ๋กœ ์œ ๋ฐ๋ฏธ(Udemy)์˜ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์˜€๊ณ , ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์˜ ๊ธฐ๋ณธ ๋™์ž‘ ํ๋ฆ„์— ๋Œ€ํ•ด ์ž‘์„ฑํ•˜์˜€๋‹ค. Spring Security๋ž€? Spring ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€(https://spring.io/projects/spring-security)์—์„œ๋Š” Spring Security๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ์†Œ๊ฐœํ•˜๊ณ  ์žˆ๋‹ค. ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€๊ฐ€ ์ œ์ผ ์ •ํ™•ํ•˜๊ณ  ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…์ด ๋˜์–ด์žˆ์œผ๋‹ˆ ๋งŒ์•ฝ ๋” ์•Œ๊ณ  ์‹ถ๋‹ค..
์Šคํ”„๋ง ๋ถ€ํŠธ์— OpenAI Whisper API ์ ์šฉํ•˜๊ธฐ
ยท
๐Ÿ’ป ๊ฐœ๋ฐœ/๐Ÿ€ Spring
Whisper๊ฐ€ ๋ญ”๋ฐ? Whisper๋Š” ์š”์ฆ˜ ChatGPT๋กœ ํ•ซํ•œ OpenAI์—์„œ ๊ฐœ๋ฐœํ•œ ์ž๋™ ์Œ์„ฑ ์ธ์‹ ๋ชจ๋ธ์ด๋‹ค. ์Œ์„ฑ์„ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” STT(Speech-to-Text) ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ, ๋Œ€ํ™” ์Œ์„ฑ ํŒŒ์ผ์„ ํ…์ŠคํŠธ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. OpenAI๋Š” ์˜ฌํ•ด 3์›” 1์ผ GPT-3.5-turbo ๋ชจ๋ธ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ Whisper API๋ฅผ ์ถœ์‹œํ•˜์˜€๋‹ค. API๊ฐ€ ์ œ๊ณต๋˜๊ธฐ ์ด์ „์—” Whisper๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋ถˆํŽธํ–ˆ์ง€๋งŒ, ์ด์   ๊ณ ์„ฑ๋Šฅ ๋ชจ๋ธ(Large-v2)์„ ์•ฝ๊ฐ„์˜ ๊ธˆ์•ก์„ ์ง€๋ถˆํ•˜๊ณ  ์ด์šฉํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‚ฌ์šฉํ•˜๊ธฐ์— ํŽธ์˜์„ฑ์ด ์ข‹์•„์กŒ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์Šคํ”„๋ง ๋ถ€ํŠธ๋ฅผ ํ™œ์šฉํ•ด์„œ Whisper API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด๊ฒ ๋‹ค. ์šฐ์„  ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—, ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ช‡ ๊ฐœ๋งŒ ์งš๊ณ  ๋„˜์–ด๊ฐ€ ๋ณด์ž. ๋ณดํ†ต STT ๊ธฐ์ˆ ์€ W..