[Springboot] AWS SQS๋ฅผ ์ด์šฉํ•œ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๊ตฌํ˜„ํ•˜๊ธฐ - ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ ๋กœ์ง
ยท
Project/Spring
์„œ๋ก ๊ธฐ์กด์—๋Š” Spring์˜ `ApplicationEventPublisher`์™€ Redis์˜ Pub/Sub ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.์ด ๊ตฌ์กฐ๋Š” ๋‚ด๋ถ€ ์„œ๋ฒ„๊ฐ„ ์ด๋ฒคํŠธ ์ „ํŒŒ์™€ ๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ๋กœ์˜ SSE ์•Œ๋ฆผ ์ „์†ก์— ํšจ๊ณผ์ ์ด์—ˆ์ง€๋งŒ, ์•Œ๋ฆผ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ฒ˜๋ฆฌ์— ๋ณ‘๋ชฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํŒจ์‹œ ์žฌ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.์ด๋Ÿฌํ•œ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž AWS SQS๋ฅผ ๋„์ž…ํ•˜์—ฌ ์•Œ๋ฆผ ์‹œ์Šคํ…œ์„ ์žฌ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด ๊ธ€์—์„œ ๊ตฌ์กฐ ์„ค๊ณ„, ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์ค‘์‹ฌ์œผ๋กœ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ์ „ํ™˜ ๊ณผ์ •์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.SQS๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋œ ์ด์œ ๊ธฐ์กด์—๋Š” ์›จ์ดํŒ… ํ˜ธ์ถœ ์‹œ ํ•ด๋‹น ์›จ์ดํŒ…์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ๋งŒ ์žˆ์—ˆ์ง€๋งŒ, ์ดํ›„ ์ฟ ํฐ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ํ•ด๋‹น ๊ฐ€๊ฒŒ๋ฅผ ์ฐœํ•œ ์‚ฌ์šฉ์ž ์ „์ฒด์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•ด์•ผ ํ•˜..
[Spring] DI์™€ IoC ์ดํ•ดํ•˜๊ธฐ
ยท
Programming/Spring
DI ์ ์šฉ ์ „ ๊ฐ์ฒด ์‚ฌ์šฉ ๋ฐฉ์‹DI ๊ฐœ๋…์„ ์ ์šฉํ•˜๊ธฐ ์ „์—๋Š” ๊ฐ์ฒด ์‚ฌ์šฉ ์‹œ ์–ด๋–ค ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ์„๊นŒ?1. ์ง์ ‘ ๊ฐ์ฒด ์ƒ์„ฑ์‚ฌ์šฉํ•˜๋ ค๋Š”(=์˜์กดํ•˜๋ ค๋Š”) ๊ฐ์ฒด๋ฅผ ``new`` ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์ƒ์„ฑํ•œ๋‹ค.public class CafeController { private StarbucksService starbucksService = new StarbucksService(); public void orderCoffee() { starbucksService.brew(); }}์ด๋Ÿฌํ•œ ๋ฐฉ๋ฒ•์€ ๊ฐ์ฒด๊ฐ„ ๊ฒฐํ•ฉ๋„๊ฐ€ ๊ฐ•ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. ๋งŒ์ผ ์Šคํƒ€๋ฒ…์Šค๊ฐ€ ๋ถ€๋„๊ฐ€ ๋‚˜์„œ ์„œ๋น„์Šค๋ฅผ ์Šคํƒ€๋ฒ…์Šค๊ฐ€ ์•„๋‹Œ ํŒ€ํ™€ํŠผ์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•  ๊ฒฝ์šฐ (ใ…Ž) CafeController ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•ด์•ผ ํ•œ๋‹ค.StarbucksService๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ..
[SpringBoot] ํŒŒ์ผ ์—…๋กœ๋“œ๋ฅผ ์œ„ํ•œ 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..
[SpringBoot] SSE๋ฅผ ์ด์šฉํ•œ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ ์ „์†ก ๊ตฌํ˜„๊ธฐ (feat. Redis Pub/Sub)
ยท
Project/Spring
1. ๋“ค์–ด๊ฐ€๋ฉฐ์Œ์‹์  ์›จ์ดํŒ… ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ, ์‚ฌ์šฉ์ž์˜ ์›จ์ดํŒ…์ด ํ˜ธ์ถœ๋˜์—ˆ์„ ๋•Œ ์‹ค์‹œ๊ฐ„ ์•Œ๋ฆผ์„ ์ „์†กํ•ด์•ผ ํ–ˆ๋‹ค.์•Œ๋ฆผ์„ ์ „์†กํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์ฒ˜์Œ ๊ตฌํ˜„ํ•ด๋ณด์•˜๊ธฐ์— ๊ธฐ๋กํ•ด๋ณธ๋‹ค.2. ๊ธฐ์ˆ  ์„ ํƒ ๋ฐฐ๊ฒฝโ–ถ SSE + Redis Pub/Sub ์กฐํ•ฉ์„ ์„ ํƒํ–ˆ๋‹ค, ๊ทธ ์ด์œ ๋Š”?๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ๋“ค์„ ๋น„๊ตํ•ด๋ณด์•˜๋‹ค.๊ธฐ์ˆ ์„ค๋ช…์žฅ์ ๋‹จ์ ํ”„๋กœ์ ํŠธ ๊ธฐ์ค€ ํ‰๊ฐ€SSE์„œ๋ฒ„ → ํด๋ผ์ด์–ธํŠธ ๋‹จ๋ฐฉํ–ฅ ์ŠคํŠธ๋ฆฌ๋ฐ (HTTP ๊ธฐ๋ฐ˜)๊ตฌํ˜„ ๊ฐ„๋‹จ, ๋ธŒ๋ผ์šฐ์ € ์ง€์›, HTTP ๊ธฐ๋ฐ˜์ด๋ผ ์ธํ”„๋ผ ๋ณ€๊ฒฝ ์ตœ์†Œ์–‘๋ฐฉํ–ฅ ๋ถˆ๊ฐ€, ์ปค๋„ฅ์…˜ ๊ด€๋ฆฌ ํ•„์š” (๋ธŒ๋ผ์šฐ์ €๋งˆ๋‹ค ์•ฝ 6๊ฐœ)โœ… ํ˜„์žฌ ๋‹จ๋ฐฉํ–ฅ ์•Œ๋ฆผ ๊ตฌํ˜„ ์ค‘์ด๋ฏ€๋กœ ์ ํ•ฉํ•จ์›น์†Œ์ผ“์„œ๋ฒ„ ↔ ํด๋ผ์ด์–ธํŠธ ์–‘๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ๊ฐ•๋ ฅํ•œ ์‹ค์‹œ๊ฐ„์„ฑ, ์–‘๋ฐฉํ–ฅ ๊ฐ€๋Šฅ, ๋‚ฎ์€ ์ง€์—ฐ์ธํ”„๋ผ ๊ตฌ์„ฑ ๋ถ€๋‹ด (๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์„ค์ • ํ•„์š” ๋“ฑ), ์—ฐ๊ฒฐ ์œ ์ง€ ๋น„์šฉ ↑๋‹จ๋ฐฉํ–ฅ ..
[SpringBoot] 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..
[Spring] JPA Cascade์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์ž ๐Ÿ’ญ
ยท
Programming/Spring
JPA Cascade๋ž€?๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ํŠน์ • ์˜์†์„ฑ ์ž‘์—…(persist, merge, remove, refresh, detach)์„ ์—ฐ๊ด€๋œ ์ž์‹ ์—”ํ‹ฐํ‹ฐ์—๋„ ์ „ํŒŒํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด Order - OrderItem์˜ ๊ด€๊ณ„, Post - Comment์˜ ๊ด€๊ณ„๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.Order๊ฐ€ ์‚ญ์ œ๋œ๋‹ค๋ฉด ํ•ด๋‹น OrderItem ๋ฐ์ดํ„ฐ๋Š” ๋‚จ์•„์žˆ์„ ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์‚ญ์ œ๋˜์–ด์•ผ ํ•œ๋‹ค.Post - Comment ์—ญ์‹œ ๋™์ผํ•˜๋‹ค.@Entitypublic class Order { @Id @GeneratedValue private Long id; @OneToMany(mappedBy = "order") private List orderItems = new ArrayList(); public vo..
[Spring] ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์ž
ยท
Programming/Spring
์˜์†์„ฑ ์ปจํ…์ŠคํŠธSpring Framework์—์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ™˜๊ฒฝ์œผ๋กœ,์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์ด์—์„œ ๊ฐ์ฒด๋ฅผ ๋ณด๊ด€/๊ด€๋ฆฌํ•˜๋Š” ์ €์žฅ์†Œ ์—ญํ• ์„ ํ•œ๋‹ค.ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.์ฆ‰, ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜๋ฉด ํ•ด๋‹น ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด์„œ ๊ด€๋ฆฌ๋˜๋˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์ค€์˜์† ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋Š” ๊ฐ™์€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.ํ•˜๋‚˜์˜ Spring ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.๋ˆ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š”๊ฐ€?`EntityManagerFactory` : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜๋Š” ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด (์‹ฑ๊ธ€ํ†ค)`EntityManager` : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” JPA ํ•ต์‹ฌ ๊ฐ์ฒด ์–˜๋กœ ์˜์†์„ฑ ์ปจํ…์Šค..
[Spring] Interceptor์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž
ยท
Programming/Spring
Spring Interceptor๋ž€?Spring MVC์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์œผ๋กœ, ํŠน์ • ์š”์ฒญ์ด ์ปจํŠธ๋กค๋Ÿฌ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „์ด๋‚˜ ์‘๋‹ต์ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ˜ํ™˜๋˜๊ธฐ ์ „์— ์ถ”๊ฐ€์ ์ธ ์ฒ˜๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค€๋‹ค.์ด๋ฅผ ํ†ตํ•ด ์ธ์ฆ, ๋กœ๊น…, ๊ณตํ†ต ์ฒ˜๋ฆฌ ๋กœ์ง๋“ฑ์„ ๋ถ„๋ฆฌํ•ด์„œ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.๊ตฌํ˜„ํ•˜๋Š” ๋ฒ•spring-web 5.3 ์ดํ•˜ ๋ฒ„์ „์—์„œ๋Š”`HandlerInterceptorAdaptor` ํด๋ž˜์Šค๋ฅผ ์ƒ์†`HandlerInterceptor` ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•จ์œผ๋กœ์จ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.๊ทธ๋Ÿฌ๋‚˜ 5.4 ๋ฒ„์ „ ์ดํ›„๋ถ€ํ„ฐ๋Š” `HandlerInterceptorAdaptor` ํด๋ž˜์Šค๊ฐ€ deprecated ์ฒ˜๋ฆฌ๋˜์–ด `HandlerInterceptor` ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธํ„ฐ์…‰ํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.โ˜‘๏ธ  Spring..
[Spring] ํšŒ์›ํƒˆํ‡ด, Soft Delete๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ (JPA)
ยท
Project/Spring
ํšŒ์›ํƒˆํ‡ด๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉฐ ...์ผ์ • ๊ด€๋ฆฌ Develop ๊ณผ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ Delete User, ์ฆ‰ ํšŒ์›ํƒˆํ‡ด๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด ์™”๋‹ค.ํ˜„์žฌ User๋Š” Todo์™€ Comment์˜ FK๋กœ์จ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„๋‹ค. (๊ทธ๋ ‡์ง€๋งŒ Comment๋Š” ์•„์ง ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์ง€ ์•Š์•˜๋‹ค.)๋ฐ์ดํ„ฐ์˜ ์‚ญ์ œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.Hard Delete๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ User ํ…Œ์ด๋ธ”์—์„œ ์‹ค์ œ๋กœ ํ•ด๋‹น ์œ ์ €์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ด ๊ฒฝ์šฐ ์™ธ๋ž˜ ํ‚ค ๊ด€๊ณ„๋ฅผ ์ฃผ์˜ํ•ด์„œ ๋‹ค๋ฃจ์–ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด User ํ…Œ์ด๋ธ”์„ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด Todo ํ…Œ์ด๋ธ”์— ํ•ด๋‹น ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚จ์•„์žˆ๋‹ค๋ฉด DB์—์„œ ๋ฌด๊ฒฐ์„ฑ ์˜ค๋ฅ˜๋ฅผ ๋˜์ง„๋‹ค. ์ด๋Ÿฐ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” FK๋กœ ์—ฐ๊ฒฐ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ์‚ญ์ œํ•ด์ฃผ๊ฑฐ๋‚˜, ํ˜น์€ ``ON DELETE CASCA..
[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..
[Spring] JDBC ์ดํ•ดํ•˜๊ธฐ
ยท
Programming/Spring
JDBC๋ž€?JDBC (Java DataBase Connectivity)Java ํ‘œ์ค€ API๋กœ , SQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋“ฑ์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค์™€ ํด๋ž˜์Šค๋“ค์˜ ์ง‘ํ•ฉJava๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DB์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ์˜ค๋ž˜ & ๋„๋ฆฌ ์‚ฌ์šฉ๋œ Java์˜ ํ‘œ์ค€ API์ด๋‹ค.JDBC๋งŒ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ์ƒ๊ธด๋‹ค.์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. SQLException ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด Try-Catch ๋ธ”๋ก์„ ์—ฌ๋Ÿฌ ๊ณณ์— ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.Connection, Statement, ResultSet ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•œ ๋’ค ๋ฐ˜๋“œ์‹œ close() ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ์•ผ ํ•œ๋‹ค. ์ด์ฒ˜๋Ÿผ ์ž์› ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์ž์› ๊ด€๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.์ฟผ..