[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๋ฅผ ์ด์šฉํ•œ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๊ตฌํ˜„ํ•˜๊ธฐ - ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ ๋กœ์ง
ยท
Project/Spring
์„œ๋ก ๊ธฐ์กด์—๋Š” Spring์˜ `ApplicationEventPublisher`์™€ Redis์˜ Pub/Sub ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.์ด ๊ตฌ์กฐ๋Š” ๋‚ด๋ถ€ ์„œ๋ฒ„๊ฐ„ ์ด๋ฒคํŠธ ์ „ํŒŒ์™€ ๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ๋กœ์˜ SSE ์•Œ๋ฆผ ์ „์†ก์— ํšจ๊ณผ์ ์ด์—ˆ์ง€๋งŒ, ์•Œ๋ฆผ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ฒ˜๋ฆฌ์— ๋ณ‘๋ชฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํŒจ์‹œ ์žฌ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.์ด๋Ÿฌํ•œ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž AWS SQS๋ฅผ ๋„์ž…ํ•˜์—ฌ ์•Œ๋ฆผ ์‹œ์Šคํ…œ์„ ์žฌ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด ๊ธ€์—์„œ ๊ตฌ์กฐ ์„ค๊ณ„, ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์ค‘์‹ฌ์œผ๋กœ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ์ „ํ™˜ ๊ณผ์ •์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.SQS๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋œ ์ด์œ ๊ธฐ์กด์—๋Š” ์›จ์ดํŒ… ํ˜ธ์ถœ ์‹œ ํ•ด๋‹น ์›จ์ดํŒ…์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ๋งŒ ์žˆ์—ˆ์ง€๋งŒ, ์ดํ›„ ์ฟ ํฐ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ํ•ด๋‹น ๊ฐ€๊ฒŒ๋ฅผ ์ฐœํ•œ ์‚ฌ์šฉ์ž ์ „์ฒด์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•ด์•ผ ํ•˜..
[Spring] LoginCheckFilter ๊ตฌํ˜„ : ๋กœ๊ทธ์ธ/์•„์›ƒ ๋กœ์ง ๊ตฌํ˜„ํ•˜๊ธฐ
ยท
Programming/Spring
Filter ์•Œ์•„๋ณด๊ธฐFilter ์‹คํ–‰ ํ๋ฆ„HTTP ์š”์ฒญ → WAS → `Filter 1 → Filter 2 → ... → Filter N` → Servlet → Controller Servlet์ด ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— Filter๋ฅผ ํ•ญ์ƒ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค.๋”ฐ๋ผ์„œ Controller์—์„œ ์ˆ˜ํ–‰ํ•  ๊ณตํ†ต ๊ด€์‹ฌ ์‚ฌํ•ญ์„ Filter์— ๊ตฌํ˜„ํ•˜๋ฉด ๋ชจ๋“  ์š”์ฒญ ํ˜น์€ ์‘๋‹ต์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.ํŠน์ • URL Pattern์—๋งŒ Filter๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜๋„ ์žˆ๋‹ค.Filter์˜ ๊ตฌํ˜„Filter Interface`jakarta.servlet.Filter` ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ์•ผ ํ•œ๋‹ค.์ฃผ์š” ๋ฉ”์„œ๋“œ๋Š” `init`, `doFilter`, `destroy`๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.HTTP ์š”์ฒญ์ด ์˜ค๋ฉด `doFilter` ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.  ← ์›ํ•˜๋Š” ๋กœ์ง์„ ์ด ..
[Spring] ๊ธฐ๋ณธ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ Custom ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๊ธฐ
ยท
Programming/Spring
์ผ์ • ๊ด€๋ฆฌ ์•ฑ ๊ณผ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์ปค์Šคํ…€ ํ•˜๋Š” ๋ฒ•์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ–ˆ๋‹ค.์งง๊ฒŒ ๋‹ค์‹œ ๋ณต๊ธฐํ•ด๋ณด์ž๋ฉด !์ปค์Šคํ…€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•๊ฐ€์žฅ ๋ช…์‹œ์ ์œผ๋กœ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋Š” `try-catch` ๋ฌธ์œผ๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ถ€๋ถ„์— `try-catch` ๋ฌธ์„ ๋•์ง€๋•์ง€ ๋ถ™์ผ ์ˆ˜๋Š” ์—†๋‹ค .. (์•„๋ฌด๋„ ๋ณด๊ณ  ์‹ถ์ง€ ์•Š์•„ํ•˜๋Š” ๋ˆ„๋”๊ธฐ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ) Spring์—์„œ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ํŠน์ • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋“ฑ๋กํ•œ ํŠน์ • ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ ์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. (๐Ÿ™‡๐Ÿป‍โ™€๏ธ๐Ÿ™‡๐Ÿป‍โ™€๏ธ)ํ•ด๋‹น ๋ฉ”์„œ๋“œ์—๋Š” `@ExceptionHandler` ์–ด๋…ธํ…Œ์ด์…˜์„ ๋‹ฌ์•„์ฃผ๋ฉด ๋œ๋‹ค. ์ด `@ExceptionHandler` ์–ด๋…ธํ…Œ์ด์…˜์•ˆ์— ๋‹ด๋‹นํ•  ์˜ˆ์™ธ ํด๋ž˜์Šค๋“ค์„ ๋ช…์‹œํ•ด์ค€๋‹ค.@ExceptionH..