JSON)은 Javascript 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반의 표준 포맷이다.
데이터가 바이트스트림을 통해 전달되면 어떤 타입의 자료형이든 문자열 타입으로 전송된다.
하지만 문자열로 자료가 전송되면 두 가지 문제가 있다.
하나는 문자열로 전송되기 때문에 파싱을 할 수가 없고, 다른 하나는 오브젝트로 변환이 됐다 해도, 다른 언어로 만들어진 오브젝트를 내가 사용하는 언어와 문법이 다르다는 문제가 있다. 이것을 해결하기 위해 JSON 을 사용한다.
JSON 은 영어와 같은 공통어로 모든 프로그램 언어에서 사용할 수 있다. JavaScript 로 전송된 데이터는 JSON 으로 변환된 후 다시 Java 형태로 변환된다.
파싱(parsing) 은 데이터를 분석하고 해석하는 과정이다.
JSON 라이브버리 받기
위의 주소에서 원하는 버전을 선택한다.
Gradle 을 선택 후 아래의 주소를 복사한다. 그리고 아래의 주소도 같이 복사한다.
implementation group: 'org.springframework', name: 'spring-webflux', version: '5.0.2.RELEASE'
인텔리J 의 build.gradle - dependencies 에 붙여넣은 후 오른쪽 상단의 코끼리 그림을 누르면 설치가 완료된다.
JSON 을 활용해 JavaScript 자료 출력하기
위의 사이트를 접속한다. Fake JSON API 란 임의로 개발한 API 에 대해 고정된 응답값을 보내주는 테스트용 API를 의미한다.
사이트의 posts 를 들어가면 여러 데이터가 있는데 그중 userId가 1인 자료 값을 받아보자.
// https://jsonplaceholder.typicode.com/posts/1 { "userId": 1, "id": 1, "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit", "body": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto" }
{} 내부에 있는 자료형이 전송되면 바이트스트림을 타고 문자열로 전송된다.
문자열로 전송되면 내부에 있는 userId 나 id 값을 파싱할 수 없기 때문에 JSON 을 활용한다.
이제 코드를 만들어보자.
URL url = new URL("https://jsonplaceholder.typicode.com/todos/1"); HttpURLConnection conn = (HttpURLConnection) url.openConnection();
new URL 을 통해 주소를 받을 객체를 만든다. openConnection() 은 HTTP 프로토콜이 적용된 서브소켓이고, conn 은 소켓이다.
public class MyApp2 { public static void main(String[] args) { try { URL url = new URL("https://jsonplaceholder.typicode.com/posts/1"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); String download = ""; while (true) { String line = br.readLine(); if (line == null) break; download = download + line; } ObjectMapper om = new ObjectMapper(); Post post = om.readValue(download, Post.class); System.out.println(post.getBody()); } catch (MalformedURLException e) { throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); } } }
버퍼를 통해 데이터를 받고, readLine 을 통해 문자열을 읽는다.
download 은 외부로 부터 받은 문자열을 저장하는 변수다.
ObjectMapper 은 Jackson 라이브러리에서 제공되는 클래스로 JSON 문자열을 변환할 때 사용된다.
ObjectMapper 사용하기 위해서는 문자열을 저장할 오브젝트 클래스가 필요하다.
public class Post { int userId ; int id ; String title ; String body ; public int getUserId() { return userId; } public int getId() { return id; } public String getTitle() { return title; } public String getBody() { return body; } }
커스텀 자료형 클래스를 만들고 값을 출력하기 위한 getter까지 만들었다.
ObjectMapper 를 사용하기 위해선 커스텀 클래스에 디폴트 생성자가 반드시 필요하다.
지금은 매개변수가 있는 생성자가 없기 때문에 생성자를 만들지 않아도 자동으로 적용된다.
이제 전송된 데이터 문자열을 post.getBody() 같은 getter 를 통해 출력받을 수 있고 toStirng 값으로 출력할 수도 있다.
Share article