Cute Running Puppy

๐ŸƒSpring 29

# spring boot(java) ์ œ๋ฏธ๋‚˜์ด(Gemini) API ์—ฐ๋™ํ•˜๊ธฐ (๋ฌด๋ฃŒ ๋ฒ„์ „)

๋ญ”๊ฐ€ AI์ฑ—๋ด‡์„ ๋งŒ๋“ค์–ด๋ณด๊ณ ์‹ถ์–ด์„œ๊ฐœ์ธ์ ์œผ๋กœ ๋งŒ๋“ค์–ด๋†“์€ ๋‹ค์ด์–ด๋ฆฌ์— ์–ด๋–ค๊ธฐ๋Šฅ์„ ๋„ฃ์–ด๋ณผ๊นŒํ•˜๋‹ค๊ฐ€๋‹จ์–ด์žฅ์— ๋ฒˆ์—ญ๊ธฐ ๊ธฐ๋Šฅ์„ ๋„ฃ์œผ๋ฉด ์ข‹๊ฒ ๋‹ค ์ƒ๊ฐํ•ด์„œ์ œ๋ฏธ๋‚˜์ด๊ฐ€ ๋ฒˆ์—ญํ•ด์ฃผ๋Š” ๋ฒˆ์—ญ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•ด๋ณด์•˜๋‹ค. ์›๋ž˜๋Š” GPT์จฉ์„ ์“ฐ๊ณ ์‹ถ์—ˆ์ง€๋งŒ ใ… ใ…  ์œ ๋ฃŒ๋กœ ๋ฐ”๋€Œ์–ด์„œ..๋ฌด๋ฃŒํ‚ค๋ผ...์‘๋‹ต๋„๋А๋ฆฌ๊ณ ..๊ทธ๋ ‡์ง€๋งŒ..๋ฌด๋ฃŒ๋‹ˆ๊นŒ............ ๋ฒˆ์—ญ๊ธฐ๋Š” ์•ˆ์— ๋‚ด์šฉ์ด ๋ถ€๋„๋Ÿฌ์šฐ๋‹ˆ๊นŒ ๋‹ค๋ฅธ ์˜ˆ์‹œ์ฝ”๋“œ๋กœ..๊ฐ„๋‹จํ•˜๊ฒŒ ํ…Œ์ŠคํŠธํ•ด๋ณด๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค์–ด๋ณด๊ฒ ๋‹ค. ๋จผ์ € ์ œ๋ฏธ๋‚˜์ด apiํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•œ๋‹ค.https://aistudio.google.com/apikey ๋กœ๊ทธ์ธ - Google ๊ณ„์ •์ด๋ฉ”์ผ ๋˜๋Š” ํœด๋Œ€์ „ํ™”accounts.google.com์—ฌ๊ธฐ์„œ ๋กœ๊ทธ์ธ์„ ํ•œ ํ›„ APIํ‚ค๋ฅผ ๋ฌด๋ฃŒ๋กœ ๋ฐœ๊ธ‰๋ฐ›์œผ๋ฉด ๋˜๊ณ  ์ด๊ฒŒ ๋์ด ์•„๋‹ˆ๋ผ์ œ๋ฏธ๋‚˜์ด api๋ฅผ ํ™œ์„ฑํ•ด์ฃผ์–ด์•ผ ๋น„๋กœ์†Œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. http..

# spring boot(gradle) google๋กœ๊ทธ์ธ(์†Œ์…œ ๋กœ๊ทธ์ธ) ์—ฐ๋™ ๋ฐฉ๋ฒ• 3ํƒ„(๋ฐฐํฌ๋œ ์‚ฌ์ดํŠธ)

# spring boot(gradle) google๋กœ๊ทธ์ธ(์†Œ์…œ ๋กœ๊ทธ์ธ) ์—ฐ๋™ ๋ฐฉ๋ฒ• 1ํƒ„spring boot์—์„œ ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ๊ธฐ๋ณธ ํ๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.[๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ํด๋ฆญ] ↓[๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ → redirect URI๋กœ ํ† ํฐ ๋ฐ˜ํ™˜] ↓[Spring Security๊ฐ€ ํ† ํฐ ๋ฐ›์•„์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ํš๋“] ↓[์ž๋™ ๋กœsomnote.tistory.com # spring boot(gradle) google๋กœ๊ทธ์ธ(์†Œ์…œ ๋กœ๊ทธ์ธ) ์—ฐ๋™ ๋ฐฉ๋ฒ• 2ํƒ„tailwindCSS ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•ด๋‹น ๊ธ€์„ ๋ณด๋ฉด ๋œ๋‹ค. # spring boot TailwindCSS์™€ ์—ฐ๋™ํ•˜๊ธฐ, ์‚ฌ์šฉ๋ฐฉ๋ฒ•tailwindcss๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•ž๋‹จ์„ ๊พธ๋ฉฐ๋ณด์ž tailwindcss๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋˜ ๋ณต์žกํ•˜๋‹ค.. ์•ˆ์จ๋ณผ ์‚ฌ๋žŒ๋“ค์€ ๋„˜์–ด๊ฐ€somnote..

# spring boot(gradle) google๋กœ๊ทธ์ธ(์†Œ์…œ ๋กœ๊ทธ์ธ) ์—ฐ๋™ ๋ฐฉ๋ฒ• 2ํƒ„

tailwindCSS ๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ํ•ด๋‹น ๊ธ€์„ ๋ณด๋ฉด ๋œ๋‹ค. # spring boot TailwindCSS์™€ ์—ฐ๋™ํ•˜๊ธฐ, ์‚ฌ์šฉ๋ฐฉ๋ฒ•tailwindcss๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•ž๋‹จ์„ ๊พธ๋ฉฐ๋ณด์ž tailwindcss๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋˜ ๋ณต์žกํ•˜๋‹ค.. ์•ˆ์จ๋ณผ ์‚ฌ๋žŒ๋“ค์€ ๋„˜์–ด๊ฐ€๋ฉด ๋œ๋‹ค. ์ผ๋‹จ node.js๊ฐ€ ๋‚œ ์ด๋ฏธ ๊น”๋ ค์žˆ์–ด์„œ ๊ดœ์ฐฎ์€๋ฐ ์•ˆ๊น”๋ ค์žˆ์œผ๋ฉด node.js๋Š” ๋ฌด์กฐ๊ฑด ์„ค์น˜ํ•˜์…”somnote.tistory.com ๊ทธ๋Ÿผ ์ด์ œ ํƒ€์ž„๋ฆฌํ”„๋ฅผ ์‚ฌ์šฉํ•œ html๊ณผ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์—ฐ๊ฒฐํ•ด์ฃผ๋ฉด ๋๋‚œ๋‹ค!์ผ๋‹จ ์†Œ์…œ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•˜๊ธฐ ๋–„๋ฌธ์— ๋กœ๊ทธ์ธ ํ™”๋ฉด์„ 1๊ฐœ ๋งŒ๋“ ๋‹ค. ์ฐธ ํƒ€์ž„๋ฆฌํ”„ ํ…œํ”Œ๋ฆฟ์€ resources/templates ์•„๋ž˜์— ๋งŒ๋“ค๋ฉด ๋œ๋‹ค. login.html ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ตฌ๊ธ€๋กœ ๋กœ๊ทธ์ธํ•˜๊ธฐ..

# spring boot(gradle) google๋กœ๊ทธ์ธ(์†Œ์…œ ๋กœ๊ทธ์ธ) ์—ฐ๋™ ๋ฐฉ๋ฒ• 1ํƒ„

spring boot์—์„œ ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ ํ•˜๋Š” ๋ฐฉ๋ฒ•์˜ ๊ธฐ๋ณธ ํ๋ฆ„์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.[๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ํด๋ฆญ] ↓[๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ → redirect URI๋กœ ํ† ํฐ ๋ฐ˜ํ™˜] ↓[Spring Security๊ฐ€ ํ† ํฐ ๋ฐ›์•„์„œ ์‚ฌ์šฉ์ž ์ •๋ณด ํš๋“] ↓[์ž๋™ ๋กœ๊ทธ์ธ or DB ์‚ฌ์šฉ์ž ๋“ฑ๋ก] ์ฒ˜์Œ์—” ์„ค์ •ํ• ๊ฒƒ๋„ ๋งŽ๊ณ  ํ• ๊ฒƒ๋„ ๋งŽ์•„์„œ ๊ต‰์žฅํžˆ ๊ท€์ฐฎ๊ณ  ์ง€๋ฃจํ•˜์ง€๋งŒ ํ•œ๋ฒˆ ์ œ๋Œ€๋กœ ์ตํ˜€๋‘๋ฉด ๋‹ค๋ฅธ ์†Œ์…œ๋กœ๊ทธ์ธ๋„ ๋น„์Šทํ•œ ๊ตฌ์กฐ๊ธฐ ๋•Œ๋ฌธ์— ์ง€๊ธˆ ์ง€์‹์„ ์จ๋จน์œผ๋ฉด ๋œ๋‹ค. Google ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ๋กœ๊ทธ์ธ Google ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ์œผ๋กœ ์ด๋™accounts.google.comํ•ด๋‹น ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜์—ฌ ์ƒˆํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  API๋ฐ ์„œ๋น„์Šค์— ๋“ค์–ด๊ฐ€ Oauth ๋™์˜ ํ™”๋ฉด์„ ์„ ํƒํ•œ๋‹ค.์‹œ์ž‘ํ•˜๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๋ญ๋ญ๋ฅผ ์ ์œผ๋ผ๊ณ ํ•˜๋Š”๋ฐ๋Œ€์ถฉ ์ ์–ด์ฃผ๊ณ  ์™„๋ฃŒํ•˜๋ฉด ๋˜๊ณ  ์•„๋ž˜ OA..

# spring bootํ”„๋กœ์ ํŠธ ์›น์—์„œ ์ƒ์„ฑํ•˜๊ธฐ (spring initializer)

https://start.spring.io/ ์‚ฌ์ดํŠธ์— ์ ‘์†ํ•˜๋ฉด ์–ด์ฐจํ”ผ ๋‚˜์ค‘์— ๋‹ค implement์— ์ ์–ด์„œ ๋‹ค์šดํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ๋Œ€์ถฉ ํ•„์š”ํ• ๊ฒƒ ๊ฐ™์€์• ๋“ค๋งŒ ๋„ฃ์–ด์ค€ ํ›„EXPLORE ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•ด์ค€๋‹ค.์•„์ฃผ ์ž˜ ๋‹ค์šด๋˜์—ˆ๋‹ค. ์ด์ œ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋กœ importํ•ด์„œ ์‹คํ–‰ํ•˜๋ฉด ์ž˜ ์‹คํ–‰๋œ๋‹ค.

๐ŸƒSpring 2025.07.07

# HWP ํ…œํ”Œ๋ฆฟ์— ๋™์ ์œผ๋กœ ROW ์‚ฝ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ• (์ „์ž์ •๋ถ€ํ”„๋ ˆ์ž„์›Œํฌ + MyBatis)

๊ธฐ์กด ํ…œํ”Œ๋ฆฟ์ด(hml, hwp) ์žˆ๊ณ  ํ•ด๋‹น ํ…œํ”Œ๋ฆฟ์„ ๋ณ€ํ™˜ํ•  ๋•Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•œ ๋‚ด์šฉ ์˜ˆ๋ฅผ ๋“ค์–ด ๋„์„œ๊ด€ ๋Œ€์ถœ ๋ชฉ๋ก ๋ฆฌํฌํŠธ๋ผ๊ณ  ํ•ด๋ณด์ž.ํ…œํ”Œ๋ฆฟ์—๋Š” ๋ฐ์ดํ„ฐ ์‹œ์ž‘ ์œ„์น˜์— ๋งˆ์ปค๋ฅผ ์‚ฝ์ž…ํ•ด๋‘”๋‹ค.#BOOK_ROW#ํ•ด๋‹น ๋งˆ์ปค๋Š” ์„ฑ์ ํ‘œ ํ‘œ ์•ˆ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ฝ์ž…๋  ์‹œ์ž‘ ์œ„์น˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค.ํ…œํ”Œ๋ฆฟ์˜ TABLE ํƒœ๊ทธ๋Š” ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค. ์œ„ ํƒœ๊ทธ๋Š” 3๋ฒˆ์งธ ROW์•ˆ์— ์ฒซ๋ฒˆ์งธ CELL์— ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ๋‚ด์šฉ์ด ๋ ๊ฒƒ์ด๋‹ค. ... ... ... ... ... ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ต์‹ฌ ๋กœ์ง์€ ์ด๋ ‡๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.#BOOK_ROW# ๋งˆ์ปค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ธ”๋Ÿญ์„ ๋ณต์‚ฌ๊ฐ ๋‚ด๋ถ€์˜ ํƒœ๊ทธ๋ฅผ replaceALL๋กœ ์ˆœ์ฐจ ์น˜ํ™˜RowAddr๋Š” ๋ฐ˜๋“œ์‹œ ๊ฐ๊ฐ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•ด์•ผ ํ•จ (2 + i) ํƒœ๊ทธ ์•ˆ RowCount ๊ฐ’๋„ ๋ฐ˜๋“œ์‹œ ๊ฐฑ์‹ ํ•ด์•ผ ๋ฌธ์„œ ..

# ์ ‘๊ทผ์ œ์–ด ์ธํ„ฐ์…‰ํ„ฐ(interceptor) vs ํ•„ํ„ฐ(filter) ๋ญ๊ฐ€ ๋‚˜์„๊นŒ? ์ฐจ์ด์ 

์š”์ฒญํ๋ฆ„ ์ธํ„ฐ์…‰ํ„ฐ์™€ ํ•„ํ„ฐ์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ผ๊นŒ? FilterServletContainer์—์„œ ๊ฐ€์žฅ ๋จผ์ € ์‹คํ–‰๋จ์ •์  ์ž์›(CSS, JS ๋“ฑ)๋„ ๋‹ค ์ง€๋‚˜๊ฐ๋ชฉ์ : ๋ณด์•ˆ ํ•„ํ„ฐ, ํ† ํฐ ๊ฒ€์‚ฌ, ์š”์ฒญ ๋กœ๊น…, GZIP ์••์ถ• ๋“ฑ ์ „์—ญ ์ฒ˜๋ฆฌ๋‹จ์ : Spring MVC ์˜ˆ์™ธ ์ฒ˜๋ฆฌ์™€ ์—ฐ๋™ ์–ด๋ ค์›€, ์‹ค์ˆ˜ ์‹œ ๋ชจ๋“  ์š”์ฒญ ์ฐจ๋‹จ ์œ„ํ—˜ InterceptorDispatcherServlet ๋‚ด๋ถ€์—์„œ๋งŒ ์ž‘๋™ํ•จ์ •์  ์ž์›์€ ์ž๋™ ์ œ์™ธ๋จ๋ชฉ์ : ๋กœ๊ทธ์ธ ์ฒดํฌ, ๊ถŒํ•œ ๊ฒ€์‚ฌ, API ๋กœ๊น… ๋“ฑ MVC ๊ตฌ์กฐ์™€ ๋งž๋Š” ์ฒ˜๋ฆฌ์žฅ์ : Spring์˜ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ, ์„ธ์…˜, ๋ชจ๋ธ ๋“ฑ๊ณผ ์ž˜ ์—ฐ๋™๋จ ์š”์ ๋น„๊ตํ•ญ๋ชฉFilterInterceptor์‹คํ–‰์œ„์น˜DispatcherServlet ์ด์ „DispatcherServlet ๋‚ด๋ถ€์ •์  ์ž์› ํ†ต๊ณผ ์—ฌ๋ถ€์ง์ ‘ ๊ฑธ๋Ÿฌ์•ผ ํ•จ์ž๋™ ์ œ์™ธ์˜ˆ์™ธ ํ•ธ๋“ค๋กœ ์—ฐ..

๐ŸƒSpring 2025.06.17

# Filter - ํฌ๋กฌ ๊ฐœ๋ฐœ์ž๋ชจ๋“œ /.well-known, devtools.json... ์—๋Ÿฌ ์ฒ˜๋ฆฌ๋ฐฉ๋ฒ•

Spring MVC ์š”์ฒญ ์ฒ˜๋ฆฌ ์ˆœ์„œ๋กœ ์ธํ•ด Filter์—์„œ ๋ง‰์œผ๋ฉด ์ œ์ผ ๋น ๋ฅด๋‹ค.๋‹จ๊ณ„๊ตฌ์„ฑ์š”์†Œ์˜ˆ1Filter (๊ฐ€์žฅ ๋จผ์ €)AccessMenuFilter, Spring Security ๋‚ด๋ถ€ ํ•„ํ„ฐ ๋“ฑ2Spring Security FilterSecurityConfig์˜ httpSecurity.antMatchers()3DispatcherServlet์„œ๋ธ”๋ฆฟ ๋งคํ•‘ (*.do, *.json ๋“ฑ)4InterceptorpreHandle(), postHandle()5Controller@RequestMapping, @RestController6ExceptionHandler@ControllerAdvice ์ „์—ญ ์˜ˆ์™ธ์ฒ˜๋ฆฌ DevToolsIgnoreFilter.javapublic class DevToolsIgnoreFilter imp..

# SSL ์ธ์ฆ์„œ ๋ฌธ์ œ(PKIX path building failed) ์ž„์‹œ ์ธ์ฆ ๋ฌด์‹œ (ํ…Œ์ŠคํŠธ์šฉ)

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) ๊ฐ€๋” ๋‚ฎ์€ ์ž๋ฐ”๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด apiํ˜ธ์ถœ ํ•  ๋•Œ ssl ์ธ์ฆ์„œ ์—๋Ÿฌ๊ฐ€ ํ„ฐ์ง„๋‹ค. ์‹ค์ œ ์„œ๋น„์Šค์—์„œ๋Š” ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ๋น„์ถ”๊ณ , ํ…Œ์ŠคํŠธ/์ž„์‹œ ํ™•์ธ์šฉ์œผ๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กssl ์ธ์ฆ ์—๋Ÿฌ๋ฅผ ๋ฌด์‹œํ•˜..

# Spring Boot - POI๋กœ ์—‘์…€ ๋‹ค์šด๋กœ๋“œ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ (maven)

1.pom.xml์— dependency ์ถ”๊ฐ€ org.apache.poi poi 5.2.3 org.apache.poi poi-ooxml 5.2.3 org.apache.commons commons-collections4 4.4 2.DTO ๋งŒ๋“ค๊ธฐ// StudentGradeDTO.javapackage com.example.demo.student.dto;import lombok.Data;@Datapublic class StudentGradeDTO { private String name; private String subject; private double score;} 3.๊ณตํ†ต Excel Export ์œ ํ‹ธ ๋งŒ๋“ค๊ธฐ// ExcelExporter.java..