[Springboot + AWS SQS] ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๊ตฌํ˜„๊ธฐ [1] ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ ๋กœ์ง (Outbox ํŒจํ„ด)
ยท
Project/Spring
์„œ๋ก ๊ธฐ์กด์—๋Š” Spring์˜ `ApplicationEventPublisher`์™€ Redis์˜ Pub/Sub ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.์ด ๊ตฌ์กฐ๋Š” ๋‚ด๋ถ€ ์„œ๋ฒ„๊ฐ„ ์ด๋ฒคํŠธ ์ „ํŒŒ์™€ ๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ๋กœ์˜ SSE ์•Œ๋ฆผ ์ „์†ก์— ํšจ๊ณผ์ ์ด์—ˆ์ง€๋งŒ, ์•Œ๋ฆผ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ฒ˜๋ฆฌ์— ๋ณ‘๋ชฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํŒจ์‹œ ์žฌ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.์ด๋Ÿฌํ•œ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž AWS SQS๋ฅผ ๋„์ž…ํ•˜์—ฌ ์•Œ๋ฆผ ์‹œ์Šคํ…œ์„ ์žฌ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด ๊ธ€์—์„œ ๊ตฌ์กฐ ์„ค๊ณ„, ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์ค‘์‹ฌ์œผ๋กœ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ์ „ํ™˜ ๊ณผ์ •์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.SQS๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋œ ์ด์œ ๊ธฐ์กด์—๋Š” ์›จ์ดํŒ… ํ˜ธ์ถœ ์‹œ ํ•ด๋‹น ์›จ์ดํŒ…์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ๋งŒ ์žˆ์—ˆ์ง€๋งŒ, ์ดํ›„ ์ฟ ํฐ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ํ•ด๋‹น ๊ฐ€๊ฒŒ๋ฅผ ์ฐœํ•œ ์‚ฌ์šฉ์ž ์ „์ฒด์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•ด์•ผ ํ•˜..
[AWS] AWS SQS(Simple Queue Service) ์ดํ•ดํ•˜๊ธฐ
ยท
Programming/Cloud
AWS SQS๋ž€?Simple Queue Service๋กœ, AWS์—์„œ ์„œ๋น„์Šคํ•˜๋Š” ๋ฉ”์‹œ์ง€ ํ์ด๋‹ค.๋ฉ”์‹œ์ง€ ํ๋ฅผ ์™œ ์‚ฌ์šฉํ• ๊นŒ?ํ•˜๋‚˜์˜ API ์š”์ฒญ์— ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋Š” ํ›„์ฒ˜๋ฆฌ ์ž‘์—…๋“ค์ด ๋งŽ์€ ๊ฒฝ์šฐ โ‡’ ์‘๋‹ต ์ง€์—ฐ ์ตœ์†Œํ™” ๋ฐ ์‹œ์Šคํ…œ ๊ฐ„ ๊ฒฐํ•ฉ๋„ ๊ฐ์†Œ ๊ฐ€๋Šฅ๋ฌธ์ œ ์ƒํ™ฉ์‘๋‹ต ์ง€์—ฐ ๋ฌธ์ œ : API ๋‚ด๋ถ€์—์„œ ๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ์‘๋‹ต ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์ฆ๊ฐ€ํ•จ โ†’ UX ์ €ํ•˜์žฅ์•  ์ „ํŒŒ ์œ„ํ—˜ : ์™ธ๋ถ€ API ํ˜ธ์ถœ์ด ํฌํ•จ๋˜๋Š” ๊ฒฝ์šฐ, ์„œ๋น„์Šค ํ•˜๋‚˜์— ์žฅ์• ๊ฐ€ ๋‚˜๋„ ์ „์ฒด ๊ธฐ๋Šฅ ์žฅ์• ๋กœ ์ด์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Œํ•ด๊ฒฐํ•œ API๋Š” ๊ด€๋ จ ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋™๋ฐ˜๋˜์–ด์•ผ ํ•˜๋Š” ๊ฐ ์ž‘์—…์„ ๋ฉ”์‹œ์ง€๋กœ ๋งŒ๋“ค์–ด ํ์— ๋„ฃ์Œ๊ฐ๊ฐ์˜ ์ž‘์—…์„ ๋‹ด๋‹นํ•˜๋Š” Consumer๊ฐ€ ํ์—์„œ ๋ฉ”์‹œ์ง€๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์†Œ๋น„ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•จํšจ๊ณผ๊ณ ๊ฐ์˜ ์‘๋‹ต ๋Œ€๊ธฐ ์‹œ๊ฐ„ ๊ฐ์†Œํ›„์ฒ˜๋ฆฌ ์‹œ์Šคํ…œ์— ์žฅ์• ๊ฐ€ ๋‚˜๋„ ๋ฉ”์ธ ์ž‘์—… ์ž์ฒด๋Š” ์ •์ƒ ..
์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก ๊ธฐ์ˆ  ์ •๋ฆฌ | Polling, Long-Polling, SSE, WebSocket
ยท
Programming/ETC
์ตœ๊ทผ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๊ณต๋ถ€ํ–ˆ๋˜ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์— ๋Œ€ํ‘œ์ ์ธ ๊ธฐ์ˆ ๋“ค์„ ์ •๋ฆฌํ•ด๋ณธ๋‹ค.1. Polling์ฃผ๊ธฐ์ ์œผ๋กœ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด ์—…๋ฐ์ดํŠธ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๊ณ„์†ํ•ด์„œ request๋ฅผ ์ „์†กํ•œ๋‹ค.์„œ๋ฒ„๋Š” ๋ฐ˜๋ณต๋˜๋Š” request์— ์‘๋‹ตํ•˜๋ฉด์„œ, ์ „๋‹ฌํ•  ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์ „๋‹ฌํ•œ๋‹ค.โ–ถ๏ธŽ ์žฅ์ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๋‹ค. (๊ธฐ๋ณธ HTTP๋งŒ ์ง€์›๋˜๋ฉด ๊ตฌํ˜„ ๊ฐ€๋Šฅ)โ–ถ๏ธŽ ๋‹จ์ ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์ด ๋งŽ์•„์ง€๋ฏ€๋กœ ์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.์ƒˆ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ž๋งˆ์ž ํ™•์ธํ•  ์ˆ˜๋Š” ์—†์–ด ์ง€์—ฐ(Latency)์ด ์กด์žฌํ•œ๋‹ค.๋‹ค์ˆ˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ๋„คํŠธ์›Œํฌ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.๋งค์šฐ๋งค์šฐ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹ค์‹œ๊ฐ„ (๋น„์Šทํ•œ) ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹ 2. Long Pollingํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ..
[Spring] DI์™€ IoC ์ดํ•ดํ•˜๊ธฐ
ยท
Programming/Spring
DI ์ ์šฉ ์ „ ๊ฐ์ฒด ์‚ฌ์šฉ ๋ฐฉ์‹DI ๊ฐœ๋…์„ ์ ์šฉํ•˜๊ธฐ ์ „์—๋Š” ๊ฐ์ฒด ์‚ฌ์šฉ ์‹œ ์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์„๊นŒ?1. ์ง์ ‘ ๊ฐ์ฒด ์ƒ์„ฑ์‚ฌ์šฉํ•˜๋ ค๋Š”(=์˜์กดํ•˜๋ ค๋Š”) ๊ฐ์ฒด๋ฅผ ``new`` ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ƒ์„ฑํ•œ๋‹ค.public class CafeController { private StarbucksService starbucksService = new StarbucksService(); public void orderCoffee() { starbucksService.brew(); }}์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๊ฐ์ฒด๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๊ฐ•ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋งŒ์ผ ์Šคํƒ€๋ฒ…์Šค๊ฐ€ ๋ถ€๋„๊ฐ€ ๋‚˜์„œ ์„œ๋น„์Šค๋ฅผ ์Šคํƒ€๋ฒ…์Šค๊ฐ€ ์•„๋‹Œ ํŒ€ํ™€ํŠผ์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•  ๊ฒฝ์šฐ (ใ…Ž) CafeController ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.StarbucksService๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ..
[Spring] MultipartFile์„ ์ด์šฉํ•œ ํŒŒ์ผ ์—…๋กœ๋“œ, MultipartFile์ด ๋ญ”๋ฐ?
ยท
Programming/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..
[Spring] SSE๋ฅผ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์ „์†ก ๊ตฌํ˜„๊ธฐ (feat. Redis Pub/Sub)
ยท
Project/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`` ..
[Spring] ํ”„๋กœํ•„ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ ๋กœ์ง ๊ตฌํ˜„๊ธฐ | AWS S3 ์‚ฌ์šฉ
ยท
Project/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 ์‘๋‹ต ์ƒํƒœ ์ฝ”๋“œ
ยท
Programming/Network
๐ŸŒ€ HTTP ์‘๋‹ต ์ฝ”๋“œ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ HTTP ์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค.3์ž๋ฆฌ ์ˆซ์ž๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, 100๋ฒˆ๋Œ€ ~ 500๋ฒˆ๋Œ€ ๊นŒ์ง€ ์กด์žฌํ•œ๋‹ค.์ฝ”๋“œ์˜ ์ฒซ ๋ฒˆ์งธ ์ž๋ฆฌ์— ๋”ฐ๋ผ 5๊ฐœ์˜ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋‰œ๋‹ค.์ฝ”๋“œ์˜๋ฏธ1xx์ •๋ณด ์ œ๊ณต ์‘๋‹ต, ์š”์ฒญ ์ฒ˜๋ฆฌ ์ค‘2xx์„ฑ๊ณต, ์š”์ฒญ ์ •์ƒ ์ฒ˜๋ฆฌ3xx๋ฆฌ๋””๋ ‰์…˜, ์š”์ฒญ ์™„๋ฃŒ๋ฅผ ์œ„ํ•ด ์ถ”๊ฐ€ ์ž‘์—… ํ•„์š”4xxํด๋ผ์ด์–ธํŠธ ์˜ค๋ฅ˜, ์š”์ฒญ์ด ์ž˜๋ชป๋จ5xx์„œ๋ฒ„ ์˜ค๋ฅ˜, ์„œ๋ฒ„์ธก์—์„œ ์˜ค๋ฅ˜ ๋ฐœ์ƒ ๐Ÿ’ฌ 200(ok)์™€ 201(created)์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.200(ok) : ์š”์ฒญ์ด ์ •์ƒ ์ฒ˜๋ฆฌ ๋˜์—ˆ์„ ๋•Œ ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ201(created) : ์š”์ฒญ์ด ์ •์ƒ ์ฒ˜๋ฆฌ ๋˜์—ˆ์œผ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ ์„œ๋ฒ„์—์„œ ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ์‚ฌ์šฉ์ผ๋ฐ˜์ ์œผ๋กœ POST ์š”์ฒญ ์„ฑ๊ณต ์‹œ ..
Uniqueํ•œ ๊ฐ’์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” UUID, UUID๋ž€?
ยท
Programming/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๋Š” ๋ฌด์ž‘์œ„์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ˆœ์ฐจ์ ์ธ ๊ฐ’์ด..
[Network] HTTP Method์™€ ๋ฉฑ๋“ฑ์„ฑ
ยท
Programming/Network
๐ŸŒ€ HTTP๊ฐ€ ๋ญ”๊ฐ€์š”?HTTP stands for 'Hyper Text Transfer Protocol'์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ด๋‹ค.์ „์†ก ๊ณ„์ธต ํ”„๋กœํ† ์ฝœ์œผ๋กœ TCP๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.๐ŸŒ€ HTTP Method์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.HTTP ์š”์ฒญ์ด ์ฃผ์–ด์ง„ ๋ฆฌ์†Œ์Šค์— ์ˆ˜ํ–‰ํ•˜๊ธธ ์›ํ•˜๋Š” ํ–‰๋™์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๋กœ๋Š” ``GET``, ``POST``, ``PUT``, ``DELETE``, ``PATCH``๊ฐ€ ์žˆ๋‹ค.๐Ÿ’ฌ GET๊ณผ POST์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?GET ์š”์ฒญ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์š”์ฒญPOST ์š”์ฒญ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ œ์ถœํ•˜๋Š” ์š”์ฒญ๐Ÿ’ฌ POST, PUT, PATCH์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”?์„ธ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ ์ œ์ถœํ•˜๋Š” ์š”์ฒญ ๋ฉ”์„œ๋“œ์ด๋‹ค.POST๋Š” ๋ฐ์ดํ„ฐ์˜ ์ œ์ถœ..
[Network] ์ฟ ํ‚ค์™€ ์„ธ์…˜
ยท
Programming/Network
๐ŸŒ€ ์ฟ ํ‚ค์™€ ์„ธ์…˜์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด ์ฃผ์„ธ์š”.๋‘ ๊ธฐ์ˆ  ๋ชจ๋‘ ์›น ๊ฐœ๋ฐœ์—์„œ ์‚ฌ์šฉ์ž์˜ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค.์ฟ ํ‚คํ‚ค-๊ฐ’ ํ˜•ํƒœ๋กœ ํด๋ผ์ด์–ธํŠธ์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ์ด๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š” ํ•œ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๊ธฐ ์ „๊นŒ์ง€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ข…๋ฃŒ๊ฐ€ ๋˜์–ด๋„ ๊ณ„์† ์œ ์ง€๋œ๋‹ค.๋ฐ์ดํ„ฐ ์ €์žฅ ์œ„์น˜ : ํด๋ผ์ด์–ธํŠธ ์ธก์˜ ์›น ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅ๋ฐ์ดํ„ฐ ์œ ์ง€ ์‹œ๊ฐ„ : ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์‚ญ์ œํ•˜์ง€ ์•Š๋Š” ํ•œ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ์ง€๋‚˜๊ธฐ ์ „๊นŒ์ง€ ์œ ์ง€์šฉ๋Ÿ‰ : ์ผ๋ฐ˜์ ์œผ๋กœ ํ•œ ์‚ฌ์ดํŠธ์˜ ์ตœ๋Œ€ ์ฟ ํ‚ค ํฌ๊ธฐ๋Š” 4KB์ด๋‹ค.๋ณด์•ˆ : ํด๋ผ์ด์–ธํŠธ ์ธก์— ๋ฐ์ดํ„ฐ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์„ฑ์ด ๋‚ฎ๋‹ค. ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ํฌํ•จํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์•”ํ˜ธํ™”ํ•ด์•ผ ํ•œ๋‹ค. ์†์„ฑ ์ค‘ HttyOnly, Secure ์†์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.์„ธ์…˜์ผ์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ๊ฐ™์€ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” ..