본문 바로가기
개발/Java

API 활용

by BellOne4222 2024. 1. 29.

API 활용


JSON, XML Data Format

  • 구조화된 데이터를 표현하고 전송하기 위한 데이터 형식
  • JSON
    • 경량의 데이터 교환 형식으로 텍스트 기반의 구조화된 데이터를 표현
    • 가독성이 좋고 다양한 프로그래밍 언어와 호환된다.
    • 객체
      • JSON 객체는 중괄호로 묶인 키-값 쌍의 집합
      • 키는 문자열, 값은 JSON 데이터 타입 중 하나
        • 문자열, 숫자, 불리언, 객체, 배열, 널
    • 배열
      • JSON 배열은 대괄호로 묶인 값들의 순서있는 리스트
  • XML

    • eXtensible Markup Language
    • 데이터를 저장하고 전송하기 위한 마크업 언어
    • XML 데이터는 트리 구조로 이루어져 있고, 요소, 속성, 텍스트, 주석 등으로 구성된다.
  • 차이점

    • JSON은 간결한 구조로 인해 가독성이 높고 데이터 크기가 작다.
    • XML은 태그를 사용하여 데이터를 표현하기 때문에 가독성이 상대적으로 낮고 데이터 크기가 크다.

Gson API 활용

public class GsontoJson {
    public static void main(String[] args) {
        Member mvo = new Member("홍길동",30, "bit@empas.com");
        // JSON -> { "name" : "홍길동" , "age" : 30, "email" : "bit@empas.com" }
        //  객체생성
        Gson gson = new Gson();
        // Object(Member) -> JSON
        String json = gson.toJson(mvo); // 객체를 JSON 형식으로 변경
        System.out.println(json); // {"name":"홍길동","age":30,"email":"bit@empas.com"}
    }
}

public class GsonfromJson {
    public static void main(String[] args) {
        String json = "{\"name\":\"홍길동\",\"age\":30,\"email\":\"bit@empas.com\"}";
        // JSON -> Object(Member)
        Gson gson = new Gson();
        Member mvo = gson.fromJson(json, Member.class); // fromJson(문자열, 클래스명) : 문자열을 클래스 객체로 변환
        System.out.println(mvo); // Member{name='홍길동', age=30, email='bit@empas.com'}
    }
}
  • 중첩된 JSON 구조 핸들링
public class GsonMemberAddtoJson {
    public static void main(String[] args) {
        Address address = new Address("서울", "대한민국"); // Address 클래스가 중첩
        Person member = new Person("홍길동", 30, "bit@empas.com", address);

        // Person -> JSON
        Gson gson = new Gson();
        String json = gson.toJson(member);
        System.out.println(json); // {"name":"홍길동","age":30,"email":"bit@empas.com","address":{"city":"서울","country":"대한민국"}}
    }
}

public class GsonMemberAddfromJson {
    public static void main(String[] args) {
        String json = "{\"name\":\"홍길동\",\"age\":30,\"email\":\"bit@empas.com\"," +
            "\"address\":{\"city\":\"서올\",\"country\":\"대한민국\"}}";

        Gson gson = new Gson();
        Person member = gson.fromJson(json, Person.class);
        System.out.println(member); // Person{name='홍길동', age=30, email='bit@empas.com', address=Address{city='서올', country='대한민국'}}
    }
}

Jsoup API

  • HTML 문서를 읽고 파싱하여 웹 크롤링, 웹 스크레이핑, 데이터 추출 등의 작업을 수행할 수 있습니다.
  • HTML 문서에서 원하는 요소를 쉽게 선택하고 조작할 수 있습니다.
public class JsoupExample {
    public static void main(String[] args) {
        String url = "https://sum.su.or.kr:8888/bible/today?base_de=2023-03-20"; // html의 type이 hidden인걸 보고 날짜를 바꾸는 id가 base_de로 설정되있는 것을 확인

        try {
            Document document = Jsoup.connect(url).get(); // url이 정상적이지 않을 수 있으므로 예외처리를 해야함

            Element bibleText = document.getElementById("bible_text");
            Element bibleinfoBox = document.getElementById("bibleinfo_box");

            System.out.println(bibleText.text());
            System.out.println(bibleinfoBox.text());

            Elements num = document.select(".num"); // num앞의 .은 클래스를 나타냄
            Elements info = document.select(".info");

            for (int i = 0; i < num.size(); i++) {
                System.out.println(num.get(i).text() + ":" + info.get(i).text());
            }

            // 여호와의 성민이라
            // 본문 : 신명기(Deuteronomy) 14:1 - 14:21 찬송가 8장
            // 1:너희는 너희 하나님 여호와의 자녀이니 죽은 자를 위하여 자기 몸을 베지 말며 눈썹 사이 이마 위의 털을 밀지 말라
            // 2:너는 네 하나님 여호와의 성민이라 여호와께서 지상 만민 중에서 너를 택하여 자기 기업의 백성으로 삼으셨느니라
            // 3:너는 가증한 것은 무엇이든지 먹지 말라
            // 4:너희가 먹을 만한 짐승은 이러하니 곧 소와 양과 염소와
            // 5:사슴과 노루와 불그스름한 사슴과 산 염소와 볼기가 흰 노루와 뿔이 긴 사슴과 산양들이라
            // 6:짐승 중에 굽이 갈라져 쪽발도 되고 새김질도 하는 모든 것은 너희가 먹을 것이니라
            // 7:다만 새김질을 하거나 굽이 갈라진 짐승 중에도 너희가 먹지 못할 것은 이것이니 곧 낙타와 토끼와 사반, 그것들은 새김질은 하나 굽이 갈라지지 아니하였으니 너희에게 부정하고
            // 8:돼지는 굽은 갈라졌으나 새김질을 못하므로 너희에게 부정하니 너희는 이런 것의 고기를 먹지 말 것이며 그 사체도 만지지 말 것이니라
            // 9:물에 있는 모든 것 중에서 이런 것은 너희가 먹을 것이니 지느러미와 비늘 있는 모든 것은 너희가 먹을 것이요
            // 10:지느러미와 비늘이 없는 모든 것은 너희가 먹지 말지니 이는 너희에게 부정함이니라
            // 11:정한 새는 모두 너희가 먹으려니와
            // 12:이런 것은 먹지 못할지니 곧 독수리와 솔개와 물수리와
            // 13:매와 새매와 매의 종류와
            // 14:까마귀 종류와
            // 15:타조와 타흐마스와 갈매기와 새매 종류와
            // 16:올빼미와 부엉이와 흰 올빼미와
            // 17:당아와 올응과 노자와
            // 18:학과 황새 종류와 대승과 박쥐며
            // 19:또 날기도 하고 기어다니기도 하는 것은 너희에게 부정하니 너희는 먹지 말 것이나
            // 20:정한 새는 모두 너희가 먹을지니라
            // 21:너희는 너희의 하나님 여호와의 성민이라 스스로 죽은 모든 것은 먹지 말 것이나 그것을 성중에 거류하는 객에게 주어 먹게 하거나 이방인에게 파는 것은 가하니라 너는 염소 새끼를 그 어미의 젖에 삶지 말지니라

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

URLConnection 네트워킹

  • HttpURLConnection
    • URLConnection의 하위 클래스로, HTTP 프로토콜을 사용하여 특정 웹 서버와 통신하기 위한 클래스
    • HTTP 메서드(GET, POST, PUT, DELETE, PATCH)를 지원하고, HTTP 요청과 응답을 처리 할 수 있는 메서드를 제공
```java
public class WeatherExample {
    public static void main(String[] args) {
        // OpenWeatherMap API 키
        String apiKey = "a54a36319b90f654c4c8fd41d472693b";

        // 날씨 정보를 요청할 도시
        String city = "Seoul";

        // OpenWeatherMap API에 요청할 URL 생성
        String urlString = "https://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + apiKey + "&units=metric";

        try {
            // 생성된 URL로 URL 객체 생성
            URL url = new URL(urlString);

            // HttpURLConnection을 사용하여 URL에 연결
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();

            // 요청 메소드를 GET으로 설정
            connection.setRequestMethod("GET");

            // 요청 헤더에 Accept 속성을 설정하여 JSON 응답을 기대함을 표시
            connection.setRequestProperty("Accept", "application/json");

            // HTTP 응답 코드 가져오기
            int responseCode = connection.getResponseCode();

            if (responseCode == 200) {
                // 만약 응답 코드가 200(성공)이라면

                // 입력 스트림 연결
                BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                String inputLine;
                StringBuffer content = new StringBuffer();

                // 입력 스트림에서 데이터를 읽어와서 content에 추가
                while ((inputLine = in.readLine()) != null) {
                    content.append(inputLine);
                }
                in.close();

                // content를 출력
                System.out.println("content.toString() = " + content.toString());

                // JSON 문자열을 JsonObject로 파싱
                JsonObject weatherData = JsonParser.parseString(content.toString()).getAsJsonObject();

                // JsonObject에서 "main" 속성의 값을 가져옴
                JsonObject mainData = weatherData.getAsJsonObject("main");

                // "temp" 속성의 값을 double로 가져와서 출력
                double temp = mainData.get("temp").getAsDouble();
                System.out.println("temp = " + temp);

                // 연결 종료
                connection.disconnect();
            } else {
                // 응답 코드가 200이 아니면 오류 처리
                // 오류에 대한 처리 로직을 추가할 수 있음
            }
        } catch (Exception e) {
            // 예외 발생 시 에러 메시지 출력
            e.printStackTrace();
        }
    }
}

/*
API Key 및 요청 정보 설정:

OpenWeatherMap에서 발급받은 API 키(apiKey)를 사용합니다.
날씨 정보를 얻고자 하는 도시(city)를 설정합니다.
API 요청을 위한 URL을 구성합니다.
URL 및 연결 객체 생성:

구성된 URL 문자열을 사용하여 URL 객체를 생성합니다.
URL을 통해 HttpURLConnection 객체를 생성하고, 이를 통해 API에 연결합니다.
HTTP 요청 설정:

HttpURLConnection 객체의 setRequestMethod 메서드를 사용하여 HTTP 요청 메서드를 GET으로 설정합니다.
setRequestProperty 메서드를 사용하여 요청 헤더에 "Accept" 속성을 추가하여 JSON 형식의 응답을 기대함을 표시합니다.
HTTP 응답 코드 확인:

getResponseCode 메서드를 사용하여 서버의 응답 코드를 확인합니다.
응답 처리:

응답 코드가 200(성공)인 경우:
BufferedReader를 사용하여 API 응답 스트림을 읽어오고, StringBuffer에 저장합니다.
JSON 형식의 문자열을 JsonParser를 사용하여 JsonObject로 파싱합니다.
    JsonObject에서 "main" 속성을 가진 하위 객체를 추출합니다.
"temp" 속성의 값을 가져와서 출력합니다.
연결 종료:

API와의 연결을 끊습니다.
오류 처리:

응답 코드가 200이 아닌 경우에는 오류 처리 로직을 추가할 수 있습니다.
예외 처리:

코드 실행 도중 예외가 발생하면 catch 블록에서 예외 메시지를 출력합니다.*/
```

'개발 > Java' 카테고리의 다른 글

Collection Framework API  (1) 2024.01.29
제네릭(Generic)  (0) 2024.01.29
Collection API  (0) 2024.01.29
인터페이스 기반의 프로그래밍  (0) 2024.01.29
자바 String 클래스  (1) 2024.01.29