๐Ÿš€ ํŒ (๊ธฐ์ˆ  ์ ์šฉ ๋ฐฉ๋ฒ• ๋“ฑ)

์•ˆ๋…•ํ•˜์„ธ์š”. dev_writer์ž…๋‹ˆ๋‹ค. ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ๋„๊ตฌ ์ค‘ ํ•˜๋‚˜์ธ Jacoco๋ฅผ ์ ์šฉํ•œ ๊ณผ์ •์— ๋Œ€ํ•ด ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. JacocoJacoco๋Š” ์ž๋ฐ” ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ธก์ •ํ•˜๊ณ  ๋ฆฌํฌํŒ…ํ•  ์ˆ˜ ์žˆ๋Š” ์˜คํ”ˆ ์†Œ์Šค ํˆดํ‚ท์ž…๋‹ˆ๋‹ค. (์œ„ํ‚ค๋ฐฑ๊ณผ) ์• ์ดˆ์— Jacoco๋ผ๋Š” ๋‹จ์–ด ์ž์ฒด๊ฐ€ Java code coverage tools๋ผ๋Š” ๋‹จ์–ด๋ฅผ ๋‚ดํฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ (code coverage)์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋…ผํ•  ๋•Œ ์–ผ๋งˆ๋‚˜ ํ…Œ์ŠคํŠธ๊ฐ€ ์ถฉ๋ถ„ํ•œ๊ฐ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ์„ ๋•Œ ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์–ผ๋งˆ๋‚˜ ์‹คํ–‰๋˜์—ˆ๋Š”์ง€๋ฅผ ๋œปํ•ฉ๋‹ˆ๋‹ค. - ์œ„ํ‚ค๋ฐฑ๊ณผ ์ผ๋ฐ˜์ ์œผ๋กœ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ผผ๊ผผํ•˜๊ฒŒ ์ž‘์„ฑํ• ์ˆ˜๋ก ์˜ˆ์™ธ ์ผ€์ด์Šค๋“ค์„ ์ž˜ ํƒ์ง€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ทธ๋ ‡๊ธฐ์— ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ’ˆ์งˆ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ…Œ..
์•ˆ๋…•ํ•˜์„ธ์š” dev_writer์ž…๋‹ˆ๋‹ค. ์š”์ฆ˜ ํšŒ์‚ฌ ์ผ๊ณผ ๋‹ค๋ฅธ ์ผ๋“ค๋กœ ์ธํ•ด ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ์„ ์ž ์‹œ ํ•˜์ง€ ์•Š์•˜์—ˆ๋Š”๋ฐ์š”, ์ด๋ฒˆ์— ๋‹ค์‹œ EatToFit ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด์„œ Spring AI๋ฅผ ์—ฐ๊ฒฐํ•œ ๊ณผ์ •์ด ์žˆ์–ด ์ด ๋ถ€๋ถ„์„ ๊ณต์œ ๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ๊ณ„๊ธฐ: ์Œ์‹ AI API ๋งŒ๋ฃŒ ๋ฌธ์ œ ๋ฐœ์ƒ ๐Ÿ™…์‚ฌ์‹ค Spring AI๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์Œ์‹ ๊ฒ€์ƒ‰์ด ์•„๋‹ˆ๋ผ ์Œ์‹๊ณผ ํšŒ์›์˜ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์šด๋™ ํ”Œ๋žœ์„ ์ƒ์„ฑํ•  ๋•Œ์—๋งŒ ์ง„ํ–‰ํ•  ๊ณ„ํš์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด์—๋Š” ์Œ์‹ AI ํšŒ์‚ฌ๋กœ๋ถ€ํ„ฐ API๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„์„œ, ๋ถ„์„ ํ’ˆ์งˆ๊ณผ ์†๋„, ์‹ ๋ขฐ์„ฑ ๋ฉด์—์„œ ๋ชจ๋‘ ์šฐ์ˆ˜ํ•œ ์Œ์‹ AI ํšŒ์‚ฌ์˜ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ๊ณ„ํš์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ API๋ฅผ ๋ฐ›์•˜๋˜ ์‹œ์ ์ด 5์›”์ด์—ˆ๋Š”๋ฐ, ๊ทธ๋ž˜์„œ์ธ์ง€ ์žฌ์‹œ๋„ํ•œ ๊ฒฐ๊ณผ ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ๋˜์–ด ๋‹น์žฅ์€ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ..
์•ˆ๋…•ํ•˜์„ธ์š” dev_writer์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ €๋ฒˆ์— ๋ง์”€๋“œ๋ฆฐ ๋Œ€๋กœ Spring AI์—์„œ ์ง€์›ํ•˜๋Š” PromptTemplate๊ณผ ํ”„๋กฌํ”„ํŠธ์˜ ๊ทผ๋ณธ์ ์ธ ์ข…๋ฅ˜๋ฅผ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ”„๋กฌํ”„ํŠธ๋ž€์ด์ œ ํ”„๋กฌํ”„ํŠธ (Prompt)๋ผ๋Š” ๋‹จ์–ด๋Š” ์ผ์ƒ์ƒํ™œ์—์„œ ์‰ฝ๊ฒŒ ์ ‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ง์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์œ„ํ‚ค๋ฐฑ๊ณผ์—์„œ๋Š” ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ƒ์„ฑํ˜• AI ๋ชจ๋ธ๋กœ ํ•ด์„๋˜๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ช…๋ น, AI๊ฐ€ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ž‘์—…์„ ์„ค๋ช…ํ•˜๋Š” ์ž์—ฐ์–ด ํ…์ŠคํŠธ๋ผ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํšจ๊ณผ์ ์œผ๋กœ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋ก€๋ฅผ ์ •๋ฆฌํ•œ ๊ธ€๋„ ์ฐธ๊ณ ํ•˜์‹œ๋ฉด ์ข‹์„ ๋“ฏํ•ฉ๋‹ˆ๋‹ค. Prompt ํด๋ž˜์Šค๊ธฐ๋ณธ์ ์œผ๋กœ Spring AI์—์„œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Prompt ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ์ƒ์„ฑ์ž๋ฅผ ๋ณด๋ฉด UserMessage๋กœ ์ƒ์„ฑ๋จ์„ ๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ์ด์™ธ์—๋„ Mess..
์ด์ „ Spring AI์— ๋Œ€ํ•œ ๊ธ€์„ ์ž‘์„ฑํ•œ ํ›„, ๊ฐ์‚ฌํ•˜๊ฒŒ๋„ ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์€ ๋ถ„์ด ๊ธ€์„ ์ฐพ์•„์ฃผ์…จ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋˜ ๋„์ค‘, ๊ฐ‘์ž๊ธฐ Spring AI ๋ฉ”์ธ README์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์˜ฌ๋ผ์™”์Šต๋‹ˆ๋‹ค. Spring AI์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๊ณต์ง€  ํ•ต์‹ฌ ๋จผ์ € ๋ง์”€๋“œ๋ฆฌ๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐ”๋€Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.1๏ธโƒฃ ์ƒˆ๋กœ์šด ChatClient๋Š” ChatModel ์ธ์Šคํ„ด์Šค๋ฅผ ์ทจํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ RestClient, WebClient, JdbcClient ๋“ฑ๊ณผ ๊ฐ™์€ ์Šคํ”„๋ง ์ƒํƒœ๊ณ„์˜ ํด๋ผ์ด์–ธํŠธ๋“ค๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก fluent API ๋ฐฉ์‹์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.2๏ธโƒฃ ChatClient, ImageClient ๋“ฑ ...Client๋กœ ๋๋‚ฌ๋˜ ํŒŒ์ผ๋“ค์ด ์ด์ œ๋Š” ...Model๋กœ ์ด๋ฆ„์ด ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.๋”ฐ๋ผ์„œ ์ด์ „์—๋Š” ChatC..
์†Œ๊ฐœ์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” ๊นƒํ—ˆ๋ธŒ๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”, ์ด์Šˆ & PR ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์•Œ๋ ค๋“œ๋ฆฌ๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๊นƒํ—ˆ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ณ„์‹  ๋ถ„๋“ค์€ ๋Œ€๋ถ€๋ถ„ ์•„์‹ค ๊ฐœ๋…๋“ค์ผ ํ…๋ฐ์š”, PR์ด merge ๋˜๋ฉด ๊ด€๋ จ ์ด์Šˆ๊ฐ€ ์ž๋™์œผ๋กœ ๋‹ซํžˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์— ์ค‘์ ์„ ๋‘๊ฒ ์Šต๋‹ˆ๋‹ค. Issue๊นƒํ—ˆ๋ธŒ์—์„œ ์ด์Šˆ (Issue)๋ž€, ๋ชจ๋“  ์ข…๋ฅ˜์˜ ๋ฌธ์ œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์‹œ๋กœ Spring AI์˜ ์ด์Šˆ๋ฅผ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ ๊ฐœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊นƒํ—ˆ๋ธŒ์˜ ๊ณต์‹ ๋ฌธ์„œ์—์„œ๋Š” ์ด์Šˆ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.GitHub Issue๋ž€?์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ์šฐ๋ฆฌ์˜ ์ž‘์—…์„ ๊ณ„ํšํ•˜๊ณ , ๋ฌธ์ œ๋ฅผ ์ถ”์ ํ•˜๊ณ , ์šฐ๋ฆฌ๊ฐ€ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ๋“ค์„ ๋…ผ์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ณดํŽธ์ ์ธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ๋Œ€๋‹ต์€ ๊นƒํ—ˆ๋ธŒ ์ด์Šˆ์ด๋ฉฐ, ๊ทธ๊ฒƒ์€ ๋ชจ๋“  ์ €์žฅ์†Œ์— ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊นƒํ—ˆ๋ธŒ์˜ ์ด์Šˆ..
๋ณธ ๋‚ด์šฉ์€ 24.05.22 Spring AI์— ๋Œ€ํ•ด ๋ณ€๊ฒฝ์ ์ด ์ƒ๊ธด ์ด์œ ๋กœ ์ตœ์‹  ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€๋žต์ ์ธ ์›๋ฆฌ๋Š” ๊ฐ™์œผ๋‚˜, ๋ณ€๊ฒฝ์ ์— ๋Œ€ํ•ด ์•„์‹œ๊ณ  ์‹ถ์œผ์‹  ๋ถ„๋“ค์€ ํ•ด๋‹น ๊ธ€๋„ ์ฐธ๊ณ  ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐœ์š”์š”์ƒˆ ChatGPT ๋“ฑ ์ƒ์„ฑํ˜• AI๋ฅผ ์„œ๋น„์Šค์— ์ ‘๋ชฉ์‹œํ‚ค๋Š” ๊ธฐ์—…๋“ค์ด ๋Š˜์–ด๋‚˜๊ณ  ์žˆ๊ณ , ์ด๋Ÿฌํ•œ ์ฐจ์›์—์„œ ์ƒ์„ฑํ˜• AI๋ฅผ ํ”„๋กœ์ ํŠธ์— ๋„ฃ์–ด๋ณด๊ณ ์ž ํ•˜๋Š” ๋ถ„๋“ค์ด ๋งŽ์€ ๊ธฐ๋ฅ˜๋ฅผ ๋А๋ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ”„๋ง์—์„œ๋Š” ์•„๋ž˜์˜ ์˜์ƒ์„ ํ†ตํ•ด ์ž์ฒด ๊ธฐ์ˆ ์ธ Spring AI๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ์˜์ƒ์„ ๋งŒ๋“ค๊ธฐ๋„ ํ•˜์˜€์ฃ . ๋‚˜์˜จ ์ง€ ์–ผ๋งˆ ๋˜์ง€ ์•Š์€ ๊ธฐ์ˆ ์ด๋‹ค ๋ณด๋‹ˆ, ์•„์ง ์ด ๊ธฐ์ˆ ์„ ๋ธ”๋กœ๊ทธ์— ๊ธฐ๋กํ•˜์‹  ๋ถ„์ด ๋งŽ์ด ์—†๋Š” ๊ฒƒ ๊ฐ™์•„ ํ”„๋กœ์ ํŠธ ์ƒํ™ฉ์—์„œ ์ ์šฉํ•œ ๊ณผ์ •์„ ๊ณต์œ ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ๊ธ€์—์„œ ์ง„ํ–‰ํ•  ์˜ˆ์‹œ๋Š” OpenAI์˜ ChatGPT๋ฅผ ๊ฒฐํ•ฉํ•˜์—ฌ ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—..
dev_writer
'๐Ÿš€ ํŒ (๊ธฐ์ˆ  ์ ์šฉ ๋ฐฉ๋ฒ• ๋“ฑ)' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก