๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

BackEnd๐ŸŒฑ/Spring37

ThreadPoolExecutor ๋™์ž‘์— ๊ด€ํ•œ ์˜คํ•ด ๊ฐœ์š” Java์—์„œ ์Šค๋ ˆ๋“œํ’€์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ThreadPoolExecutor, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๋”์šฑ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Spring์—์„œ ์ œ๊ณตํ•˜๋Š” ThreadPoolTaskExecutor์˜ ๋™์ž‘ ๋ฐฉ์‹์— ๊ด€ํ•ด ์ œ๊ฐ€ ๊ทธ๋™์•ˆ ์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ์—ˆ๋˜ ๋‘ ๊ฐ€์ง€์˜ ์˜คํ•ด๋ฅผ ์ •๋ฆฌํ•˜๊ณ ์ž ๊ธ€์„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ์„ค์ •์„ ํ•˜์ง€ ์•Š์œผ๋ฉด ์„œ๋ฒ„ ์‹คํ–‰ ์‹œ์— ์ง€์ •ํ•œ ์Šค๋ ˆ๋“œ ํ’€ ํฌ๊ธฐ๋งŒํผ ์Šค๋ ˆ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค. corePoolSize์™€ maxPoolSize๋Š” ์„œ๋กœ ์ƒ๊ด€์—†๋‹ค. ํ์˜ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด maxPoolSize์€ ์‚ฌ์‹ค์ƒ ์˜๋ฏธ ์—†๋Š” ์„ค์ •์ด๋‹ค. corePoolSizeํฌ๊ธฐ ์ด์ƒ์˜ ์š”์ฒญ์ด ๋“ค์–ด์˜จ๋‹ค๊ณ  ํ•ด์„œ maxPoolSize๋งŒํผ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๋Š”๋‹ค. https:.. 2024. 3. 11.
MySQL ๋ฒ„์ „์— ๋”ฐ๋ฅธ @Transactional(readOnly=true)์˜ ๋™์ž‘ ๊ณผ์ • ๊ฐœ์š” ์ด ๊ธ€์€ ํƒœํ˜„๋‹˜์˜ ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€์—์„œ ์˜๊ฐ์„ ๋ฐ›์•„ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ†ตํ•ด RDBMS๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ณผ์ •์—์„œ, ์šฐ๋ฆฌ๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”, ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ, ๋ฐ์ดํ„ฐ ์ผ๊ด€์„ฑ ์œ ์ง€ ๋“ฑ ์—ฌ๋Ÿฌ ์ด์œ ๋กœ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— @Transactional(readOnly=true) ์–ด๋…ธํ…Œ์ด์…˜์„ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ณค ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ์–ด๋…ธํ…Œ์ด์…˜์€ ์–ด๋– ํ•œ ์›๋ฆฌ๋กœ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”? ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” @Transactional(readOnly=true)์˜ JDBC ๋‹จ๊ณ„์—์„œ์˜ ๋™์ž‘ ๊ณผ์ •์„ ์œ„์ฃผ๋กœ ์‚ดํŽด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค. ๋™์ž‘ ๊ณผ์ • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— @Transactional(readOnly=true)์„ ๊ฑธ๊ณ  ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋™์ž‘ํ•˜๋Š” ์ „์ฒด์ ์ธ ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ค€๋น„ ์ฝ๊ธฐ ์ „์šฉ ์ƒํƒœ ์ „ํŒŒ ๋น„์ฆˆ๋‹ˆ์Šค.. 2024. 1. 24.
Hibernate์˜ @Formula๋ฅผ ์ด์šฉํ•œ ์—ฐ๊ด€ ๊ด€๊ณ„ ์—”ํ‹ฐํ‹ฐ ์ง‘๊ณ„ ๊ฐœ์š” Hibernate์˜ @Formula ์–ด๋…ธํ…Œ์ด์…˜์€ ์—”ํ‹ฐํ‹ฐ ํด๋ž˜์Šค ๋‚ด์—์„œ ์‹ค์ œ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” '๊ฐ€์ƒ ์ปฌ๋Ÿผ'์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. @Formula๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์ปฌ๋Ÿผ๋“ค์˜ ๊ฐ’์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ๊ณ„์‚ฐ๋œ ๊ฐ’์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๊ฐ’์€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋งŒ ๊ณ„์‚ฐ๋˜์–ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ ์ฝ”๋“œ @Formula ์–ด๋…ธํ…Œ์ด์…˜์˜ ์ „ํ˜•์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์—ฐ๊ด€๋œ ๋ฐ์ดํ„ฐ์˜ ์ง‘๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฒŒ์‹œ๊ธ€๊ณผ ์—ฐ๊ฒฐ๋œ ๋Œ“๊ธ€์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ „์ฒด ์ฝ”๋“œ๋Š” ๊นƒํ—ˆ๋ธŒ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. @Entity public class Post { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) pri.. 2023. 12. 20.
Bucket4j๋กœ ํŠธ๋ž˜ํ”ฝ ์ œํ•œํ•˜๊ธฐ(Redis & MariaDB) ๊ฐœ์š” ์ตœ๊ทผ ์—…๋ฌด ํ”„๋กœ์ ํŠธ์—์„œ ํŠน์ •(์š”๊ธˆ์ด ๋ถ€๊ฐ€๋˜๋Š”) ๋กœ์ง์— ๋Œ€ํ•ด ์›”๋ณ„ ์‚ฌ์šฉ๋Ÿ‰์„ ์ œํ•œํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์™€ ๊ด€๋ จํ•˜์—ฌ ์ฒ˜๋ฆฌ์œจ ์ œํ•œ ๊ธฐ์ˆ ์„ ์•Œ์•„๋ณด์•˜๋Š”๋ฐ Bucket4j, Guava, RateLimitj, Resilience4j ๋“ฑ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š” ๊ฑธ ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , ํ”„๋กœ์ ํŠธ ํ™˜๊ฒฝ์ธ Spring Boot 2.7.x, MariaDB(nosql & in-momory๋ถ€์žฌ), Java 11์— ์•Œ๋งž์€ Bucket4j๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ณ ๋ คํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์˜ ํŠน์ง•๊ณผ ๊ทธ ์„ ํƒ ์ด์œ ์ž…๋‹ˆ๋‹ค. Guava: ๋‹ค์–‘ํ•œ ํ•ต์‹ฌ Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋‹จ์ˆœํžˆ Rate Limiting ๊ธฐ๋Šฅ๋งŒ์„ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ๋‹ค์†Œ ๋ฌด๊ฑฐ์šด ๋Š๋‚Œ์ด๋‹ค. Resilience4j: ์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ .. 2023. 12. 3.
ShedLock์œผ๋กœ ๋‹ค์ค‘ ์ธ์Šคํ„ด์Šค ํ™˜๊ฒฝ์—์„œ ๋‹จ์ผ ์Šค์ผ€์ค„๋Ÿฌ ๋™์ž‘ ๋ณด์žฅํ•˜๊ธฐ ๊ฐœ์š” ์Šคํ”„๋ง์—์„œ ์ œ๊ณตํ•˜๋Š” @EnableScheduling ์–ด๋…ธํ…Œ์ด์…˜์€ ๊ฐ„ํŽธํ•˜๊ฒŒ ์Šค์ผ€์ค„๋ง ์ž‘์—…์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ฃผ์ง€๋งŒ, ๋‹ค์ค‘ ์ธ์Šคํ„ด์Šค ํ™˜๊ฒฝ์—์„œ๋Š” ๋™์ผํ•œ ์ž‘์—…์ด ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„  ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ, ShedLock์ด๋ผ๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์†์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ShedLock์€ ์Šคํ”„๋ง ์Šค์ผ€์ค„๋ง๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋™์ผํ•œ ์Šค์ผ€์ค„๋ง ์ž‘์—…์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•ด ์ค๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ๊นƒํ—ˆ๋ธŒ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ShedLock ์ดํ•ดํ•˜๊ธฐ ShedLock์€ ๋ถ„์‚ฐ๋œ ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ ์Šค์ผ€์ค„๋ง ์ž‘์—…์ด ์ค‘๋ณต์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ง€์ •๋œ ์ž‘์—…์— ์ž ๊ธˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ .. 2023. 11. 24.
default method๋กœ JpaRepository ์ข€ ๋” ์šฐ์•„ํ•˜๊ฒŒ ์จ๋ณด๊ธฐ ๊ฐœ์š” Spring Data JPA์—์„œ JpaRepository ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Java 8์—์„œ ๋„์ž…๋œ default method๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ข€ ๋” ๊น”๋”ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Optional ์ œ๊ฑฐํ•˜๊ธฐ Spring Data JPA์˜ findByXX ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ Optional์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋กœ ์ธํ•ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ Optional ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์ด ํ•„์š”ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Ÿด ๋•Œ default ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค. public interface UserRepository extends JpaRepository { // Default ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ findById์˜ Optional์„ ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ default User fin.. 2023. 11. 16.
@Scheduled ์‚ฌ์šฉํ•  ๋•Œ ์Šค๋ ˆ๋“œ ์„ค์ • ๊ฐœ์š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” @Scheduled ์–ด๋…ธํ…Œ์ด์…˜์€ ๋ฉ”์„œ๋“œ์— ์Šค์ผ€์ค„๋ง ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ @Scheduled ์–ด๋…ธํ…Œ์ด์…˜๋งŒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ”„๋ง์€ ๋‹จ์ผ ์Šค๋ ˆ๋“œ์—์„œ ์Šค์ผ€์ค„๋ง ์ž‘์—…๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ, ์ด๋Š” ํ•˜๋‚˜์˜ ์Šค์ผ€์ค„๋ง ์ž‘์—…์ด ์™„๋ฃŒ๋˜์–ด์•ผ๋งŒ ๋‹ค์Œ ์Šค์ผ€์ค„๋ง ์ž‘์—…์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ€๊ฐ€์ ์ธ ์„ค์ • ์—†์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด, ์ผ๋ถ€ ์ž‘์—…์ด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์‹œ๊ฐ„์— ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ ์ƒํ™ฉ์„ ํ•œ๋ฒˆ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. @Configuration @EnableScheduling public class ScheduledTasks { private final Logger log = LoggerFactory.getLogger(ScheduledTasks.c.. 2023. 11. 9.
ArchUnit์œผ๋กœ ์•„ํ‚คํ…์ฒ˜ ๊ฒ€์‚ฌํ•˜๊ธฐ ๊ฐœ์š” ArchUnit์€ Java ์ฝ”๋“œ์˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ„๊ฒฐํ•˜๊ณ  ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ArchUnit์€ Java์˜ ๊ธฐ๋ณธ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ, ์ฃผ์–ด์ง„ Java ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ๋ชจ๋“  ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๋ฅผ ํ•ด์„ํ•จ์œผ๋กœ์จ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€ ๋ฐ ํด๋ž˜์Šค ์˜์กด์„ฑ ๊ฒ€์‚ฌ: ํŒจํ‚ค์ง€์™€ ํด๋ž˜์Šค ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ๋ถ„์„ํ•˜๊ณ , ๊ฒฉ๋ฆฌ๋œ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š”์ง€ ํ™•์ธ ์ƒ์† ๊ด€๊ณ„ ๋ฐ ์ˆœํ™˜ ์ฐธ์กฐ ๊ฒ€์‚ฌ: ํด๋ž˜์Šค ๊ฐ„์˜ ์ƒ์† ๊ตฌ์กฐ๋ฅผ ๋ถ„์„ํ•˜๊ณ , ์ˆœํ™˜ ์ฐธ์กฐ๊ฐ€ ์—†๋Š”์ง€ ๊ฒ€์‚ฌ ๋ ˆ์ด์–ด ์•„ํ‚คํ…์ฒ˜ ๊ฒ€์‚ฌ: ๋ ˆ์ด์–ด ๊ฐ„์˜ ์˜์กด์„ฑ์„ ๊ฒ€์‚ฌํ•˜์—ฌ, ๋ช…ํ™•ํ•˜๊ณ  ๊ฒฌ๊ณ ํ•œ ๋ ˆ์ด์–ด ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•˜๋Š”์ง€ ํ™•์ธ ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ ๊ฒ€์‚ฌ: ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์ฝ”๋”ฉ ๊ทœ์น™์„ ๊ฒ€์‚ฌํ•˜์—ฌ, ์ผ๊ด€๋œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์„ ์œ ์ง€ํ•˜๋Š”.. 2023. 10. 28.
LocalStack์„ ํ™œ์šฉํ•œ AWS S3 ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•ํ•˜๊ธฐ ๊ฐœ์š” ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ด์ „ ๊ฒŒ์‹œ๊ธ€ 'TestContainer๋กœ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•ํ•˜๊ธฐ'์˜ ์—ฐ์žฅ์„ ์œผ๋กœ, LocalStack์„ ์ด์šฉํ•˜์—ฌ AWS์˜ S3 ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์ถ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ด€๋ จ ์ฝ”๋“œ๋Š” ๊นƒํ—ˆ๋ธŒ์—์„œ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LocalStack์ด๋ž€? LocalStack์€ AWS์˜ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค๋“ค์„ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ ๋ชจ๋ฐฉํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด, AWS์˜ ์ฃผ์š” ์„œ๋น„์Šค๋“ค์„ ์‹ค์ œ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์ด ์•„๋‹Œ ๋กœ์ปฌ์—์„œ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋ฉฐ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LocalStack์€ AWS์˜ ๋‹ค์–‘ํ•œ ์„œ๋น„์Šค, ํŠนํžˆ S3, Lambda, DynamoDB, API Gateway, Kinesis, SQS ๋“ฑ์˜ ์ฃผ์š” ์„œ๋น„์Šค๋“ค์„ ์ง€์›ํ•˜๋ฉฐ, Docker ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— .. 2023. 10. 22.