@Configuration ๊ณผ @ConfigurationProperties
ยท
๊ณต๋ถ€ํ•˜๊ธฐ/Spring
@Configuration`@Bean` ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์Šคํ”„๋ง ๋นˆ์„ ์ง์ ‘ ๋“ฑ๋กํ•  ๋•Œ ์‚ฌ์šฉ๋‹ค๋ฅธ ์„ค์ •์„ ์กฐํ•ฉ/ํ™œ์„ฑํ™”(`@Import`, `@Enable`...)ํ•˜๋Š” ์šฉ๋„์—๋„ ์“ฐ์ธ๋‹ค.@ConfigurationProperties"์™ธ๋ถ€ ์„ค์ •๊ฐ’(application.yml/properties)์„ ์ด ๊ฐ์ฒด ํ•„๋“œ์— ๋ฐ”์ธ๋”ฉํ•˜๊ฒ ๋‹ค"๋Š” ๊ฒƒ์„ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.์„ค์ •์„ ํ•„๋“œ์— ๋งคํ•‘ํ•ด ์ฃผ์ž…๋ฐ›๋Š” ์„ค์ • ๊ฐ’ ํ™€๋”(POJO)๋ฅผ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.์ž๋™์œผ๋กœ ๋นˆ์œผ๋กœ ์ง€์ •๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ๋นˆ์œผ๋กœ์˜ ๋“ฑ๋ก์ด ํ•„์š”ํ•˜๋‹ค.`@EnableConfigurationProperties``@ConfigurationPropertiesScan``@Component`์ฆ‰, @Configuration๋Š” ์Šคํ”„๋ง ๋นˆ๋“ค์„ ๋งŒ๋“œ๋Š”/๋“ฑ๋กํ•˜๋Š” ํด๋ž˜์Šค๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.@Configu..
[Springboot] AWS SQS๋ฅผ ์ด์šฉํ•œ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ๊ตฌํ˜„ํ•˜๊ธฐ - ๋ฉ”์‹œ์ง€ ๋ฐœํ–‰ ๋กœ์ง
ยท
๋งŒ๋“ค์–ด๋ณด๊ธฐ/Spring
์„œ๋ก ๊ธฐ์กด์—๋Š” Spring์˜ `ApplicationEventPublisher`์™€ Redis์˜ Pub/Sub ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•ด ์•Œ๋ฆผ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.์ด ๊ตฌ์กฐ๋Š” ๋‚ด๋ถ€ ์„œ๋ฒ„๊ฐ„ ์ด๋ฒคํŠธ ์ „ํŒŒ์™€ ๋ธŒ๋ผ์šฐ์ € ํด๋ผ์ด์–ธํŠธ๋กœ์˜ SSE ์•Œ๋ฆผ ์ „์†ก์— ํšจ๊ณผ์ ์ด์—ˆ์ง€๋งŒ, ์•Œ๋ฆผ ์ˆ˜๊ฐ€ ๋งŽ์•„์งˆ์ˆ˜๋ก ์ฒ˜๋ฆฌ์— ๋ณ‘๋ชฉ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‹คํŒจ์‹œ ์žฌ์ฒ˜๋ฆฌ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.์ด๋Ÿฌํ•œ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž AWS SQS๋ฅผ ๋„์ž…ํ•˜์—ฌ ์•Œ๋ฆผ ์‹œ์Šคํ…œ์„ ์žฌ๊ตฌ์„ฑํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด ๊ธ€์—์„œ ๊ตฌ์กฐ ์„ค๊ณ„, ๊ณ ๋ฏผํ–ˆ๋˜ ๋ถ€๋ถ„๋“ค๊ณผ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์„ ์ค‘์‹ฌ์œผ๋กœ ์•Œ๋ฆผ ์‹œ์Šคํ…œ ์ „ํ™˜ ๊ณผ์ •์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.SQS๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋œ ์ด์œ ๊ธฐ์กด์—๋Š” ์›จ์ดํŒ… ํ˜ธ์ถœ ์‹œ ํ•ด๋‹น ์›จ์ดํŒ…์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ๋งŒ ์žˆ์—ˆ์ง€๋งŒ, ์ดํ›„ ์ฟ ํฐ ์ด๋ฒคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๋ฉด ํ•ด๋‹น ๊ฐ€๊ฒŒ๋ฅผ ์ฐœํ•œ ์‚ฌ์šฉ์ž ์ „์ฒด์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•ด์•ผ ํ•˜..
[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๊ฐœ)โœ… ํ˜„์žฌ ๋‹จ๋ฐฉํ–ฅ ์•Œ๋ฆผ ๊ตฌํ˜„ ์ค‘์ด๋ฏ€๋กœ ์ ํ•ฉํ•จ์›น์†Œ์ผ“์„œ๋ฒ„ ↔ ํด๋ผ์ด์–ธํŠธ ์–‘๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ๊ฐ•๋ ฅํ•œ ์‹ค์‹œ๊ฐ„์„ฑ, ์–‘๋ฐฉํ–ฅ ๊ฐ€๋Šฅ, ๋‚ฎ์€ ์ง€์—ฐ์ธํ”„๋ผ ๊ตฌ์„ฑ ๋ถ€๋‹ด (๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์„ค์ • ํ•„์š” ๋“ฑ), ์—ฐ๊ฒฐ ์œ ์ง€ ๋น„์šฉ ↑๋‹จ๋ฐฉํ–ฅ ..
[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..
[Spring] JPA Cascade์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์ž ๐Ÿ’ญ
ยท
๊ณต๋ถ€ํ•˜๊ธฐ/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] ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด์ž
ยท
๊ณต๋ถ€ํ•˜๊ธฐ/Spring
์˜์†์„ฑ ์ปจํ…์ŠคํŠธSpring Framework์—์„œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ž€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํ™˜๊ฒฝ์œผ๋กœ,์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์ด์—์„œ ๊ฐ์ฒด๋ฅผ ๋ณด๊ด€/๊ด€๋ฆฌํ•˜๋Š” ์ €์žฅ์†Œ ์—ญํ• ์„ ํ•œ๋‹ค.ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ํŠธ๋žœ์žญ์…˜ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.์ฆ‰, ํŠธ๋žœ์žญ์…˜์ด ๋๋‚˜๋ฉด ํ•ด๋‹น ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด์„œ ๊ด€๋ฆฌ๋˜๋˜ ์—”ํ‹ฐํ‹ฐ๋Š” ์ค€์˜์† ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.๊ฐ™์€ ํŠธ๋žœ์žญ์…˜ ๋‚ด์—์„œ๋Š” ๊ฐ™์€ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.ํ•˜๋‚˜์˜ Spring ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.๋ˆ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š”๊ฐ€?`EntityManagerFactory` : ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ „์ฒด์—์„œ ํ•˜๋‚˜๋งŒ ์ƒ์„ฑ๋˜๋Š” ํŒฉํ† ๋ฆฌ ๊ฐ์ฒด (์‹ฑ๊ธ€ํ†ค)`EntityManager` : ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋Š” JPA ํ•ต์‹ฌ ๊ฐ์ฒด ์–˜๋กœ ์˜์†์„ฑ ์ปจํ…์Šค..