๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/Java - Spring Boot

[Spring Boot] ๋„ค์ด๋ฒ„ ๋‰ด์Šค API ํ™œ์šฉํ•ด์„œ ํŠน์ • ํ‚ค์›Œ๋“œ ๋‰ด์Šค ํŽ˜์ด์ง€์— ์ถœ๋ ฅํ•˜๊ธฐ

by ITyranno 2023. 10. 28.
728x90
๋ฐ˜์‘ํ˜•

 

 

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์„ธ๊ณ„๋ฅผ ํƒ๊ตฌํ•ฉ์‹œ๋‹ค.

 

 

 

๊ตฌํ˜„ ํ™”๋ฉด

 

 

 

๋„ค์ด๋ฒ„ API๋ฅผ ํ™œ์šฉํ•ด์„œ ๋‰ด์Šค ๋ฐ์ดํ„ฐ๋ฅผ ํŽ˜์ด์ง€์— ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

1. ๋„ค์ด๋ฒ„ ๊ฐœ๋ฐœ์ž์„ผํ„ฐ (NAVER Developers) ์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.

 

๋„ค์ด๋ฒ„ ๊ฐœ๋ฐœ์ž ์„ผํ„ฐ - NAVER Developers

 

NAVER Developers

๋„ค์ด๋ฒ„ ์˜คํ”ˆ API๋“ค์„ ํ™œ์šฉํ•ด ๊ฐœ๋ฐœ์ž๋“ค์ด ๋‹ค์–‘ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก API ๊ฐ€์ด๋“œ์™€ SDK๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ œ๊ณต์ค‘์ธ ์˜คํ”ˆ API์—๋Š” ๋„ค์ด๋ฒ„ ๋กœ๊ทธ์ธ, ๊ฒ€์ƒ‰, ๋‹จ์ถ•URL, ์บก์ฐจ๋ฅผ ๋น„๋กฏ ๊ธฐ๊ณ„๋ฒˆ์—ญ, ์Œ

developers.naver.com

 

 

2. Documents > ์„œ๋น„์Šค API > ๊ฒ€์ƒ‰

 

 

๊ฒ€์ƒ‰ > ๋‰ด์Šค - Search API (naver.com)

 

๊ฒ€์ƒ‰ > ๋‰ด์Šค - Search API

๊ฒ€์ƒ‰ > ๋‰ด์Šค ๋‰ด์Šค ๊ฒ€์ƒ‰ ๊ฐœ์š” ๊ฐœ์š” ๊ฒ€์ƒ‰ API์™€ ๋‰ด์Šค ๊ฒ€์ƒ‰ ๊ฐœ์š” ๊ฒ€์ƒ‰ API๋Š” ๋„ค์ด๋ฒ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋‰ด์Šค, ๋ฐฑ๊ณผ์‚ฌ์ „, ๋ธ”๋กœ๊ทธ, ์‡ผํ•‘, ์˜ํ™”, ์›น ๋ฌธ์„œ, ์ „๋ฌธ์ •๋ณด, ์ง€์‹iN, ์ฑ…, ์นดํŽ˜๊ธ€ ๋“ฑ ๋ถ„์•ผ๋ณ„๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” API

developers.naver.com

 

 

์œ„ ํŽ˜์ด์ง€์—์„œ ์ž์„ธํ•œ API ๋“ฑ๋ก, ํ™œ์šฉ ๋ฐฉ์‹์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋จผ์ € ์˜คํ”ˆ API ์ด์šฉ์„ ์‹ ์ฒญํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋“ฑ๋ก (API ์ด์šฉ์‹ ์ฒญ) ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

 

 

์‚ฌ์šฉ API๋Š” ๊ฒ€์ƒ‰, ๋ฐ์ดํ„ฐ๋žฉ (๊ฒ€์ƒ‰์–ด ํŠธ๋ Œ๋“œ), ๋ฐ์ดํ„ฐ๋žฉ (์‡ผํ•‘์ธ์‚ฌ์ดํŠธ)๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

 

๋น„๋กœ์ธ ์˜คํ”ˆ API ์„œ๋น„์Šค ํ™˜๊ฒฝ์€ http://localhost ์ž…๋ ฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

 

3. ๋‰ด์Šค ๊ตฌํ˜„ ์˜ˆ์ œ

 

๋‰ด์Šค ๊ตฌํ˜„ ์˜ˆ์ œ๋Š” ๋ธ”๋กœ๊ทธ ๊ฒ€์ƒ‰ ์˜ˆ์ œ์™€ ๋™์ผํ•˜๋ฏ€๋กœ, ๋ธ”๋กœ๊ทธ ๊ฒ€์ƒ‰ ์‚ฌ์ดํŠธ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฒ€์ƒ‰ > ๋ธ”๋กœ๊ทธ - Search API (naver.com)

 

๊ฒ€์ƒ‰ > ๋ธ”๋กœ๊ทธ - Search API

๊ฒ€์ƒ‰ > ๋ธ”๋กœ๊ทธ ๋ธ”๋กœ๊ทธ ๊ฒ€์ƒ‰ ๊ฐœ์š” ๊ฐœ์š” ๊ฒ€์ƒ‰ API์™€ ๋ธ”๋กœ๊ทธ ๊ฒ€์ƒ‰ ๊ฐœ์š” ๊ฒ€์ƒ‰ API๋Š” ๋„ค์ด๋ฒ„ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ๋‰ด์Šค, ๋ฐฑ๊ณผ์‚ฌ์ „, ๋ธ”๋กœ๊ทธ, ์‡ผํ•‘, ์˜ํ™”, ์›น ๋ฌธ์„œ, ์ „๋ฌธ์ •๋ณด, ์ง€์‹iN, ์ฑ…, ์นดํŽ˜๊ธ€ ๋“ฑ ๋ถ„์•ผ๋ณ„๋กœ ๋ณผ ์ˆ˜

developers.naver.com

 

JAVA, PHP, Node.js, Python, C# ์ฝ”๋“œ๊ฐ€ ์ œ๊ณต๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

4.  Spring Boot ์˜ˆ์‹œ ์ฝ”๋“œ

 

@Controller
public class NewsController {

    @Autowired
    HttpSession session;

    @GetMapping("media/news")
    public String news(String searchText, Model model) {
        User user = (User) session.getAttribute("user_info");
        if (user != null) {
            int userCoins = user.getCoin();
            model.addAttribute("userCoin", userCoins);
        }

        String clientId = "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ผ์ด์–ธํŠธ ์•„์ด๋””";
        String clientSecret = "์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ";

        String text = null;
        try {
            text = URLEncoder.encode(searchText, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("๊ฒ€์ƒ‰์–ด ์ธ์ฝ”๋”ฉ ์‹คํŒจ", e);
        }

        String apiURL = "https://openapi.naver.com/v1/search/news?query=" + text + "&display=30";
        // String apiURL = "https://openapi.naver.com/v1/search/blog?query=" + text +
        // "&display=30";
        // String apiURL = "https://openapi.naver.com/v1/search/blog.xml?query="+ text;
        // // XML ๊ฒฐ๊ณผ

        Map<String, String> requestHeaders = new HashMap<>();
        requestHeaders.put("X-Naver-Client-Id", clientId);
        requestHeaders.put("X-Naver-Client-Secret", clientSecret);
        String responseBody = get(apiURL, requestHeaders);
        ObjectMapper om = new ObjectMapper(); // ์—ฌ๊ธฐ์„œ 'om'์ด ์„ ์–ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
        Map json = new HashMap<>();
        try {
            json = om.readValue(responseBody, Map.class); // 'om'์„ ์‚ฌ์šฉํ•˜์—ฌ JSON ์‘๋‹ต์„ ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค.
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }

        model.addAttribute("news", json.get("items"));

        return "/media/news";
    }

    private static String get(String apiUrl, Map<String, String> requestHeaders) {
        HttpURLConnection con = connect(apiUrl);
        try {
            con.setRequestMethod("GET");
            for (Map.Entry<String, String> header : requestHeaders.entrySet()) {
                con.setRequestProperty(header.getKey(), header.getValue());
            }

            int responseCode = con.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) { // ์ •์ƒ ํ˜ธ์ถœ
                return readBody(con.getInputStream());
            } else { // ์˜ค๋ฅ˜ ๋ฐœ์ƒ
                return readBody(con.getErrorStream());
            }
        } catch (IOException e) {
            throw new RuntimeException("API ์š”์ฒญ๊ณผ ์‘๋‹ต ์‹คํŒจ", e);
        } finally {
            con.disconnect();
        }
    }

    private static HttpURLConnection connect(String apiUrl) {
        try {
            URL url = new URL(apiUrl);
            return (HttpURLConnection) url.openConnection();
        } catch (MalformedURLException e) {
            throw new RuntimeException("API URL์ด ์ž˜๋ชป๋˜์—ˆ์Šต๋‹ˆ๋‹ค. : " + apiUrl, e);
        } catch (IOException e) {
            throw new RuntimeException("์—ฐ๊ฒฐ์ด ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. : " + apiUrl, e);
        }
    }

    private static String readBody(InputStream body) {
        InputStreamReader streamReader = new InputStreamReader(body);

        try (BufferedReader lineReader = new BufferedReader(streamReader)) {
            StringBuilder responseBody = new StringBuilder();

            String line;
            while ((line = lineReader.readLine()) != null) {
                responseBody.append(line);
            }

            return responseBody.toString();
        } catch (IOException e) {
            throw new RuntimeException("API ์‘๋‹ต์„ ์ฝ๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.", e);
        }
    }
}

 

<a class="word" th:href="@{/media/news?searchText=์ „๊ธฐ์ฐจ}">์ „๊ธฐ์ฐจ ๋‰ด์Šค</a>

 

์œ„์™€ ๊ฐ™์ด ์„ค์ •ํ•˜๋ฉด ์ „๊ธฐ์ฐจ ํ‚ค์›Œ๋“œ ๊ด€๋ จ ๋‰ด์Šค๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

728x90
๋ฐ˜์‘ํ˜•

loading