Apache NIFI - ์‹ค์ œ ๊ธฐํšŒ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

์†Œ๊ฐœ

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

ํƒœ์Šคํฌ

3๊ฐœ์˜ ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ฒซ ๋ฒˆ์งธ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—…๋ฐ์ดํŠธ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์ด ์„œ๋น„์Šค๋Š” ํƒ€์‚ฌ ์‹œ์Šคํ…œ์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ๋„์ฐฉํ•˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ณ  CSV ํ˜•์‹์˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค์Œ ์‹œ์Šคํ…œ์œผ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์„œ๋น„์Šค์˜ ๋์ ์€ ์ „์†ก๋œ ํŒŒ์ผ์„ ์ˆ˜์‹ ํ•˜์—ฌ ์œ ํšจ์„ฑ์„ ๊ฒ€์‚ฌํ•˜๊ณ  FTP๋ฅผ ํ†ตํ•ด ํŒŒ์ผ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋Š” FTP ์ „์†ก ์„œ๋น„์Šค๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ์„œ๋น„์Šค์ธ ์†Œ๋น„์ž ๋ฐ์ดํ„ฐ ์ „์†ก ์„œ๋น„์Šค๋Š” ์ฒ˜์Œ ๋‘ ์„œ๋น„์Šค์™€ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์„ค๋ช…ํ•œ ํŒŒ์ผ์„ ์ˆ˜์‹ ํ•˜๋ผ๋Š” ์š”์ฒญ์„ ์ œ1000์ž ์™ธ๋ถ€ ์‹œ์Šคํ…œ์œผ๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹ ํ•˜๊ณ , ์ค€๋น„๋œ ์‘๋‹ต ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€ ์ˆ˜์ •ํ•œ ๋‹ค์Œ(id, ์„ค๋ช…, linkToFile ํ•„๋“œ ์—…๋ฐ์ดํŠธ) SOAP ๋ฉ”์‹œ์ง€ ํ˜•์‹์œผ๋กœ ์‘๋‹ต์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ฆ‰, ์ „์ฒด์ ์ธ ๊ทธ๋ฆผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ๋‘ ์„œ๋น„์Šค๋Š” ์—…๋ฐ์ดํŠธํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ๋„์ฐฉํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ž‘์—…์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ ์„œ๋น„์Šค๋Š” ์ •๋ณด ์†Œ๋น„์ž๊ฐ€ ๋งŽ์•„ ๋ถ„๋‹น ์•ฝ XNUMX๊ฑด์˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง€์†์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋Š” ์ง€์†์ ์œผ๋กœ ์ œ๊ณต๋˜๋ฉฐ ํ•ด๋‹น ์ธ์Šคํ„ด์Šค๋Š” ํ…Œ์ŠคํŠธ, ๋ฐ๋ชจ, ์‚ฌ์ „ ํ”„๋กœ๋•์…˜, ํ”„๋กœ๋•์…˜ ๋“ฑ ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด๋Ÿฌํ•œ ์„œ๋น„์Šค์˜ ์ž‘๋™ ๋ฐฉ์‹์„ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋‹จ์ˆœํ™”๋˜์—ˆ์Œ์„ ์ฆ‰์‹œ ๋ช…ํ™•ํžˆ ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

Apache NIFI - ์‹ค์ œ ๊ธฐํšŒ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

๊ธฐ์ˆ ์‹ฌํ™”

๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์„ ๊ณ„ํšํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ๋จผ์ € Spring ํ”„๋ ˆ์ž„์›Œํฌ, Nginx ๋ฐธ๋Ÿฐ์„œ, Postgres ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ๊ธฐํƒ€ ๊ธฐ์ˆ ์ ์ธ ๊ฒƒ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ Java๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ์†”๋ฃจ์…˜์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ์˜ ์‹œ์„ ์€ ํŠน์ • ๋ถ„์•ผ์—์„œ ์œ ํ–‰ํ•˜๋Š” Apache NIFI ๊ธฐ์ˆ ์— ์ ๋ ธ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์ˆ ์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ์ด 3๊ฐ€์ง€ ์„œ๋น„์Šค๋ฅผ ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ์—ˆ๋‹ค๊ณ  ๋ฐ”๋กœ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์—์„œ๋Š” ์†Œ๋น„์ž๋ฅผ ์œ„ํ•œ ํŒŒ์ผ ์ „์†ก ์„œ๋น„์Šค์™€ ๋ฐ์ดํ„ฐ ์ „์†ก ์„œ๋น„์Šค ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์ง€๋งŒ, ๊ธ€์ด ๋„์›€์ด ๋œ๋‹ค๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์„œ๋น„์Šค์— ๋Œ€ํ•ด์„œ๋„ ๊ธ€์„ ์“ฐ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด๊ฒŒ ๋ญ์˜ˆ์š”

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

์˜ˆ

์‚ฌ๊ฐํ˜•์ด ์„œ๋กœ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์˜ˆ๊ฐ€ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ๋ฐฉ์‹์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. HTTP ์š”์ฒญ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค(์ด๋ก ์ ์œผ๋กœ๋Š” ์š”์ฒญ ๋ณธ๋ฌธ์— ํŒŒ์ผ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. NIFI์˜ ๊ธฐ๋Šฅ์„ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์ด ์˜ˆ์—์„œ๋Š” ์š”์ฒญ์ด ๋กœ์ปฌ ํŒŒ์ผ ์ €์žฅ์†Œ์—์„œ ํŒŒ์ผ์„ ์ˆ˜์‹ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค). ) ๊ทธ๋Ÿฐ ๋‹ค์Œ FH์—์„œ ํŒŒ์ผ์„ ์ˆ˜์‹ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค์™€ FTP๋ฅผ ํ†ตํ•ด FH๋กœ ์ด๋™ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณ‘ํ–‰ํ•˜์—ฌ ์š”์ฒญ์ด ์ˆ˜์‹ ๋˜์—ˆ๋‹ค๋Š” ์‘๋‹ต์„ ๋‹ค์‹œ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์†Œ์œ„ flowFile์„ ํ†ตํ•ด ์„œ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•œ๋‹ค๋Š” ์ ์„ ๋ช…ํ™•ํžˆ ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์†์„ฑ๊ณผ ์ฝ˜ํ…์ธ ๋ฅผ ์ €์žฅํ•˜๋Š” NIFI์˜ ๊ธฐ๋ณธ ์—”ํ„ฐํ‹ฐ์ž…๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ ๋Š” ์ŠคํŠธ๋ฆผ ํŒŒ์ผ๋กœ ํ‘œ์‹œ๋˜๋Š” ๋ฐ์ดํ„ฐ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋Œ€๋žต์ ์œผ๋กœ ๋งํ•˜๋ฉด ํ•œ ์Šคํ€˜์–ด์—์„œ ํŒŒ์ผ์„ ๋ฐ›์•„ ๋‹ค๋ฅธ ์Šคํ€˜์–ด๋กœ ์ „์†กํ•˜๋ฉด ํ•ด๋‹น ์ฝ˜ํ…์ธ ๊ฐ€ ๊ท€ํ•˜์˜ ํŒŒ์ผ์ด ๋ฉ๋‹ˆ๋‹ค.

Apache NIFI - ์‹ค์ œ ๊ธฐํšŒ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

๋ณด์‹œ๋‹ค์‹œํ”ผ, ์ด ๊ทธ๋ฆผ์€ ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. HandleHttpRequest - ์š”์ฒญ์„ ์ˆ˜๋ฝํ•˜๊ณ , InstallText - ์‘๋‹ต ๋ณธ๋ฌธ์„ ์ƒ์„ฑํ•˜๊ณ , HandleHttpResponse - ์‘๋‹ต์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. FetchFile - ํŒŒ์ผ ์ €์žฅ์†Œ์—์„œ ํŒŒ์ผ์„ ๋ฐ›์•„ ์ •์‚ฌ๊ฐํ˜• PutSftp๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. - ์ด ํŒŒ์ผ์„ FTP์˜ ์ง€์ •๋œ ์ฃผ์†Œ์— ๋„ฃ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด ๊ณผ์ •์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์„ธ์š”.

์ด ๊ฒฝ์šฐ ์š”์ฒญ์€ ๋ชจ๋“  ๊ฒƒ์˜ ์‹œ์ž‘์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Apache NIFI - ์‹ค์ œ ๊ธฐํšŒ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

StandardHttpContextMap์„ ์ œ์™ธํ•˜๊ณ  ์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ผ์ข…์˜ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ๋” ์ž์„ธํžˆ ๊ทธ๋ฆฌ๊ณ  ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด์„œ๋„ ๋‹ค์Œ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—

๋‹ค์Œ์œผ๋กœ ์‚ฌ๊ฐํ˜•์˜ RefreshText ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. replacementValue์— ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‘๋‹ต ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ์„ค์ •์—์„œ ๋กœ๊น… ์ˆ˜์ค€์„ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ๊ณ , {nifi์˜ ์••์ถ•์„ ํ‘ผ ์œ„์น˜}/nifi-1.9.2/logs ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‹คํŒจ/์„ฑ๊ณต ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ „์ฒด์ ์œผ๋กœ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. . ์ฆ‰, ํ…์ŠคํŠธ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•œ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์‘๋‹ต์„ ๋ณด๋‚ด๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ˜ธ์ถœ๋˜๊ณ , ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” ์‹คํŒจํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ„๋‹จํžˆ ๊ธฐ๋กํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Apache NIFI - ์‹ค์ œ ๊ธฐํšŒ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

์‘๋‹ต์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ์„ ๋•Œ์˜ ์ƒํƒœ๋ฅผ ์ œ์™ธํ•˜๊ณ  HandleHttpResponse ์†์„ฑ์—๋Š” ํŠน๋ณ„ํžˆ ํฅ๋ฏธ๋กœ์šด ๋‚ด์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค.

Apache NIFI - ์‹ค์ œ ๊ธฐํšŒ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

์š”์ฒญ๊ณผ ์‘๋‹ต์„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํŒŒ์ผ ์ˆ˜์‹  ๋ฐ FTP ์„œ๋ฒ„์— ๋ฐฐ์น˜ํ•˜๋Š” ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค. FetchFile - ์„ค์ •์— ์ง€์ •๋œ ๊ฒฝ๋กœ์—์„œ ํŒŒ์ผ์„ ๋ฐ›์•„ ๋‹ค์Œ ํ”„๋กœ์„ธ์Šค๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

Apache NIFI - ์‹ค์ œ ๊ธฐํšŒ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

๊ทธ๋Ÿฐ ๋‹ค์Œ PutSftp ์‚ฌ๊ฐํ˜•์€ ํŒŒ์ผ์„ ํŒŒ์ผ ์ €์žฅ์†Œ์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ ๊ตฌ์„ฑ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Apache NIFI - ์‹ค์ œ ๊ธฐํšŒ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

๊ฐ ์‚ฌ๊ฐํ˜•์ด ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๋ผ๋Š” ์‚ฌ์‹ค์— ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์‚ฌ์šฉ์ž ์ •์˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ, ๊ทธ๋ฃจ๋ธŒ์— ์•ฝ๊ฐ„์˜ ๊ธ€์„ ์“ฐ๋Š” ์ข€ ๋” ๋ณต์žกํ•œ ๊ณผ์ •์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋” ๋ณต์žกํ•œ ์˜ˆ

SOAP ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๊ณผ์ •์œผ๋กœ ์ธํ•ด ์†Œ๋น„์ž์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ์กฐ๊ธˆ ๋” ๋ณต์žกํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ์„ธ์Šค๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

Apache NIFI - ์‹ค์ œ ๊ธฐํšŒ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

์—ฌ๊ธฐ์„œ ์•„์ด๋””์–ด๋„ ํŠน๋ณ„ํžˆ ๋ณต์žกํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์†Œ๋น„์ž๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์š”์ฒญ์„ ๋ฐ›๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์•˜๋‹ค๋Š” ์‘๋‹ต์„ ๋ณด๋‚ด๊ณ  ์‘๋‹ต ํŒŒ์ผ ์ˆ˜์‹  ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•œ ๋‹ค์Œ ํŠน์ • ๋…ผ๋ฆฌ๋กœ ํŽธ์ง‘ํ•œ ๋‹ค์Œ SOAP ๋ฉ”์‹œ์ง€ ํ˜•์‹์œผ๋กœ ํŒŒ์ผ์„ ์†Œ๋น„์ž์—๊ฒŒ ์„œ๋ฒ„๋กœ ์ „์†กํ–ˆ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ๋ณธ ์‚ฌ๊ฐํ˜•์„ ๋‹ค์‹œ ์„ค๋ช…ํ•  ํ•„์š”๋Š” ์—†์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ƒˆ๋กœ์šด ์‚ฌ๊ฐํ˜•์œผ๋กœ ๋„˜์–ด๊ฐ€๊ฒ ์Šต๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ํŽธ์ง‘ํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ผ๋ฐ˜ RectText ์œ ํ˜• ์‚ฌ๊ฐํ˜•์ด ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ExecuteGroogyScript ์‚ฌ๊ฐํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์„ค์ •์€ ์•„๋ž˜์— ๋‚˜์™€ ์žˆ์Šต๋‹ˆ๋‹ค.

Apache NIFI - ์‹ค์ œ ๊ธฐํšŒ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

์ด ์‚ฌ๊ฐํ˜•์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋œ ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” scriptBody์— ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ํ•œ, ExecuteScript ์Šคํ€˜์–ด๋Š” ์—ฌ๋Ÿฌ ์–ธ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ๊ทธ๋ฃจ๋น„์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” Java ๊ฐœ๋ฐœ์ž๋ฅผ ์‹ค๋ง์‹œํ‚ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์‚ฌ๊ฐํ˜•์—์„œ๋Š” Java๋กœ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ •๋ง๋กœ ์›ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์€ ์ž์‹ ๋งŒ์˜ ๋งž์ถคํ˜• ์‚ฌ๊ฐํ˜•์„ ๋งŒ๋“ค์–ด NIFI ์‹œ์Šคํ…œ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ „์ฒด ์ž‘์—…์—๋Š” ํƒฌ๋ฒ„๋ฆฐ๊ณผ ํ•จ๊ป˜ ๊ฝค ๊ธด ์ถค์ด ์ˆ˜๋ฐ˜๋˜๋Š”๋ฐ, ์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ๋ฃจ๋น„ ์–ธ์–ด๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ SOAP ๋ฉ”์‹œ์ง€์˜ ID๋ฅผ ์ ์ง„์ ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋Š” ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. ์ฃผ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. flowFile์—์„œ ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ผ์„ ๋‹ค์‹œ ๊ฑฐ๊ธฐ์— ๋„ฃ์–ด ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”. ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค๋Š” ์ ๋„ ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. libs ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๋‹จ์ ์€ ์ด ์‚ฌ๊ฐํ˜•์˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋””๋ฒ„๊น…ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. NIFI JVM์— ์—ฐ๊ฒฐํ•˜๊ณ  ๋””๋ฒ„๊น… ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ ์ €๋Š” ๋กœ์ปฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹œ์ž‘ํ•˜๊ณ  ์„ธ์…˜์—์„œ ํŒŒ์ผ ์ˆ˜์‹ ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ์—์„œ๋„ ๋””๋ฒ„๊น…์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•  ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ์˜ค๋ฅ˜๋Š” Google์—์„œ ๋งค์šฐ ์‰ฝ๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ NIFI ์ž์ฒด์—์„œ ๋กœ๊ทธ์— ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.

import org.apache.commons.io.IOUtils
import groovy.xml.XmlUtil
import java.nio.charset.*
import groovy.xml.StreamingMarkupBuilder

def flowFile = session.get()
if (!flowFile) return
try {
    flowFile = session.write(flowFile, { inputStream, outputStream ->
        String result = IOUtils.toString(inputStream, "UTF-8");
        def recordIn = new XmlSlurper().parseText(result)
        def element = recordIn.depthFirst().find {
            it.name() == 'id'
        }

        def newId = Integer.parseInt(element.toString()) + 1
        def recordOut = new XmlSlurper().parseText(result)
        recordOut.Body.ClientMessage.RequestMessage.RequestContent.content.MessagePrimaryContent.ResponseBody.id = newId

        def res = new StreamingMarkupBuilder().bind { mkp.yield recordOut }.toString()
        outputStream.write(res.getBytes(StandardCharsets.UTF_8))
} as StreamCallback)
     session.transfer(flowFile, REL_SUCCESS)
}
catch(Exception e) {
    log.error("Error during processing of validate.groovy", e)
    session.transfer(flowFile, REL_FAILURE)
}

์‚ฌ์‹ค ๊ด‘์žฅ์˜ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์€ ์—ฌ๊ธฐ์„œ ๋์ด ๋‚ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ, ์—…๋ฐ์ดํŠธ๋œ ํŒŒ์ผ์€ ์„œ๋ฒ„๋กœ ํŒŒ์ผ ์ „์†ก์„ ๋‹ด๋‹นํ•˜๋Š” ์Šคํ€˜์–ด๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด ์‚ฌ๊ฐํ˜•์— ๋Œ€ํ•œ ์„ค์ •์ž…๋‹ˆ๋‹ค.

Apache NIFI - ์‹ค์ œ ๊ธฐํšŒ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

SOAP ๋ฉ”์‹œ์ง€๊ฐ€ ์ „์†ก๋˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์–ด๋””์— ์”๋‹ˆ๋‹ค. ๋‹ค์Œ์œผ๋กœ ์ด๊ฒƒ์ด SOAP์ž„์„ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Apache NIFI - ์‹ค์ œ ๊ธฐํšŒ์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ๊ฐœ์š”

ํ˜ธ์ŠคํŠธ ๋ฐ ์ž‘์—…(soapAction)๊ณผ ๊ฐ™์€ ์—ฌ๋Ÿฌ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ €์žฅํ•˜๊ณ  ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. SOAP ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—

NIFI ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์„ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ฉฐ ์‹ค์ œ ์ด์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ณ ๋ ค๋œ ์‚ฌ๋ก€๋Š” ํ…Œ์ŠคํŠธ ์‚ฌ๋ก€์ด๋ฉฐ ์‹ค์ œ๋กœ ์ „ํˆฌ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ƒํ™ฉ๊ณผ ์•ฝ๊ฐ„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ด ๊ธ€์ด ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋„์›€์ด ๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ด€์‹ฌ์„ ๊ฐ€์ ธ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์งˆ๋ฌธ์ด ์žˆ์œผ๋ฉด ๊ธ€์„ ์“ฐ์„ธ์š”. ๋‚˜๋Š” ๋Œ€๋‹ตํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•  ๊ฒƒ์ด๋‹ค.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€