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 |