[Project] ๐ค๏ธ ๋ ์จ์ ๋ง๋ ์ท ์ถ์ฒ ์๋น์ค๋ฅผ ์ํ Gemini API ๋์ ๊ธฐ(with.Spring)
![[Project] ๐ค๏ธ ๋ ์จ์ ๋ง๋ ์ท ์ถ์ฒ ์๋น์ค๋ฅผ ์ํ Gemini API ๋์
๊ธฐ(with.Spring)](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1752993966338%2Fd9ad8be1-e645-47f4-91ba-4f995f94fab2.png&w=3840&q=75)
๐ ๊ธ์ ์ฐ๊ฒ ๋ ์ด์
๋ ์จ์ ๋ฐ๋ผ ์ ์ ํ ์ท์ฐจ๋ฆผ์ ์ถ์ฒํด์ฃผ๋ ์๋น์ค๋ฅผ ๋ง๋ค๊ธฐ ์ํด Google์ Gemini API๋ฅผ ๋์ ํ๊ฒ ๋์์ต๋๋ค. ์ด ๊ณผ์ ์์ API ํค๋ฅผ ๋ฐ๊ธ๋ฐ๋ ์ด๊ธฐ ๋จ๊ณ๋ถํฐ ๊ธฐ์กด๊ณผ ๋ค๋ฅธ UI๋ ๋ฌธ์ ๊ตฌ์กฐ๋ก ์ธํด ํผ๋์ ๊ฒช์์ต๋๋ค.
๊ตฌ๊ธ๋ง์ผ๋ก ์ฐพ์ ์ ๋ณด๋ค์ด ํ์ฌ์ ๋ง์ง ์๊ฑฐ๋ ์๋ต๋ ๊ฒฝ์ฐ๊ฐ ๋ง์, 2025๋
๊ธฐ์ค์ผ๋ก Gemini API๋ฅผ Spring ํ๋ก์ ํธ์ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ณด๊ณ ์ ํฉ๋๋ค.
๐ ์์ ์ ์ด๋ ๊ฒ ๋ณด์๋ค?
๋ง์ ๋ธ๋ก๊ทธ๋ ํํ ๋ฆฌ์ผ์์๋ Create API key in new project ์ต์
์ ํด๋ฆญํด์ ํค๋ฅผ ์ฝ๊ฒ ๋ฐ๊ธ๋ฐ๋ ๋ชจ์ต์ ๋ณด์ฌ์ค๋๋ค. ํ์ง๋ง ์ต๊ทผ์๋ ์ด UI๊ฐ ๋ฐ๋์๊ฑฐ๋, ํค ๋ฐ๊ธ ์ ์ฐจ ์์ฒด๊ฐ ํตํฉ ๋๋ ๋ณ๊ฒฝ๋ ๊ฒ์ผ๋ก ๋ณด์์ต๋๋ค.

๐ API Key ๋ฐ๊ธ & ์ฝ์ง๊ธฐ
๐ 1๋จ๊ณ: ํ๋ก์ ํธ ์ ํ
์์ ์ธ๊ธํ๋ฏ์ด ์์ ์๋ "Create API key in new project" ๋ฒํผ ํ๋๋ฉด ์ฝ๊ฒ ๋๋ฌ๋ ๊ณผ์ ์ด์์ต๋๋ค. ํ์ง๋ง 2025๋ ๊ธฐ์ค์ผ๋ก๋ ๋ ์ด์ ๊ทธ๋ฐ ์ ํ์ง๊ฐ ์์ต๋๋ค. ๋ฐ๋์ ๊ธฐ์กด ํ๋ก์ ํธ ์ค ํ๋๋ฅผ ์ ํํ๊ฑฐ๋, ์ง์ ์ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ํ ์งํํด์ผ ํฉ๋๋ค.


๐ ๏ธ 2๋จ๊ณ: ํ๋ก์ ํธ ๋ง๋ค๊ธฐ & API ์ฌ์ฉ ์ค์
Google Cloud Console์ ์ ์ํฉ๋๋ค.
์๋จ ๋ฉ๋ด์์ ํ๋ก์ ํธ ์ ํ โ ์ ํ๋ก์ ํธ ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
(์ ๋ ์กฐ์ง์ ๋ฐ๋ก ์ ํํ์ง ์๊ณ ๋ง๋ค์์ต๋๋ค.)
์ ํ๋ก์ ํธ๊ฐ ์์ฑ๋๋ฉด, ๊ฒ์์ฐฝ์
Gemini API๋ฅผ ์ ๋ ฅํ์ฌ API๋ฅผ ์ฐพ์์ค๋๋ค.Gemini API ํ์ด์ง์์ โ์ฌ์ฉโ ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
๋ช ๋ถ ๊ธฐ๋ค๋ฆฌ๋ฉด ์ฌ์ฉ ์ค์ ์ด ์๋ฃ๋ฉ๋๋ค.

๐ 3๋จ๊ณ: API ํค ๋ฐ๊ธ
์ผ์ชฝ ๋ฉ๋ด์์
API ๋ฐ ์๋น์คโ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด(Credentials)๋ก ์ด๋ํฉ๋๋ค.์๋จ์
์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด ๋ง๋ค๊ธฐ โ API ํค๋ฅผ ํด๋ฆญํ๋ฉด ๋ฐ๋ก ํค๊ฐ ๋ฐ๊ธ๋ฉ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด Gemini API๋ฅผ ํธ์ถํ ์ ์๋ ํค๋ฅผ ์์ ๋ฃ๊ฒ ๋ฉ๋๋ค.

โ ๏ธ ์ฝ์ง๋ก๊ทธ: 403 Forbidden ์ค๋ฅ ๋ฐ์
์ฒ์์ ๋ฐ๊ธ๋ฐ์ API ํค๋ฅผ ํ๋ก์ ํธ์ ์ ์ฉํ๋ ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ต๋๋ค.
403 Forbidden: "Method doesn't allow unregistered callers (callers without established identity). Please use API Key or other form of API consumer identity to call this API."
์ฒ์์ ์์ฒญ ๋ฐฉ์์ด ์๋ชป๋ ์ค ์๊ณ ์ฝ๋๋ฅผ ์ฌ๋ฌ ๋ฒ ์์ ํ์ง๋ง, ์์ธ์ ์๋ชป๋ API ํค๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ ๊ฒ์ด์์ต๋๋ค.
์ค๋ฅ ์์ธ์ ํด์ํด๋ณด๋ฉด Gemini API ์์ฒญ์ API Key๊ฐ ํฌํจ๋์ง ์์๊ฑฐ๋, ์๋ชป๋ ๋ฐฉ์์ผ๋ก ํฌํจ๋ ๊ฒ์ ๋๋ค.
โ ์ค์ ์์ธ
์ ๋ ์ด๋ฏธ VertexAI๋ ๊ฐ์ ๊ณ์ ์์ ์ฌ์ฉํ๊ณ ์์๋๋ฐ,
๋ฌด์ฌ์ฝ VertexAI์ฉ API ํค๋ฅผ ์ฌ์ฉํด๋ฒ๋ฆฐ ๊ฒ์ด ๋ฌธ์ ์์ต๋๋ค.
์ฆ, Gemini API ํธ์ถ์๋ Gemini API๋ฅผ ํ์ฑํํ ํ๋ก์ ํธ์์ ๋ฐ๊ธ๋ฐ์ API ํค๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
โ ๋ง์ง๋ง ๋จ๊ณ
์ด์ ์๊น Key ๋ฐ๊ธ ๋ฐ๋ ์ฌ์ดํธ์ ๋ค์ด๊ฐ์ ํ๋ก์ ํธ ์ ํ ํ ํค๋ฅผ ๋ฐ๊ธ ๋ฐ์ผ๋ฉด ๋์ ๋๋ค.
Gemini API ์ฌ์ฉ ์ค์ ๋ ํ๋ก์ ํธ ์ ํ

- ๊ฒฐ๊ณผ

์ถ์ฒ
![[Spring] N+1๋ฌธ์ ๋ฐ์๊ณผ ๋ถ์](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1756727965704%2F8c24d83c-1a9e-4b4d-b733-c130243cbc6b.png&w=3840&q=75)

![[Project] ๋ ์จ์ ๋ง๋ ์ท ์ถ์ฒ ์๋น์ค : ์ง๊ทธ์ฌ๊ทธ ํฌ๋กค๋ง ์ฌ์ ๊ธฐ๋ก (1) ChromeDriver๋ฅผ EC2์ ์ค์นํ๊ธฐ](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1753843082352%2Fc2452b33-97a4-4148-8ba4-750e5eee6aff.png&w=3840&q=75)
![[Project] ๋ ์จ์ ๋ง๋ ์ท ์ถ์ฒ ํ๋ก์ ํธ: Selenium์ ์ ๋ง ํ์ํ ์ ํ์ด์์๊น? - ํฌ๋กค๋ง ์ฝ์ง ๊ธฐ๋ก](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1753343114273%2Fb32cc35e-a2e6-4085-a132-26c72f8792d9.png&w=3840&q=75)
![[Spring] @Cacheable, @CachePut, @CacheEvict](/_next/image?url=https%3A%2F%2Fcdn.hashnode.com%2Fres%2Fhashnode%2Fimage%2Fupload%2Fv1749265456525%2F51b97bad-f86e-4f0f-9b33-77eaa733176f.png&w=3840&q=75)