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