[TroubleShooting] PDF ํ”„๋ฆฌ๋ทฐ์‹œ ์ž๋™ ๋‹ค์šด๋กœ๋“œ ํ˜„์ƒ ํ•ด๊ฒฐํ•˜๊ธฐ
ยท
๋งŒ๋“ค์–ด๋ณด๊ธฐ/TroubleShooting
๊ฐœ์š”ํ˜„์žฌ ์ธํ„ด ์ค‘์ธ ๊ณณ์—์„œ ๊ธฐ์กด 1์ฐจ ๊ฐœ๋ฐœ์ด ๋˜์–ด์žˆ๋˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด์ˆ˜ํ•˜๊ณ , ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ •์‹ ๋ฐฐํฌ๋ฅผ ์ค€๋น„ ์ค‘์— ์žˆ๋‹ค.๊ทธ ์ค‘ QA ๊ฒฐ๊ณผ๋กœ PDF ํ”„๋ฆฌ๋ทฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ํŽ˜์ด์ง€์— ์ง„์ž… ์‹œ ํ•ด๋‹น PDF๊ฐ€ ์ž๋™ ๋‹ค์šด๋กœ๋“œ ๋˜๋Š” ํ˜„์ƒ์ด ๋ฐœ๊ฒฌ๋˜์–ด ํ•ด๊ฒฐ์„ ์š”์ฒญ ๋ฐ›์•˜๋‹ค.ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ ๋ฌธ์ œ ์ƒํ™ฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.์ƒ์„ธ ํŽ˜์ด์ง€์—์„œ html `` ํƒœ๊ทธ๋กœ pdf ํ”„๋ฆฌ๋ทฐ ์ œ๊ณต ์ค‘์ผ๋ถ€ pdf๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ”„๋ฆฌ๋ทฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ๋ Œ๋”๋ง ๋˜์ง€ ์•Š๊ณ , ์ž๋™ ๋‹ค์šด๋กœ๋“œ ๋˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ์›์ธ ๋ถ„์„ํ˜„์žฌ ํ”„๋ฆฌ๋ทฐ๋ฅผ ์ œ๊ณต ๋Œ€์ƒ์ธ pdf๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค ๋‚ด์—์„œ ์—…๋กœ๋“œํ•œ pdf๋กœ, CDN์—์„œ ์ œ๊ณตํ•˜๋Š” url์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜จ๋‹ค.ํ”„๋ฆฌ๋ทฐ์— ์„ฑ๊ณตํ•˜๋Š” pdf์™€ ์‹คํŒจํ•˜๋Š” pdf์˜ CDN url๋กœ curl ๋ช…๋ น์–ด์„ ํ†ตํ•ด ์‘๋‹ต ํ—ค๋”๋ฅผ ํ™•์ธํ•ด๋ณด์•˜๋‹ค.curl ๋ช…๋ น์–ด๋ฅผ ..
[SpringBoot] SQS ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ ๋ณ‘๋ชฉ @Async + Executor๋กœ ํ•ด๊ฒฐํ•˜๊ธฐ
ยท
๋งŒ๋“ค์–ด๋ณด๊ธฐ/TroubleShooting
โ˜‘๏ธ ๋ฌธ์ œ ์ •์˜ : ๋น„๋™๊ธฐ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ๋™๊ธฐ ์ฒ˜๋ฆฌํ˜„์žฌ ์šฐ๋ฆฌ ์‹œ์Šคํ…œ์˜ ์•Œ๋ฆผ ์ „์†ก์€ SQS ๊ธฐ๋ฐ˜ Outbox ํŒจํ„ด์„ ๋”ฐ๋ฅด๊ณ  ์žˆ๋‹ค.์•Œ๋ฆผ์ด ํ•„์š”ํ•œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์œผ๋กœ ๋ฉ”์‹œ์ง€๊ฐ€ ์ฒ˜๋ฆฌ๋œ๋‹ค.์•Œ๋ฆผ ์ •๋ณด๋ฅผ Notification ํ…Œ์ด๋ธ”(์‚ฌ์šฉ์ž ์กฐํšŒ์šฉ)๊ณผ Outbox ํ…Œ์ด๋ธ”(๋ฉ”์‹œ์ง€ ๋ฐœํ–‰์šฉ)์— ์ €์žฅ์ €์žฅ๋œ ๋ฉ”์‹œ์ง€๋ฅผ SQS์— ๋ฐœํ–‰SQS ์†Œ๋น„์ž๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•„ ์‹ค์ œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ ์ „์†ก์•Œ๋ฆผ ์ „์†ก์€ ๊ตฌ์กฐ์ ์œผ๋กœ ๋น„๋™๊ธฐ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, SQS๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๋Š” ๋กœ์ง๋งŒ์€ ๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.์ด๋กœ ์ธํ•ด ๋Œ€๊ทœ๋ชจ ์•Œ๋ฆผ ๋ฐœ์†ก ์‹œ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜๋ฐ–์— ์—†๋Š” ๊ตฌ์กฐ์˜€๋‹ค.โ–ถ๏ธŽ ๋‹จ๊ณ„๋ณ„ ๋ณ‘๋ชฉ ์ง€์  ์ •๋ฆฌ๋ณ‘๋ชฉ์ด ์˜ˆ์ƒ๋˜๋Š” ์ง€์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.์•Œ๋ฆผ ๋ฐ์ดํ„ฐ๋ฅผ DB์— ์ €์žฅํ•  ๋•Œ๋ฉ”์‹œ์ง€๋ฅผ SQS๋กœ ๋ฐœํ–‰ํ•  ๋•Œ์•Œ๋ฆผ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†กํ•  ๋•Œ๋‹จ๊ณ„์ฒ˜๋ฆฌ ..
[Springboot] AWS SQS๋ฅผ ์ด์šฉํ•œ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๊ตฌํ˜„ํ•˜๊ธฐ - ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ ๋กœ์ง
ยท
๋งŒ๋“ค์–ด๋ณด๊ธฐ/Spring
์„œ๋ก ๊ธฐ์กด์—๋Š” Spring์˜ `ApplicationEventPublisher`์™€ Redis์˜ Pub/Sub ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.์ด ๊ตฌ์กฐ๋Š” ๋‚ด๋ถ€ ์„œ๋ฒ„๊ฐ„ ์ด๋ฒคํŠธ ์ „ํŒŒ์™€ ๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ๋กœ์˜ SSE ์•Œ๋ฆผ ์ „์†ก์— ํšจ๊ณผ์ ์ด์—ˆ์ง€๋งŒ, ์•Œ๋ฆผ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ฒ˜๋ฆฌ์— ๋ณ‘๋ชฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํŒจ์‹œ ์žฌ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.์ด๋Ÿฌํ•œ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž AWS SQS๋ฅผ ๋„์ž…ํ•˜์—ฌ ์•Œ๋ฆผ ์‹œ์Šคํ…œ์„ ์žฌ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด ๊ธ€์—์„œ ๊ตฌ์กฐ ์„ค๊ณ„, ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์ค‘์‹ฌ์œผ๋กœ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ์ „ํ™˜ ๊ณผ์ •์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.SQS๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋œ ์ด์œ ๊ธฐ์กด์—๋Š” ์›จ์ดํŒ… ํ˜ธ์ถœ ์‹œ ํ•ด๋‹น ์›จ์ดํŒ…์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ๋งŒ ์žˆ์—ˆ์ง€๋งŒ, ์ดํ›„ ์ฟ ํฐ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ํ•ด๋‹น ๊ฐ€๊ฒŒ๋ฅผ ์ฐœํ•œ ์‚ฌ์šฉ์ž ์ „์ฒด์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•ด์•ผ ํ•˜..
[AWS] AWS SQS(Simple Queue Service) ์ดํ•ดํ•˜๊ธฐ
ยท
๊ณต๋ถ€ํ•˜๊ธฐ/Cloud
AWS SQS๋ž€?Simple Queue Service๋กœ, AWS์—์„œ ์„œ๋น„์Šคํ•˜๋Š” ๋ฉ”์‹œ์ง€ ํ์ด๋‹ค.๋ฉ”์‹œ์ง€ ํ๋ฅผ ์™œ ์‚ฌ์šฉํ• ๊นŒ?ํ•˜๋‚˜์˜ API ์š”์ฒญ์— ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋Š” ํ›„์ฒ˜๋ฆฌ ์ž‘์—…๋“ค์ด ๋งŽ์€ ๊ฒฝ์šฐ ⇒ ์‘๋‹ต ์ง€์—ฐ ์ตœ์†Œํ™” ๋ฐ ์‹œ์Šคํ…œ ๊ฐ„ ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ ๊ฐ€๋Šฅ๋ฌธ์ œ ์ƒํ™ฉ์‘๋‹ต ์ง€์—ฐ ๋ฌธ์ œ : API ๋‚ด๋ถ€์—์„œ ๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ์‘๋‹ต ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•จ → UX ์ €ํ•˜์žฅ์•  ์ „ํŒŒ ์œ„ํ—˜ : ์™ธ๋ถ€ API ํ˜ธ์ถœ์ด ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ, ์„œ๋น„์Šค ํ•˜๋‚˜์— ์žฅ์• ๊ฐ€ ๋‚˜๋„ ์ „์ฒด ๊ธฐ๋Šฅ ์žฅ์• ๋กœ ์ด์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œํ•ด๊ฒฐํ•œ API๋Š” ๊ด€๋ จ ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋™๋ฐ˜๋˜์–ด์•ผ ํ•˜๋Š” ๊ฐ ์ž‘์—…์„ ๋ฉ”์‹œ์ง€๋กœ ๋งŒ๋“ค์–ด ํ์— ๋„ฃ์Œ๊ฐ๊ฐ์˜ ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๋Š” Consumer๊ฐ€ ํ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์†Œ๋น„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•จํšจ๊ณผ๊ณ ๊ฐ์˜ ์‘๋‹ต ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๊ฐ์†Œํ›„์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์— ์žฅ์• ๊ฐ€ ๋‚˜๋„ ๋ฉ”์ธ ์ž‘์—… ์ž์ฒด๋Š” ์ •์ƒ ..
์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ธฐ์ˆ  ์ •๋ฆฌ | Polling, Long-Polling, SSE, WebSocket
ยท
๊ณต๋ถ€ํ•˜๊ธฐ/ETC
์ตœ๊ทผ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ–ˆ๋˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์— ๋Œ€ํ‘œ์ ์ธ ๊ธฐ์ˆ ๋“ค์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.1. Polling์ฃผ๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด ์—…๋ฐ์ดํŠธ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๊ณ„์†ํ•ด์„œ request๋ฅผ ์ „์†กํ•œ๋‹ค.์„œ๋ฒ„๋Š” ๋ฐ˜๋ณต๋˜๋Š” request์— ์‘๋‹ตํ•˜๋ฉด์„œ, ์ „๋‹ฌํ•  ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ „๋‹ฌํ•œ๋‹ค.โ–ถ๏ธŽ ์žฅ์ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋‹ค. (๊ธฐ๋ณธ HTTP๋งŒ ์ง€์›๋˜๋ฉด ๊ตฌํ˜„ ๊ฐ€๋Šฅ)โ–ถ๏ธŽ ๋‹จ์ ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์ด ๋งŽ์•„์ง€๋ฏ€๋กœ ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.์ƒˆ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ž๋งˆ์ž ํ™•์ธํ•  ์ˆ˜๋Š” ์—†์–ด ์ง€์—ฐ(Latency)์ด ์กด์žฌํ•œ๋‹ค.๋‹ค์ˆ˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.๋งค์šฐ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹ค์‹œ๊ฐ„ (๋น„์Šทํ•œ) ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹ 2. Long Pollingํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ..
[Spring] DI์™€ IoC ์ดํ•ดํ•˜๊ธฐ
ยท
๊ณต๋ถ€ํ•˜๊ธฐ/Spring
DI ์ ์šฉ ์ „ ๊ฐ์ฒด ์‚ฌ์šฉ ๋ฐฉ์‹DI ๊ฐœ๋…์„ ์ ์šฉํ•˜๊ธฐ ์ „์—๋Š” ๊ฐ์ฒด ์‚ฌ์šฉ ์‹œ ์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์„๊นŒ?1. ์ง์ ‘ ๊ฐ์ฒด ์ƒ์„ฑ์‚ฌ์šฉํ•˜๋ ค๋Š”(=์˜์กดํ•˜๋ ค๋Š”) ๊ฐ์ฒด๋ฅผ ``new`` ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ƒ์„ฑํ•œ๋‹ค.public class CafeController { private StarbucksService starbucksService = new StarbucksService(); public void orderCoffee() { starbucksService.brew(); }}์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๊ฐ์ฒด๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๊ฐ•ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋งŒ์ผ ์Šคํƒ€๋ฒ…์Šค๊ฐ€ ๋ถ€๋„๊ฐ€ ๋‚˜์„œ ์„œ๋น„์Šค๋ฅผ ์Šคํƒ€๋ฒ…์Šค๊ฐ€ ์•„๋‹Œ ํŒ€ํ™€ํŠผ์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•  ๊ฒฝ์šฐ (ใ…Ž) CafeController ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.StarbucksService๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ..
[SpringBoot] ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ MultipartFile์˜ ์ฒ˜๋ฆฌ/๋™์ž‘ ๋ฐฉ์‹
ยท
๊ณต๋ถ€ํ•˜๊ธฐ/Spring
Spring์—์„œ๋Š” ``MultipartFile`` ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.1. Multipart Upload๋ž€?์ด๋ฏธ์ง€, ์˜์ƒ, ๋ฌธ์„œ ๋“ฑ์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ HTTP ์š”์ฒญ ๋ฐฉ์‹์ด๋‹ค.์š”์ฒญ์˜ ``Content-Type``์€ ``multipart/form-data``๋กœ ์ง€์ •๋˜๋ฉฐ,๋ฐ์ดํ„ฐ๋Š” ์š”์ฒญ ๋ณธ๋ฌธ(Body)์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋œ๋‹ค.Header : Content-Type, ํ•„๋“œ ์ด๋ฆ„ ๋“ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐBody: ์‹ค์ œ ๋ฐ์ดํ„ฐ (ํŒŒ์ผ, ํผ ํ•„๋“œ ๊ฐ’ ๋“ฑ)Multipart Upload ์š”์ฒญ ์˜ˆ์‹œPOST /upload HTTP/1.1Content-Type: multipart/form-data; boundary=----WebKitFormBoundary------WebKitF..
[SpringBoot] SSE๋ฅผ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์ „์†ก ๊ตฌํ˜„๊ธฐ (feat. Redis Pub/Sub)
ยท
๋งŒ๋“ค์–ด๋ณด๊ธฐ/Spring
1. ๋“ค์–ด๊ฐ€๋ฉฐ์Œ์‹์  ์›จ์ดํŒ… ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ, ์‚ฌ์šฉ์ž์˜ ์›จ์ดํŒ…์ด ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์„ ์ „์†กํ•ด์•ผ ํ–ˆ๋‹ค.์•Œ๋ฆผ์„ ์ „์†กํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์ฒ˜์Œ ๊ตฌํ˜„ํ•ด๋ณด์•˜๊ธฐ์— ๊ธฐ๋กํ•ด๋ณธ๋‹ค.2. ๊ธฐ์ˆ  ์„ ํƒ ๋ฐฐ๊ฒฝโ–ถ SSE + Redis Pub/Sub ์กฐํ•ฉ์„ ์„ ํƒํ–ˆ๋‹ค, ๊ทธ ์ด์œ ๋Š”?๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ๋“ค์„ ๋น„๊ตํ•ด๋ณด์•˜๋‹ค.๊ธฐ์ˆ ์„ค๋ช…์žฅ์ ๋‹จ์ ํ”„๋กœ์ ํŠธ ๊ธฐ์ค€ ํ‰๊ฐ€SSE์„œ๋ฒ„ → ํด๋ผ์ด์–ธํŠธ ๋‹จ๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ (HTTP ๊ธฐ๋ฐ˜)๊ตฌํ˜„ ๊ฐ„๋‹จ, ๋ธŒ๋ผ์šฐ์ € ์ง€์›, HTTP ๊ธฐ๋ฐ˜์ด๋ผ ์ธํ”„๋ผ ๋ณ€๊ฒฝ ์ตœ์†Œ์–‘๋ฐฉํ–ฅ ๋ถˆ๊ฐ€, ์ปค๋„ฅ์…˜ ๊ด€๋ฆฌ ํ•„์š” (๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ์•ฝ 6๊ฐœ)โœ… ํ˜„์žฌ ๋‹จ๋ฐฉํ–ฅ ์•Œ๋ฆผ ๊ตฌํ˜„ ์ค‘์ด๋ฏ€๋กœ ์ ํ•ฉํ•จ์›น์†Œ์ผ“์„œ๋ฒ„ ↔ ํด๋ผ์ด์–ธํŠธ ์–‘๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ๊ฐ•๋ ฅํ•œ ์‹ค์‹œ๊ฐ„์„ฑ, ์–‘๋ฐฉํ–ฅ ๊ฐ€๋Šฅ, ๋‚ฎ์€ ์ง€์—ฐ์ธํ”„๋ผ ๊ตฌ์„ฑ ๋ถ€๋‹ด (๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์„ค์ • ํ•„์š” ๋“ฑ), ์—ฐ๊ฒฐ ์œ ์ง€ ๋น„์šฉ ↑๋‹จ๋ฐฉํ–ฅ ..
[TroubleShooting] MySQL ๋ฝ์„ ๊ฑด ์ ์ด ์—†๋Š”๋ฐ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ•œ๋‹ค
ยท
๋งŒ๋“ค์–ด๋ณด๊ธฐ/TroubleShooting
๋ฐฐ๊ฒฝ๋™์‹œ์„ฑ ์ œ์–ด ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์—, ํ‹ฐ์ผ“ํŒ… ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค์ˆ˜์˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ๊ฐ™์€ ์ขŒ์„์„ ์˜ˆ๋งคํ•˜๋Š” ์ƒํ™ฉ์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์งฐ๋‹ค.ํ•ด๋‹น ํ…Œ์ŠคํŠธ๋Š” ๋‹ค์Œ ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๋‹ค.๋™์‹œ์„ฑ ์ œ์–ด ์—†์ด ์ค‘๋ณต ์˜ˆ๋งค๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๊ฒ€์ฆ๋ถ„์‚ฐ ๋ฝ ์—†์ด JPA ํŠธ๋žœ์žญ์…˜๋งŒ์œผ๋กœ๋Š” ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ๊ฒ€์ฆ์ด์— ๋”ฐ๋ผ n๋ช…์˜ ์œ ์ €๊ฐ€ ํ•˜๋‚˜์˜ ์ขŒ์„์„ ๋™์‹œ์— ์˜ˆ๋งคํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.์˜ˆ์ƒ ๊ฒฐ๊ณผํ…Œ์ŠคํŠธ์˜ ์˜ˆ์ƒ ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.์•„์ง ๋ฝ์„ ๊ฑธ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ‹ฐ์ผ“์ด ์—ฌ๋Ÿฌ ๊ฐœ ์ƒ์„ฑ๋˜์–ด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•ด์•ผ ํ•œ๋‹ค.์ฆ‰ ํ•˜๋‚˜์˜ ``200 OK`` ์‘๋‹ต๊ณผ n-1๊ฐœ์˜ ``400 BAD REQUEST`` ์‘๋‹ต์ด ๋ฐ˜ํ™˜๋œ๋‹ค.ํ•˜์ง€๋งŒ ... ์‹ค์ œ ๊ฒฐ๊ณผ์‹ค์ œ ๊ฒฐ๊ณผ๋Š” ์ „ํ˜€ ๋‹ค๋ฅด๊ฒŒ ๋‚˜์™”๋‹ค.์‹ค์ œ๋กœ ์ƒ์„ฑ๋œ ํ‹ฐ์ผ“์€ 1๊ฐœ ๋ฟ์ด์—ˆ๋‹ค.ํ•˜๋‚˜์˜ ``200 OK`` ..
[SpringBoot] AWS S3๋ฅผ ์ด์šฉํ•œ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋กœ์ง ๊ตฌํ˜„๊ธฐ
ยท
๋งŒ๋“ค์–ด๋ณด๊ธฐ/Spring
1. ProfileImage ์„ค๊ณ„์‚ฌ์šฉ์ž๋Š” ํ•˜๋‚˜์˜ ํ”„๋กœํ•„ ์‚ฌ์ง„์„ ๊ฐ–๋Š”๋‹ค. → OneToOneProfileImage์—์„œ ์‚ฌ์šฉ์ž๋ฅผ ์ฐธ์กฐํ•  ์ผ์€ ์—†๋‹ค → ๋‹จ๋ฐฉํ–ฅS3์—์„œ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฒ„ํ‚ท์— ์ €์žฅ๋œ ์ด๋ฆ„์ด ํ•„์š”ํ•˜๋‹ค.S3์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฐ์ฒด url๋กœ ์ด๋ฏธ์ง€์— ์ ‘๊ทผํ•œ๋‹ค.``๊ฐ์ฒด url``๊ณผ ํ•จ๊ป˜ ์ €์žฅํ•  ``๋ฒ„ํ‚ท์— ์ €์žฅ๋œ ์ด๋ฆ„`` ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๋ฏ€๋กœ ํ•ด๋‹น ์ •๋ณด๋ฅผ ๋‹ด์€ ํ…Œ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.โœ“ ProfileImage ์—”ํ‹ฐํ‹ฐ๋‹ค์Œ๊ณผ ๊ฐ™์ด ProfileImage ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์—ˆ๋‹ค.@Getter@Entity@NoArgsConstructor@Table(name = "profile_images")public class ProfileImage { @Id @GeneratedValue(strategy = G..
[Network] HTTP ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ
ยท
๊ณต๋ถ€ํ•˜๊ธฐ/Network
๐ŸŒ€ HTTP ์‘๋‹ต ์ฝ”๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ HTTP ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค.3์ž๋ฆฌ ์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, 100๋ฒˆ๋Œ€ ~ 500๋ฒˆ๋Œ€ ๊นŒ์ง€ ์กด์žฌํ•œ๋‹ค.์ฝ”๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ž๋ฆฌ์— ๋”ฐ๋ผ 5๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋‰œ๋‹ค.์ฝ”๋“œ์˜๋ฏธ1xx์ •๋ณด ์ œ๊ณต ์‘๋‹ต, ์š”์ฒญ ์ฒ˜๋ฆฌ ์ค‘2xx์„ฑ๊ณต, ์š”์ฒญ ์ •์ƒ ์ฒ˜๋ฆฌ3xx๋ฆฌ๋””๋ ‰์…˜, ์š”์ฒญ ์™„๋ฃŒ๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€ ์ž‘์—… ํ•„์š”4xxํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜, ์š”์ฒญ์ด ์ž˜๋ชป๋จ5xx์„œ๋ฒ„ ์˜ค๋ฅ˜, ์„œ๋ฒ„์ธก์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๐Ÿ’ฌ 200(ok)์™€ 201(created)์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.200(ok) : ์š”์ฒญ์ด ์ •์ƒ ์ฒ˜๋ฆฌ ๋˜์—ˆ์„ ๋•Œ ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ201(created) : ์š”์ฒญ์ด ์ •์ƒ ์ฒ˜๋ฆฌ ๋˜์—ˆ์œผ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ์ผ๋ฐ˜์ ์œผ๋กœ POST ์š”์ฒญ ์„ฑ๊ณต ์‹œ ..
Uniqueํ•œ ๊ฐ’์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” UUID, UUID๋ž€?
ยท
๊ณต๋ถ€ํ•˜๊ธฐ/ETC
๐Ÿท๏ธ UUID (Universally Unique Identifier)์ด๋ฆ„ ๊ทธ๋Œ€๋กœ UUID๋Š” ์ „์„ธ๊ณ„์ ์œผ๋กœ ๊ณ ์œ ํ•œ ์‹๋ณ„์ž์ด๋‹ค. ์ด๋ก ์ƒ์œผ๋กœ ์ค‘๋ณต๋  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฑฐ์˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ณ ์œ ํ•œ ๊ฐ’์„ ๋ณด์žฅํ•˜๋Š” ๋ฐ ๋งค์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋œ๋‹ค.128๋น„ํŠธ ๊ธธ์ด์˜ ๊ฐ’์ด๋‹ค.๋ณดํ†ต 8-4-4-4-12 ํ˜•ํƒœ์˜ 36์ž ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„๋œ๋‹ค. (ex. ``550e8400-e29b-41d4-a716-446655440000``)โ–ถ๏ธŽ ์žฅ์ ๋ฐ์ดํ„ฐ์˜ ๊ณ ์œ ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.์„œ๋ฒ„๊ฐ„ ๋™๊ธฐํ™” ์—†์ด๋„ ๊ณ ์œ ํ•œ ID๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์— ์ ํ•ฉํ•˜๋‹ค. โ–ถ๏ธŽ ๋‹จ์ ๊ธธ์ด๊ฐ€ ๊ธธ์–ด ์ €์žฅ ๊ณต๊ฐ„์„ ๋งŽ์ด ์ฐจ์ง€ํ•œ๋‹ค. (128๋น„ํŠธ = 16๋ฐ”์ดํŠธ = ๋ฌธ์ž์—ด๋กœ 36์ž)DB์—์„œ ์ธ๋ฑ์‹ฑ ํšจ์œจ์ด ๋‚ฎ์„ ์ˆ˜ ์žˆ๋‹ค.UUID๋Š” ๋ฌด์ž‘์œ„์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ฐจ์ ์ธ ๊ฐ’์ด..