interface NaverShoppingItem { title: string link: string image: string lprice: string hprice: string mallName: string productId: string brand: string category1: string category2: string category3: string category4: string } interface NaverShoppingResponse { lastBuildDate: string total: number start: number display: number items: NaverShoppingItem[] } export default defineEventHandler(async (event) => { const config = useRuntimeConfig() const body = await readBody(event) const { itemName } = body as { itemName: string; salePrice: number } if (!itemName?.trim()) { throw createError({ statusCode: 400, message: '장비명이 필요합니다' }) } const clientId = config.naverClientId as string const clientSecret = config.naverClientSecret as string if (!clientId || !clientSecret) { throw createError({ statusCode: 500, message: '네이버 API 인증 정보가 설정되지 않았습니다' }) } const url = new URL('https://openapi.naver.com/v1/search/shop.json') url.searchParams.set('query', itemName) url.searchParams.set('display', '10') url.searchParams.set('sort', 'asc') // 가격 오름차순 (최저가 먼저) url.searchParams.set('exclude', 'used:rental') // 중고·렌탈 제외 → 신품 기준 const response = await fetch(url.toString(), { headers: { 'X-Naver-Client-Id': clientId, 'X-Naver-Client-Secret': clientSecret } }) if (!response.ok) { const text = await response.text() throw createError({ statusCode: response.status, message: `네이버 쇼핑 API 오류: ${text}` }) } const data = await response.json() as NaverShoppingResponse return data })