๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋กœ ์ด๋ฉ”์ผ ๋ฐœ์†ก ์„ฑ๋Šฅ ๊ฐœ์„ ํ•˜๊ธฐ (feat. ๋ชจ๋“ˆ ๋ถ„๋ฆฌ)

๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋กœ ์ด๋ฉ”์ผ ๋ฐœ์†ก ์„ฑ๋Šฅ ๊ฐœ์„ ํ•˜๊ธฐ (feat. ๋ชจ๋“ˆ ๋ถ„๋ฆฌ)

๊ฐœ์š”ํ˜„์žฌ ์ €ํฌ Subport์—์„œ๋Š” ๊ตฌ๋… ๊ฒฐ์ œ์ผ์ด ๋‹ค๊ฐ€์˜ค๋ฉด ์ด๋ฉ”์ผ๋กœ ์•Œ๋ฆผ์„ ๋ฐœ์†กํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์•Œ๋ฆผ ์„ค์ •์€ ON/OFF๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ  ๊ฒฐ์ œ 1์ผ ์ „ ๋˜๋Š” 3์ผ ์ „์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์ผ ๋ฐœ์†ก ๋กœ์ง์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ†ตํ•ด ๋งค์ผ ์˜ค์ „ 6์‹œ 30๋ถ„์— ์˜ค๋Š˜์ด ๋ฐœ์†ก์ผ์ธ ๊ตฌ๋… ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜์—ฌ ์ด๋ฉ”์ผ ๋ฐœ์†ก์šฉ ๊ฐ์ฒด ์ƒ์„ฑํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์˜ค์ „ 7์‹œ์— ์ด๋ฉ”์ผ ๋ฐœ์†ก@Transactional(readOnly = true)public void send(LocalDateTime now) { List emailNotifications = getEmailNotifications(now, SendingStatus.PENDING); log.info("์ด๋ฉ”์ผ ๋ฐœ์†ก ์‹œ์ž‘ - ๋Œ€์ƒ ๊ฑด์ˆ˜: {}", emailNo..

OCI(Oracle Cloud Infrastructure) ์ ์‘๊ธฐ

OCI(Oracle Cloud Infrastructure) ์ ์‘๊ธฐ

AWS์˜ ํ”„๋ฆฌํ‹ฐ์–ด ์ •์ฑ… ๋ณ€๊ฒฝ์ง€๋‚œ 2025๋…„ 7์›”๋ถ€ํ„ฐ AWS์˜ ํ”„๋ฆฌํ‹ฐ์–ด ์ •์ฑ…์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ ์ •๋ฆฌํ•˜๋ฉด ์œ ํšจ ๊ธฐ๊ฐ„์ด 12๊ฐœ์›”์—์„œ 6๊ฐœ์›”๋กœ ์ค„์–ด๋“ค๊ณ , ์„œ๋น„์Šค๋ณ„ ๋ฌด๋ฃŒ ์‚ฌ์šฉ๋Ÿ‰ ํ•œ๋„ ์„ค์ • ๋Œ€์‹  ํฌ๋ ˆ๋”ง ์‚ฌ์šฉ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ธ๋ฐ ์ด์ œ ํ”„๋ฆฌํ‹ฐ์–ด ์ฒดํ—˜์ด ๋ช…์˜๋‹น์œผ๋กœ ์ ์šฉ๋˜์–ด ๋™์ผ ๋ช…์˜๋กœ ์—ฌ๋Ÿฌ ๊ณ„์ •์„ ๋งŒ๋“ค์–ด๋„ ์ด๋ฏธ ํ”„๋ฆฌํ‹ฐ์–ด๋ฅผ ์ฒดํ—˜ํ–ˆ๋‹ค๋ฉด ์ถ”๊ฐ€๋กœ ์ง„ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.์ €๋„ ๊ทธ์ „๊นŒ์ง€๋Š” ๊ณ„์ •์„ ๊ณ„์† ๋ฆฌํ•„ํ•˜๋ฉฐ ๋Š๊น€์—†๋Š” AWS ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์ด์ œ ์ œ ๋ช…์˜๋กœ๋Š” ๋” ์ด์ƒ ํ”„๋ฆฌํ‹ฐ์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋Œ€์•ˆ์„ ์ฐพ๋”๋ผ๋„ ์ตœ๋Œ€ 6๊ฐœ์›”, ํ† ํฐ ์†Œ์ง„ ์†๋„์— ๋”ฐ๋ผ ๊ทธ๋ณด๋‹ค ์งง์•„์งˆ ์ˆ˜ ์žˆ์–ด ์„œ๋น„์Šค ์šด์˜์šฉ์œผ๋กœ๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ด์ œ ์ƒˆ ์นœ๊ตฌ๋ฅผ ์ฐพ์•„ ๋‚˜์„ค ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ๋งˆ์นจ..

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜ ์ดํ•ดํ•˜๊ธฐ

ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜ ์ดํ•ดํ•˜๊ธฐ

๊ฐœ์š”์ง€๊ธˆ๊นŒ์ง€ ์—ฌ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์‚ฌ์šฉํ•ด ์™”์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ ์ ‘ํ•œ ์•„ํ‚คํ…์ฒ˜์˜€๊ณ , ์ต์ˆ™ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์„ ํƒํ•ด ์™”์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹œ๊ฐ„์ด ์ง€๋‚ ์ˆ˜๋ก ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์˜๋ฌธ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ๊ตฌ์กฐ๊ฐ€ ํ•œ๋ˆˆ์— ๋“ค์–ด์˜ค์ง€ ์•Š์•˜๊ณ , ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ์–ด๋””์— ์œ„์น˜์‹œ์ผœ์•ผ ํ• ์ง€ ๊ณ ๋ฏผํ•˜๋Š” ์‹œ๊ฐ„๋„ ๋งŽ์•„์กŒ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ๋•Œ๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐ˜๋ณต๋˜์—ˆ์Šต๋‹ˆ๋‹ค.์ด๋Ÿฐ ๊ฒฝํ—˜์ด ์Œ“์ด๋ฉด์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋‹ค๋ฅธ ์•„ํ‚คํ…์ฒ˜์— ๊ด€์‹ฌ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. ํด๋ฆฐ ์•„ํ‚คํ…์ฒ˜์™€ ํ—ฅ์‚ฌ๊ณ ๋‚  ์•„ํ‚คํ…์ฒ˜, ์ด์ „๋ถ€ํ„ฐ ๋งŽ์ด ๋“ค์–ด๋ดค์ง€๋งŒ, ๋‹น์‹œ์—๋Š” ํฌ๊ฒŒ ์™€๋‹ฟ์ง€ ์•Š์•˜๊ณ , ์ดํ•ด ์—†์ด ์ ์šฉํ•˜๋ ค ํ•˜๋‹ˆ ์–ด๋ ต๊ฒŒ๋งŒ ๋А๊ปด์ ธ ๋ฏธ๋ค„๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๋“ค์ด ๊ณ„์†๋˜๋ฉด์„œ ์ด์ œ๋Š” ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ์ ์šฉํ•ด ๋ด์•ผ๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต..

ํŠธ๋žœ์žญ์…˜ ๋ถ„๋ฆฌ๋กœ ๋ฐ๋“œ๋ฝ ํ•ด๊ฒฐํ•˜๊ธฐ

ํŠธ๋žœ์žญ์…˜ ๋ถ„๋ฆฌ๋กœ ๋ฐ๋“œ๋ฝ ํ•ด๊ฒฐํ•˜๊ธฐ

๊ฐœ์š”๊ฒŒ์‹œ๊ธ€ ์ข‹์•„์š” ๊ธฐ๋Šฅ์€ ์œ ์ €๊ฐ€ ์ข‹์•„์š” ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด PostLike ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ƒ์„ฑ ๋ฐ ์ €์žฅํ•˜๊ณ , ๋™์‹œ์— ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์˜ ์ข‹์•„์š” ์ˆ˜๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋กœ์ง์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.๊ทธ๋Ÿฐ๋ฐ ์—ฌ๋Ÿฌ ์œ ์ €๊ฐ€ ๋™์ผํ•œ ๊ฒŒ์‹œ๊ธ€์— ๋™์‹œ์— ์ข‹์•„์š” ์š”์ฒญ์„ ํ•˜๋Š” ๊ฒฝ์šฐ ํŠธ๋žœ์žญ์…˜ ๊ฐ„ ๋ฝ ๊ฒฝํ•ฉ์œผ๋กœ ์ธํ•œ ๋ฐ๋“œ๋ฝ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.(์ด ๊ธ€์€ MySQL InnoDB ์—”์ง„์˜ ๋ฝ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.) ๋ฌธ์ œ ์›์ธ@Transactionalpublic void likePost(Long postId, Long userId) { Post post = postRepository.findById(postId) .orElseThrow(() -> new CustomException(ErrorCode.POST_NOT_FOUND)); ..

์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋™์˜ ํ•ญ๋ชฉ ๋ฌธ์ œ ํ•ด๊ฒฐ

์นด์นด์˜ค ๋กœ๊ทธ์ธ ๋™์˜ ํ•ญ๋ชฉ ๋ฌธ์ œ ํ•ด๊ฒฐ

๊ฐœ์š”ํ˜„์žฌ ์ €ํฌ ์„œ๋น„์Šค์—์„œ๋Š” ์นด์นด์˜ค ๋กœ๊ทธ์ธ ์‹œ, ๋‹‰๋„ค์ž„์€ ํ•„์ˆ˜ ํ•ญ๋ชฉ, ํ”„๋กœํ•„ ์‚ฌ์ง„์€ ์„ ํƒ ํ•ญ๋ชฉ์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋กœ๊ทธ์•„์›ƒ ํ›„ ๋‹ค์‹œ ๋กœ๊ทธ์ธ์„ ์ง„ํ–‰ํ•˜๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ”„๋กœํ•„ ์‚ฌ์ง„์ด ํ•„์ˆ˜ ํ•ญ๋ชฉ์œผ๋กœ ๋ฐ”๋€Œ์–ด ์‚ฌ์šฉ์ž์—๊ฒŒ ๊ฐ•์ œ๋กœ ์„ ํƒํ•˜๋„๋ก ์š”๊ตฌ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์›์ธ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด๋Š” OAuth2 ๋กœ๊ทธ์ธ ์„ค์ • ํŒŒ์ผ(.yml)์˜ scope ์˜ต์…˜ ์„ค์ • ๋•Œ๋ฌธ์ด์—ˆ๋Š”๋ฐ, ์ฒ˜์Œ์—๋Š” scope ํ•ญ๋ชฉ์ด ๋‹จ์ˆœํžˆ ์‚ฌ์šฉ์ž ์ •๋ณด ์š”์ฒญ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ์„ค์ •์œผ๋กœ๋งŒ ์ƒ๊ฐํ•˜์—ฌ ์ž˜๋ชป ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.ํ•˜์ง€๋งŒ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•ด ๋ณด๋ฉด, scope ์˜ต์…˜์€ ์ถ”๊ฐ€ ํ•ญ๋ชฉ ๋™์˜ ๋ฐ›๊ธฐ ์š”์ฒญ ์‹œ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ•ด๋‹น ์˜ต์…˜์— ์„ค์ •๋œ ํ•ญ๋ชฉ์ด ์žˆ์œผ๋ฉด ๋กœ๊ทธ์ธํ•  ๋•Œ๋งˆ๋‹ค ์‚ฌ์šฉ์ž ๋™์˜๋ฅผ ๋‹ค์‹œ ์œ ๋„ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ž˜๋ชป๋œ ์„ค์ •scope: - prof..

๋ณด์•ˆ ์ทจ์•ฝ์  ํ•ด๊ฒฐ์„ ์œ„ํ•œ AWS S3 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณ€๊ฒฝ

๋ณด์•ˆ ์ทจ์•ฝ์  ํ•ด๊ฒฐ์„ ์œ„ํ•œ AWS S3 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณ€๊ฒฝ

๊ฐœ์š”ํ”„๋กœ์ ํŠธ ๋นŒ๋“œ ์‹œ, ์ง€์†์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€์˜ ์›์ธ์„ ํ™•์ธํ•œ ๊ฒฐ๊ณผ, ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋˜ org.springframework.cloud:spring-cloud-starter-aws ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋ณด์•ˆ ์ทจ์•ฝ์ ์œผ๋กœ ์ธํ•ด 2021๋…„ 2์›” ์ดํ›„ Maven Repository์—์„œ ๋” ์ด์ƒ ์—…๋ฐ์ดํŠธ๋ฅผ ์ง€์›์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.build.gradle์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์˜์กด์„ฑ์— ์ทจ์•ฝ์ ์ด ์žˆ๋‹ค๋Š” ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ณ€๊ฒฝํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด org.springframework.cloud:spring-cloud-starter-aws ๋Œ€์‹  io.awspring.cloud:spring-cloud-aws-starter-s3:3.0.0 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. impleme..