Data Binding 은 JSON data 과 Java POJO 형식의 data 를 서로 변환하는 과정이다. 흔히 mapping 으로 불리기도 하며, 과정을 각각 Deserialization, Serialization 이라고 한다.

여기서 POJO 는 다음의 의미한다.

POJO

Plain Old Java Object 로, 특정 framework 나 기술에 종속되지 않는 순수한 Java object 를 의미. Java 의 기본적인 객체지향 원칙을 따르며, 일반적으로 field, method, getter/setter 로 구성된 간단한 형태의 class 를 의미한다.

Spring 에서, Spring Boot Starter Web 은 Jackson 이라는 library 를 data binding 을 위하여 dependecy 로 사용한다.

JSON to Java POJO

Jackson 은 Deserialization, 즉 JSON 에서 POJO 로 binding 할 때 setter 를 사용하여 변환한다.

좀 더 내부적으로 살펴보면, Jackson 은 JSON 의 field name 과 Java object 의 field name 을 비교하여 자동으로 mapping 을 수행한다. 예를 들어, Jackson 은 idsetId() method 를, firstName 에 대하여는 setFirstName() method 를 call 하는 방식으로 binding 을 수행한다는 것이다.

Jackson 은 이렇게 setter 를 통하여 접근하기 때문에 private field 에 직접적으로 접근하지 않는다.

Java POJO to JSON

이번에는 반대의 과정인 Serialization 이다. Jackson 은 getter 를 사용하여 mapping 을 수행하게 된다.

이렇게 JSON data 는 Jackson 에 의하여 POJO 의 format 으로 변환되어 REST Controller 에게 전달되고, 반대로 JSON data 는 Jackson 에 의하여 REST Controller 의 POJO 로부터 return 된다. 모든 것은 Jackson 에 의하여 자동으로 수행된다.

Jackson Data Binding - Test

우선 위와 같은 구조로 REST Service 를 만들어보자. Development Process 는 다음과 같다.

  1. Student 에 대한 Java POJO class 를 생성
  2. @RestController 을 사용하여 Spring REST Service 를 생성

Student POJO class 는 firstName, lastName 두 개의 field 만으로 구성하고, REST Controller 는 다음과 같이 작성하자.

@RestController  
@RequestMapping("/api")  
public class StudentRestController {  
      
    @GetMapping("/students")  
    List<Student> getStudents() {  
        List<Student> theStudents = new ArrayList<>();  
  
        theStudents.add(new Student("Arne", "Slot"));  
        theStudents.add(new Student("Andy", "Robertson"));  
        theStudents.add(new Student("Mohamed", "Salah"));  
  
        return theStudents;  
    }  
}

이제 Postman 을 통하여 http://localhost:8080/api/students 으로 request 를 보내면 아래와 같이 response 가 된 것을 볼 수 있다.

REST Controller 에서 List<Student> 형태, 즉 POJO format 으로 return 했지만, Jackson 이 JSON 으로 변환시켜서 결과적으로 Client 에는 JSON 형태로 전달된 것을 볼 수 있다.