[CI/CD] Spring boot ํ”„๋กœ์ ํŠธ Github Actions + Docker๋ฅผ ํ™œ์šฉํ•˜์—ฌ EC2์— ๋ฐฐํฌํ•˜๊ธฐ
ยท
DevOps
์˜ค๋Š˜์€ spring boot ํ”„๋กœ์ ํŠธ๋ฅผ github actions, docker๋ฅผ ํ™œ์šฉํ•˜์—ฌ EC2์— ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ๋‹ด์•˜์Šต๋‹ˆ๋‹ค. AWS EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ(Amazon Linux 2023), EC2์— docker์„ค์น˜, Docker hub ๊ณ„์ •์ด ์žˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ง„ํ–‰ํ•œ๋‹ค. ๊ธฐ์กด ๋ฐฐํฌ ๋ฐฉ์‹์˜ ๋ฌธ์ œ์ CI/CD ์—†์ด ๋ฐฐํฌํ•  ๊ฒฝ์šฐ, jar ํŒŒ์ผ์„ ์ง์ ‘ ๋นŒ๋“œํ•˜๊ณ  EC2์— ์ˆ˜๋™์œผ๋กœ ์—…๋กœ๋“œํ•œ ๋’ค java -jar ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์žฆ์€ ์ƒํ™ฉ์—์„œ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์€ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ๋น„ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.CI/CD๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ด ๊ณผ์ •์„ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์–ด, ๊ฐœ๋ฐœ ํšจ์œจ๊ณผ ์šด์˜ ์ƒ์‚ฐ์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Github Actions vs JenkinsGithub Actions๋Š” Jenkins์™€ ๋น„๊ตํ•˜๋ฉด CI ์„œ๋ฒ„๊ฐ€ ๋”ฐ..
[Docker] EC2 Ubuntu์„œ๋ฒ„์— docker ์„ค์น˜ํ•˜๊ธฐ
ยท
DevOps
์ด ๋ธ”๋กœ๊ทธ์—์„œ๋Š” AWS EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ด๋ฏธ ์ƒ์„ฑํ•œ ์ƒํƒœ๋ผ๋Š” ๊ฐ€์ •ํ•˜์—,ํ„ฐ๋ฏธ๋„์„ ํ†ตํ•ด ํ•ด๋‹น ์„œ๋ฒ„์— ์ง์ ‘ ์ ‘์†ํ•˜๊ณ  Docker๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ณผ์ •์„ ์‹ค์Šต ํ˜•ํƒœ๋กœ ์•ˆ๋‚ด๋“œ๋ฆด ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.์•„์ง EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ์…จ๋‹ค๋ฉด, ์•„๋ž˜ ๋งํฌ๋ฅผ ํ†ตํ•ด AWS ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ ํ›„ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ๋จผ์ € ์ƒ์„ฑํ•˜์‹  ํ›„ ์ด ๊ธ€์„ ๋”ฐ๋ผ์˜ค์‹œ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค.๐Ÿ‘‰ AWS ์ฝ˜์†” ๋ฐ”๋กœ๊ฐ€๊ธฐ์ฐธ๊ณ : AWS๋Š” **๋ฌด๋ฃŒ ํ‹ฐ์–ด(Free Tier)**๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์–ด, ์ฒ˜์Œ ์‚ฌ์šฉ์ž๋„ ๋น„์šฉ ๋ถ€๋‹ด ์—†์ด EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ํ…Œ์ŠคํŠธํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น๊ณผ์ •์€ Terminal์—์„œ ์ง์ ‘ EC2์„œ๋ฒ„์— ์ ‘๊ทผํ•˜์—ฌ Docker๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ณผ์ •์„ ์‹ค์Šต์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. EC2 ์„œ๋ฒ„์— SSH๋กœ ์ ‘์†ํ•˜๋Š” ๋ฐฉ๋ฒ•AWS์—์„œ EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉด, ๊ฐœ์ธ ํ‚ค ํŒŒ์ผ..
๐Ÿ’ป ์‹ค์ „ํŽธ: Spring ํ”„๋กœ์ ํŠธ๋ฅผ Docker๋กœ ๋ฐฐํฌํ•ด๋ณด๊ธฐ
ยท
DevOps
์•ˆ๋…•ํ•˜์„ธ์š”. ์˜ค๋Š˜์€ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  Spring ํ”„๋กœ์ ํŠธ๋ฅผ docker๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐฐํฌํ•˜๋Š” ๊ณผ์ •์„ ์˜ˆ์ œ๋กœ ์ ์–ด๋ณผ๊นŒํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„ ์ ์œผ๋กœ Spring ํ”„๋กœ์ ํŠธ๋Š” ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ๊ณ„์‹ ๋‹ค๋Š” ์ „์žฌํ•˜์— ๋ธ”๋กœ๊ทธ๋ฅผ ์“ฐ๋‹ˆ ์ด์  ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.https://github.com/Junni802/docker-example GitHub - Junni802/docker-exampleContribute to Junni802/docker-example development by creating an account on GitHub.github.com(๊ท€์ฐฎ์•„์„œ ์•ˆ๋งŒ๋“ค๊ณ  ๊ธฐ์กด๊ฒƒ์œผ๋กœ ํ• ๋ ค๊ณ ํ–ˆ๋Š”๋ฐ ํ•˜๋‚˜ ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค) ๋„์ปค ์„ค์น˜ํ•˜๊ธฐ๋„์ปค ์„ค์น˜ URLhttps://www.docker.com/products/docker-desktop Docker De..
๋„์ปค(Docker)๋ž€ ๋ฌด์—‡์ธ๊ฐ€?
ยท
DevOps
๋„์ปค(Docker)๋ž€ ๋ฌด์—‡์ธ๊ฐ€?๋„์ปค๋Š” ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ๊ฐ€์ƒํ™” ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํšจ์œจ์ ์œผ๋กœ ๋ฐฐํฌ, ์‹คํ–‰, ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค.์ปจํ…Œ์ด๋„ˆ๋ž€ ์šด์˜์ฒด์ œ ์ˆ˜์ค€์—์„œ ๊ฒฉ๋ฆฌ๋œ ์‹คํ–‰ ํ™˜๊ฒฝ์œผ๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ๊ทธ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์„ค์ • ํŒŒ์ผ ๋“ฑ์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.์ด๋ฅผ ํ†ตํ•ด ํ•œ ์‹œ์Šคํ…œ์—์„œ ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋”๋ผ๋„ ์ถฉ๋Œ ์—†์ด ์šด์˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ๋„ ์ผ๊ด€๋œ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๊ฐ€์ƒํ™”๋ฐฉ์‹๊ณผ ๋„์ปค(Docker)์˜ ์ฐจ์ด์  ๊ธฐ์กด ๊ฐ€์ƒํ™” (OS Virtualization)Host OS ์œ„์— Guest OS ์ „์ฒด๋ฅผ ๊ฐ€์ƒํ™”VM Ware, virtualBox์ž์œ ๋„๊ฐ€ ๋†’์œผ๋‚˜, ์‹œ์Šคํ…œ์— ๋ถ€ํ•˜๊ฐ€ ๋งŽ๊ณ  ๋А๋ ค์ง ์ปจํ…Œ์ด๋„ˆ ๊ฐ€์ƒํ™” (Container..
Kafka Connect์™€ JDBC Source Connector๋กœ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•ํ•˜๊ธฐ
ยท
Kafka
ํ˜„๋Œ€์˜ ๋ฐ์ดํ„ฐ ์‹œ์Šคํ…œ์—์„œ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋‚˜ ์„œ๋น„์Šค ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์—ฐ๋™ํ•˜๋Š” ์ผ์ด ํ•„์ˆ˜๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.์ด๋•Œ Kafka Connect๋Š” ๋ฐ˜๋ณต์ ์ธ ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ๋‹จ์ˆœํ™”ํ•ด์ฃผ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.Kafka Connect๋ž€?Kafka Connect๋Š” Kafka ๊ธฐ๋ฐ˜์˜ ๋ฐ์ดํ„ฐ ์—ฐ๋™ ํ”Œ๋žซํผ์œผ๋กœ, ๋ณ„๋„์˜ ์ฝ”๋”ฉ ์—†์ด JSON ๊ธฐ๋ฐ˜ ์„ค์ •๋งŒ์œผ๋กœ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค(RDBMS, ํŒŒ์ผ, ๋กœ๊ทธ ๋“ฑ)์™€ ํƒ€๊ฒŸ ์‹œ์Šคํ…œ ๊ฐ„์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค๋‹ˆ๋‹ค.๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋Œ€์‹ , ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์ปค๋„ฅํ„ฐ(Connector)๋ฅผ ์„ค์ •๋งŒ์œผ๋กœ ๋ฐ”๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด ๊ฐ€์žฅ ํฐ ์žฅ์ ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์€ ๋ฌผ๋ก  ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ๋„ ํฌ๊ฒŒ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.Kafka Connect..
Kafka Connect์™€ ์ด๋ฅผ ํ™œ์šฉํ•œ Sink Connector ์•Œ์•„๋ณด๊ธฐ
ยท
Kafka
Kafka Connect ๋ž€?kafka Connect๋Š” ์นดํ”„๊ฐ€ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์‹œ์Šคํ…œ, ์˜ˆ๋ฅผ๋“ค์–ด RDBMS, NOSQLํ˜น์€ csv์™€ ๊ฐ™์€ ํŒŒ์ผ์ด๋‚˜ ๋กœ๊ทธ ๋“ฑ์˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค์—์„œ ๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ผ“ ์‹œ์Šคํ…œ์œผ๋กœ ๋ณ„๋„์˜์ฝ”๋”ฉ ์—†์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” Kafka Component ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.Kafka Connect์˜ ์žฅ์ Kafka Connect์˜ ๊ฐ€์žฅ ํฐ ์žฅ์  ์ค‘ ํ•˜๋‚˜๋Š” ๋ณ„๋„์˜ ์ฝ”๋”ฉ ์—†์ด ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค.๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์‹œ์Šคํ…œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ Kafka๋กœ ์—ฐ๋™ํ•  ๋•Œ, ์ผ๋ฐ˜์ ์œผ๋กœ Kafka ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด์„œ ๊ฐœ๋ฐœํ•ด์•ผ ํ•˜์ง€๋งŒ, Kafka Connect๋Š” JSON ๊ธฐ๋ฐ˜์˜ ๊ฐ„๋‹จํ•œ ์„ค์ • ํŒŒ์ผ๋งŒ์œผ๋กœ ์—ฐ๋™์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.์ด๋ฅผ ํ†ตํ•ด..
Kafka๋ฅผ ํ™œ์šฉํ•œ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ ๊ตฌ์ถ• (Mac/Windows ๊ฐ€์ด๋“œ
ยท
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ
Apache Kafka๋Š” ๋Œ€์šฉ๋Ÿ‰ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ถ„์‚ฐ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” Kafka๋ฅผ ์ง์ ‘ ์„ค์น˜ํ•˜๊ณ , Producer์™€ Consumer๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.๐Ÿ“‹ ๋ชฉ์ฐจKafka ์„ค์น˜ ๋ฐ ํ™˜๊ฒฝ ๊ตฌ์„ฑ (Mac & Windows)Zookeeper ๋ฐ Kafka ์‹คํ–‰ํ† ํ”ฝ ์ƒ์„ฑ ๋ฐ ๋ฉ”์‹œ์ง€ ์ „์†กProducer์™€ Consumer ์‹ค์Šต์ž์ฃผ ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜ ๋ฐ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•1๏ธโƒฃ Kafka ์„ค์น˜ ๋ฐ ํ™˜๊ฒฝ ๊ตฌ์„ฑโœ… Mac ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ:Kafka ๊ณต์‹ ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€์—์„œ ์ตœ์‹  ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. Scala ๋ฒ„์ „์€ ๋ฌด๊ด€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ: kafka_2.13-3.7.0.tgzํ„ฐ๋ฏธ๋„์„ ์—ด๊ณ , ๋‹ค์šด๋กœ๋“œํ•œ ๋””๋ ‰ํ† ๋ฆฌ๋กœ ์ด๋™ํ•˜์—ฌ ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์••์ถ•์„ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค:..
[Kafka] ์นดํ”„์นด๋ž€?
ยท
Kafka
์นดํ”„์นด(Kafka)๋ž€?์นดํ”„์นด(Kafka)๋Š” ํŒŒ์ดํ”„๋ผ์ธ, ์ŠคํŠธ๋ฆฌ๋ฐ ๋ถ„์„, ๋ฐ์ดํ„ฐ ํ†ตํ•ฉ ๋ฐ ๋ฏธ์…˜ ํฌ๋ฆฌํ‹ฐ์ปฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ณ ์„ฑ๋Šฅ ๋ถ„์‚ฐ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ ํ”Œ๋žซํผ์ด๋‹ค. ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ์€ ์ธ์ฒด์˜ ์ค‘์ถ” ์‹ ๊ฒฝ๊ณ„์— ํ•ด๋‹นํ•˜๋Š” ๋””์ง€ํ„ธ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.์ด๋Š” ๋น„์ฆˆ๋‹ˆ์Šค๊ฐ€ ์ ์  ๋” ์†Œํ”„ํŠธ์›จ์–ดํ™”, ์ž๋™ํ™”๋˜๋Š” 'always-on' ์„ธ์ƒ์„ ์œ„ํ•œ ๊ธฐ์ˆ  ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. Kafka์˜ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆฌ๋ฐ์€ Fortune 100๋Œ€ ๊ธฐ์—…์˜ 60% ์ด์ƒ์„ ํฌํ•จํ•˜์—ฌ ์ˆ˜๋งŽ์€ ์‚ฐ์—… ๋ฐ ์กฐ์ง์˜ ๋‹ค์–‘ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€ ์— ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. ์นดํ”„์นด์˜ ํƒ„์ƒ ๋ฐฐ๊ฒฝ๊ทธ๋ฆผ๋งŒ ๋ด๋„ ๋„ˆ๋ฌด ๋ณต์žกํ•œ ์—ฐ๊ฒฐ๊ตฌ์กฐ๊ฐ€ ์•„๋‹Œ๊ฐ€...๊ธฐ์กด ๋ฐ์ดํ„ฐ ์‹œ์Šคํ…œ์˜ ๋ฌธ์ œ์ End-to-End ์—ฐ๊ฒฐ ๋ฐฉ์‹์˜ ์•„ํ‚คํ…์ฒ˜๋ฐ์ดํ„ฐ ์—ฐ๋™์˜ ๋ณต์žก์„ฑ ์ฆ๊ฐ€(HW, ์šด์˜์ฒด์ œ, ์žฅ์•  ๋“ฑ)์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ Pipeline ์—ฐ๊ฒฐ ๊ตฌ์กฐ..
RestTemplate VS WebClient VS FeignClient ๊ฐ ์žฅ๋‹จ์ ์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด์ž
ยท
MSA
RestTemplate์ด๋ž€?RestTemplate์€ Spring์—์„œ REST API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค. Spring 3.0๋ถ€ํ„ฐ ์ง€์›๋˜์—ˆ์œผ๋ฉฐ, JSON๊ณผ XML ์‘๋‹ต์„ ๋ชจ๋‘ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.RestTemplate์˜ ์žฅ์ Spring 3.0๋ถ€ํ„ฐ ์ง€์›ํ•˜๋Š” ์•ˆ์ •์ ์ธ HTTP ํ†ต์‹  ํ…œํ”Œ๋ฆฟHTTP ์š”์ฒญ ํ›„ JSON, XML, String ๋“ฑ์˜ ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ๊ฐ„๋‹จํ•œ HTTP ์š”์ฒญ์— ์ ํ•ฉHeader, Content-Type ๋“ฑ์„ ์„ค์ •ํ•˜์—ฌ ์™ธ๋ถ€ API ํ˜ธ์ถœ ๊ฐ€๋ŠฅServer-to-Server ํ†ต์‹ ์— ์ ํ•ฉRestTemplate์˜ ๋‹จ์ Blocking I/O ๊ธฐ๋ฐ˜์˜ ๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜์—ฌ ๋™์‹œ ์š”์ฒญ์ด ๋งŽ์„ ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ์ฝ”๋“œ ์ž‘์„ฑ์ด ๋ฒˆ๊ฑฐ๋กœ์›€ (๋งค๋ฒˆ HTTP ์š”์ฒญ์„ ์ƒ์„ฑํ•˜๊ณ  ์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•ด์•ผ..
[Spring] Mybatis๋ฅผ ์ด์šฉํ•˜์—ฌ Batch Insert ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ(ORACLE ๊ธฐ์ค€)
ยท
SpringBatch
์˜ค๋Š˜์€ ํšŒ์‚ฌ์—์„œ ๋Œ€๋Ÿ‰๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ APIํ˜ธ์ถœ์‹œ๊ฐ„์ด 1๋ถ„์ด ๋„ˆ๋จธ๊ฐ€๋Š” ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•˜์—ฌ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •๊ณผ ๋ฌด์—‡์ด ์ œ์ผ ๋น ๋ฅด๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ๊ฐ€๋Šฅ ํ–ˆ๋Š”์ง€ ํฌ์ŠคํŒ… ํ•ด๋ณผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์šฐ์„  ์ œ์ผ ์ค‘์š”ํ•œ ๊ฒฐ๊ณผ๋ก ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐœ์ˆ˜๋Š” ์ด 1438๊ฐœ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.1. forEach๋ฌธ์„ ํ†ตํ•œ BULK INSERT [INSERT ALL] - 19์ดˆ 2. for๋ฌธ์„ ํ†ตํ•œ ๋‹จ๊ฑด insert - 7.39์ดˆ 3. forEach๋ฌธ์„ ํ†ตํ•œ ์„ฑ๋Šฅ [SELECT - UNION ALL] - 4.45์ดˆ 4. BATCH INSERT - 0.15์ดˆ ๊ฒฐ๊ณผ๋ก ์ ์œผ๋กœ ๋ณด์•„๋„ ํ™•์‹คํžˆ ์„ฑ๋Šฅ์ด ๋Œ€ํญ ํ–ฅ์ƒํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์•„๋ž˜์—์„œ๋Š” Batch Insert์˜ ๊ฐœ๋…๊ณผ ์žฅ์ , ์‚ฌ์šฉ๋ฐฉ๋ฒ•์— ๋Œ€ํ•˜์—ฌ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Bat..
File๊ณผ Map์„ ๋™์‹œ์— Controller์—์„œ ๋™์‹œ์— ๋ฐ›์•„์•ผ ํ•  ๊ฒฝ์šฐ
ยท
ํ˜„์—…์— ์ข…์‚ฌํ•˜๋ฉด์„œ ๋ฐœ๊ฒฌํ•œ ๋ฌธ์ œ์ 
ํšŒ์‚ฌ์—์„œ ์ผํ•˜๋ฉด์„œ Map๊ณผ File์„ ๋™์‹œ์— Request๋ฐ›์•„์•ผ ํ•  ์ผ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. Content-Type - Application/json Map ๊ฐ์ฒด๋Š” JSON ํ˜•ํƒœ๋กœ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ผ์ด์–ธํŠธ์—์„œ JavaScript ๊ฐ์ฒด ํ˜•ํƒœ๋กœ Map ๋ฐ์ดํ„ฐ๋ฅผ JSON์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์„œ๋ฒ„์— ์ „์†กํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.{ "key1": "value1", "key2": "value2"}์ด ๋ฐ์ดํ„ฐ๋Š” HTTP ์š”์ฒญ์˜ Content-Type์ด application/json์ด์–ด์•ผ ํ•˜๋ฉฐ,Spring์˜ @RequestBody ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.@PostMapping("/api/data")public String handleData(@RequestBody Map map) { // map ๋ฐ์ดํ„ฐ ..
๋™๊ธฐ์™€ ๋น„๋™๊ธฐ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž
ยท
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ
๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด๋ž€?๋™๊ธฐ์‹ ์ฒ˜๋ฆฌ ๋ชจ๋ธ(Synchronous Processing Model)์€ ์ง๋ ฌ์ ์œผ๋กœ ์ผ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.์ฆ‰, ์„œ๋ฒ„์— ์š”์ฒญ์ด ๋“ค์ด์–ด์˜ค๋ฉด ์ˆœ์ฐจ์ ์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌ์กฐ์ด๋‹ค.ํ˜„์žฌ์ž‘์—…์ด ๋๋‚˜๊ธฐ ์ „์—๋Š” ๊ทธ ๋‹ค์Œ๋™์ž‘์€ ์‹คํ–‰์ด ๋˜์ง€ ์•Š๊ณ  ๋Œ€๊ธฐ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. ์žฅ์ ๋™๊ธฐ ๋ฐฉ์‹์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰์ด ๋˜์–ด์•ผ์ง€๋งŒ ์›ํ•˜๋Š” ๊ฒฐ๊ณผ๊ฐ€ ์ถ”์ถœ๋˜๋Š” ๊ตฌ์กฐ์—์„œ๋Š” ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹จ์ ๊ฐ ์ž‘์—…์ด ์™„๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋ฏ€๋กœ ์†Œ์š”์‹œ๊ฐ„์ด ๊ธธ์–ด์ง€๊ณ  ์ด๋Š” ๊ณง ํ”„๋กœ์„ธ์Šค ์„ฑ๋Šฅ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋˜ํ•œ ํ•œ ์ž‘์—…์ด ์ง€์—ฐ๋˜๋ฉด ๋‹ค๋ฅธ ์ž‘์—…๋“ค๋„ ์ค„์ง€์–ด์„œ ์ž‘์—…์ด ์ง€์—ฐ๋  ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด๋ž€?๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ชจ๋ธ์ด๋ž€(Asynchronous Processing Model)์€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ผ์„ ์ฒ˜๋ฆฌ..