๋ชฉ๋ก๐Ÿƒ๐Ÿป‍โ™‚๏ธ ๊ธฐ๋ณธํ›ˆ๋ จ/Spring (14)

hades

[Spring] ๊ณตํ†ต ์˜ˆ์™ธ ์ฒ˜๋ฆฌ

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

[Spring] ์ธ์ฝ”๋”ฉํ•œ ๊ฒฐ๊ณผ๋Š” ๋””์ฝ”๋”ฉ

๐Ÿšจ ์—๋Ÿฌํ˜„์žฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์œ„์™€ ๊ฐ™์ด ์ €์žฅ๋œ ์ƒํƒœ์ด๋‹ค. ๊ธ€ ์ž‘์„ฑ์„ ํ•˜๋ฉด, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ FOOD ํ…Œ์ด๋ธ”์€ ๋ณ€ํ•จ์—†์ด POST ํ…Œ์ด๋ธ”์—๋งŒ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ๊ธฐ๋Œ€ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์˜ค๋Š˜์˜ ์š”๋ฆฌ ์ž๋ž‘์— ๊ฒŒ์‹œ๊ธ€์ด ์•„๋ฌด ๊ฒƒ๋„ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณด๋‹ˆ ์ดˆ์ฝœ๋ฆฟ+์ผ€์ดํฌ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. ๐Ÿ” ๋ถ„์„๋ฌธ์ œ๋Š” ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ , redirectํ•  ๋•Œ, UrlEncoder๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.return "redirect:/food/foodInfo/" + URLEncoder.encode(food.getName(), "UTF-8"); ๐Ÿ‘Š ํ•ด๊ฒฐ@GetMapping("/foodInfo/{foodName}")public String foodInfo(@PathVariable(name = "foodName") Strin..

[Spring] ์Šคํ”„๋ง AI

๋ณธ ๊ธ€์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ, AI์— ์งˆ๋ฌธ์„ ํ•˜๊ณ  ์‘๋‹ต์„ ๋ฐ›์•„์•ผ ํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด AI api๋ฅผ ํ•™์Šตํ•˜๋ฉด์„œ ์ž‘์„ฑํ•˜๋Š” ๊ธ€์ด๋‹ค. Spring์—์„œ๋Š” AI๋ฅผ ๋งค์šฐ ์‰ฝ๊ฒŒ ์ง€์›ํ•ด์ฃผ๋Š” dependency๊ฐ€ ์žˆ๋‹ค. ์œ ํŠœ๋ธŒ์˜ ๋งํฌ๋„ ํ•„์š”ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๊ตฌ๊ธ€ ์„œ๋น„์Šค์ธ Gemini AI๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ฒ˜์Œ, build.gradle์—์„œ Edit Starters๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด Gemini AI๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ํ–ˆ๋‹ค.ํ•˜์ง€๋งŒ, dependency๊ฐ€ ์ธ์‹๋˜์ง€ ์•Š๊ณ , ๋นจ๊ฐ„์ค„ ์ฒœ์ง€๊ฐ€ ๋˜์—ˆ๋‹ค. ์บ์‹œ ์‚ญ์ œ, ์žฌ๋นŒ๋“œ ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•ด๋ณด์•˜์ง€๋งŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์—ˆ๋‹ค. (๊นŠ์€ ๋นก์นจ) ํ˜น์‹œ๋‚˜ ํ•ด์„œ Spring Initilizr๋ฅผ ์ด์šฉํ•˜์—ฌ Gemini๋ฅผ ์ถ”๊ฐ€ํ•œ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๊ณ , build.gradle์„ ํ™•์ธํ•ด๋ณด์•˜๋‹ค. ์ƒˆ๋กญ..

[Spring] ํŒŒ์ผ ์—…๋กœ๋“œ

ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋˜ ๋„์ค‘, ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•˜์—ฌ ํ•™์Šต ํ›„, ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •๋ฆฌํ•œ ๊ธ€์ด๋‹ค. ๋ณธ์ธ์€ ๊ฒŒ์‹œ๊ธ€์— ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์˜€๊ณ , ๊ทธ๋กœ ์ธํ•ด ๊ฒŒ์‹œ๊ธ€๊ณผ ํŒŒ์ผ ๊ฐ„์˜ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ์žˆ๋‹ค. Multipart๋ฌธ์ž, ์ˆซ์ž ๋ฐ์ดํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ application/x-www-form-urlencoded  ๋ฐฉ์‹์„ ์ด์šฉํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ํŒŒ์ผ์€ ์ด๋“ค๊ณผ ๋‹ค๋ฅด๊ฒŒ ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋กœ ๋ณด๋‚ด์•ผ ํ•œ๋‹ค. ๋ฌธ์ž, ์ˆซ์ž, ํŒŒ์ผ์„ ๋™์‹œ์— ๋ณด๋‚ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด Form ํƒœ๊ทธ์— enctype="multipart/form-data" ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Content-Disposition์— ์˜ํ•ด ๊ตฌ๋ถ„๋˜๊ณ , ํŒŒ์ผ์€ ์ถ”๊ฐ€์ ์œผ๋กœ filename๊ณผ Content-Type์ด ์ถ”๊ฐ€๋˜๊ณ  ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ..