๐Ÿ“Œ ๋„ค์ด๋ฒ„ ๊ฒ€์ƒ‰ API๋กœ ์ฑ… ์ •๋ณด ๊ฒ€์ƒ‰ํ•˜๊ธฐ (Spring Boot ํ™œ์šฉ)

My Pale Blue Dotยท2025๋…„ 5์›” 14์ผ
0

SPRING BOOT

๋ชฉ๋ก ๋ณด๊ธฐ
28/40
post-thumbnail

๐Ÿ“… 2025-05-14

๐Ÿ“ ํ•™์Šต ๋‚ด์šฉ


1๏ธโƒฃ ๊ฒ€์ƒ‰ API ๊ฐœ์š”

โœ… ๋„ค์ด๋ฒ„ ๊ฒ€์ƒ‰ API๋ž€?

  • ๋‰ด์Šค, ๋ธ”๋กœ๊ทธ, ๋ฐฑ๊ณผ์‚ฌ์ „, ์ฑ…, ์›น๋ฌธ์„œ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ RESTful API๋กœ ์ œ๊ณต
  • XML ๋˜๋Š” JSON ํ˜•์‹์œผ๋กœ ๊ฒฐ๊ณผ ๋ฐ˜ํ™˜
  • ํ•˜๋ฃจ ํ˜ธ์ถœ ํ•œ๋„: 25,000ํšŒ
  • ๋น„๋กœ๊ทธ์ธ ๋ฐฉ์‹ ์˜คํ”ˆ API ํด๋ผ์ด์–ธํŠธ ID์™€ ์‹œํฌ๋ฆฟ์„ HTTP ํ—ค๋”์— ํฌํ•จํ•˜์—ฌ ์ธ์ฆ (OAuth ์ธ์ฆ ๋ถˆํ•„์š”)

โœ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก


2๏ธโƒฃ Controller ์ฝ”๋“œ ๊ตฌํ˜„ (์ฑ… ๊ฒ€์ƒ‰)

package com.example.demo.C05Naver;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.stereotype.Controller;
import org.springframework.util.MultiValueMap;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

@Controller
@Slf4j
@RequestMapping("/naver/search")
public class C02NaverSearchController {

    // ๐Ÿ” ์‹ค์ œ ํ‚ค๋Š” application.yml ๋˜๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•ด์•ผ ์•ˆ์ „
    @Value("${naver.client.id}")
    private String NAVER_CLIENT_ID;

    @Value("${naver.client.secret}")
    private String NAVER_CLIENT_SECRET;

    @GetMapping("/book/{keyword}")
    @ResponseBody
    public void book(@PathVariable("keyword") String keyword){
        log.info("GET/naver/search/book...");

        // 1. ์š”์ฒญ URL ์„ค์ •
        String url = "https://openapi.naver.com/v1/search/book.json?query=" + keyword;

        // 2. ์š”์ฒญ ํ—ค๋” ์„ค์ •
        HttpHeaders header = new HttpHeaders();
        header.add("X-Naver-Client-Id", NAVER_CLIENT_ID);
        header.add("X-Naver-Client-Secret", NAVER_CLIENT_SECRET);

        // 3. HttpEntity ๊ฐ์ฒด ์ƒ์„ฑ
        HttpEntity entity = new HttpEntity<>(header);

        // 4. RestTemplate์œผ๋กœ GET ์š”์ฒญ ์ „์†ก
        RestTemplate rt = new RestTemplate();
        ResponseEntity<String> response = rt.exchange(url, HttpMethod.GET, entity, String.class);

        // 5. ๊ฒฐ๊ณผ ์ถœ๋ ฅ
        System.out.println(response.getBody());
    }
}

๐Ÿ” ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•

  • ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์—์„œ ์ง์ ‘ ํ…Œ์ŠคํŠธ:
    http://localhost:8090/naver/search/book/์˜ค๋ Œ์ง€๋ฏธ๋””์–ด
    

๐Ÿ–ฅ๏ธ ์ฝ˜์†” ์ถœ๋ ฅ ๊ฒฐ๊ณผ (์š”์•ฝ)

{
  "total": 9,
  "items": [
    {
      "title": "์œค์„ฑ์šฐ์˜ ์—ดํ˜ˆ C ํ”„๋กœ๊ทธ๋ž˜๋ฐ (๊ฐœ์ •ํŒ)",
      "author": "์œค์„ฑ์šฐ",
      "publisher": "์˜ค๋ Œ์ง€๋ฏธ๋””์–ด",
      "pubdate": "20101101"
    },
    {
      "title": "์œค์„ฑ์šฐ์˜ ์—ดํ˜ˆ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ",
      "author": "์œค์„ฑ์šฐ",
      "publisher": "์˜ค๋ Œ์ง€๋ฏธ๋””์–ด",
      "pubdate": "20170705"
    }
  ]
}

๐Ÿ“š ์ผ๋ถ€ ๋„์„œ ์ •๋ณด ์š”์•ฝ (Markdown ํ‘œ)

์ œ๋ชฉ์ €์ž์ถœํŒ์‚ฌ์ถœ๊ฐ„์ผ
์œค์„ฑ์šฐ์˜ ์—ดํ˜ˆ C ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œค์„ฑ์šฐ์˜ค๋ Œ์ง€๋ฏธ๋””์–ด2010-11-01
์œค์„ฑ์šฐ์˜ ์—ดํ˜ˆ Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œค์„ฑ์šฐ์˜ค๋ Œ์ง€๋ฏธ๋””์–ด2017-07-05
์œค์„ฑ์šฐ์˜ ์—ดํ˜ˆ ํŒŒ์ด์ฌ ๊ธฐ์ดˆํŽธ์œค์„ฑ์šฐ์˜ค๋ Œ์ง€๋ฏธ๋””์–ด2018-11-20

๐Ÿ”ฅ ์ •๋ฆฌ

  • ๋„ค์ด๋ฒ„ ์ฑ… ๊ฒ€์ƒ‰ API๋Š” ํด๋ผ์ด์–ธํŠธ ID/์‹œํฌ๋ฆฟ๋งŒ์œผ๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ RESTful API
  • Spring Boot์˜ RestTemplate์œผ๋กœ ํ—ค๋”๋ฅผ ์„ค์ •ํ•ด ๊ฐ„๋‹จํžˆ ํ˜ธ์ถœ ๊ฐ€๋Šฅ
  • ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ํŒŒ์‹ฑํ•˜๋ฉด, ์›น์— ๋„์„œ ๋ชฉ๋ก์ด๋‚˜ ์ƒ์„ธ ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Œ

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ


profile
Here, My Pale Blue.๐ŸŒ

0๊ฐœ์˜ ๋Œ“๊ธ€