개발새발/Spring

220224_스프링 입문_스프링을 조금 더 들여다보기_ObjectMapper 실무 사례 알아보기_패스트캠퍼스 챌린지 32일차

막동이아빠 2022. 2. 24. 22:30

220224_스프링 입문_스프링을 조금 더 들여다보기_ObjectMapper 실무 사례 알아보기_패스트캠퍼스 챌린지 32일차

<2022년 02월 24일 _ 패스트캠퍼스 챌린지 32일차>

[스프링 입문_스프링을 조금 더 들여다보기_ObjectMapper 실무 사례 알아보기]

1. 실습

 (1) File > New > Project > Gradle > Java 체크 > Next 클릭

 (2) Name: object_mapper > Finish 클릭

 (3) Maven Repository 에서 Jackson Databind 디펜던시 가져오기

https://mvnrepository.com/

 -> object mapper 검색 > Jackson Databind 선택 > 2.12.1 버전 선택

 -> Gradle 선택 > 텍스트 박스 내용 복사 > build.gardle 의 dependencies에 해당 내용 붙여넣기

 -> 우측 상단 새로고침 클릭 > 온라인을 통해 자동으로 jackson-databind를 가져온다

 

 (4) src > main > java 에 Main 클래스 추가

public class Main {

    public static void main(String args[]){
        System.out.println("main");
    }
}

 

 (5) object_mapper 최상단 경로에 sample.json 추가

{
  "name" : "홍길동",
  "age" : 10,
  "cars" : [
    {
      "name" : "K5",
      "car_number" : "11가 1111",
      "TYPE" : "SEDAN"
    },
    {
      "name" : "Seltos",
      "car_number" : "22가 2222",
      "TYPE" : ""
    },

  ]
}

 

 (6) main > java > dto 패키지 추가 > User, Car 클래스 추가

package dto;

public class Car {
    private String name;
    private String carNumber;
    private String type;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCarNumber() {
        return carNumber;
    }

    public void setCarNumber(String carNumber) {
        this.carNumber = carNumber;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", carNumber='" + carNumber + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}
package dto;

import java.util.List;

public class User {
    private String name;
    private int age;
    private List<Car> cars;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<Car> getCars() {
        return cars;
    }

    public void setCars(List<Car> cars) {
        this.cars = cars;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", cars=" + cars +
                '}';
    }
}

 

 (7) object mapper 를 통해 객체를 만들고 출력해봅시다 > Main 클래스 추가 작성

import com.fasterxml.jackson.databind.ObjectMapper;
import dto.Car;
import dto.User;

import java.util.Arrays;
import java.util.List;

public class Main {

    public static void main(String args[]){
        System.out.println("main");

        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User();
        user.setName("홍길동");
        user.setAge(10);

        Car car1 = new Car();
        car1.setName("K5");
        car1.setCarNumber("11가 1111");
        car1.setType("sedan");

        Car car2 = new Car();
        car2.setName("Seltos");
        car2.setCarNumber("22가 2222");
        car2.setType("SUV");

        List<Car> carList = Arrays.asList(car1, car2);
        user.setCars(carList);

        System.out.println(user);
    }
}

결과:

C:\Users\user\IdeaProjects\object_mapper\src\main\java\Main.java:16: error: unmappable character (0xED) for encoding x-windows-949
        user.setName("?��길동");
                      ^

위와 같은 오류 발생 : Windows 에서만! encoding 세팅을 바꿔줘야합니다~

 File > Settings > Editor > File Encodings > Project Encoding 을 UTF-8로 변경

  , 하단의 Default encoding for properties files : 또한 UTF-8 로 변경 > Apply > OK

 Help > Find Action > edit custom vm options 검색 >

-Dfile.encoding=UTF-8
-Dconsole.encoding=UTF-8

 

 최 하단에 추가 후 인텔리제이 재시작 후 메인 재 실행

결과:

> Task :Main.main()
main
User{name='�솉湲몃룞', age=10, cars=[Car{name='K5', carNumber='11媛� 1111', type='sedan'}, Car{name='Seltos', carNumber='22媛� 2222', type='SUV'}]}

 

: 아무리 인코딩 설정을 해도 한글이 깨진다... 차차 알아봐야할듯...

 

 (8) Main 문 변경 및 실행

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import dto.Car;
import dto.User;

import java.util.Arrays;
import java.util.List;

public class Main {

    public static void main(String args[]) throws JsonProcessingException {
        System.out.println("main");

        ObjectMapper objectMapper = new ObjectMapper();

        User user = new User();
        user.setName("홍길동");
        user.setAge(10);

        Car car1 = new Car();
        car1.setName("K5");
        car1.setCarNumber("11가 1111");
        car1.setType("sedan");

        Car car2 = new Car();
        car2.setName("Seltos");
        car2.setCarNumber("22가 2222");
        car2.setType("SUV");

        List<Car> carList = Arrays.asList(car1, car2);
        user.setCars(carList);

        //System.out.println(user);

        String json = objectMapper.writeValueAsString(user);
        System.out.println(json);
    }
}

결과:

> Task :Main.main()
main
{"name":"홍길동","age":10,"cars":[{"name":"K5","carNumber":"11가 1111","type":"sedan"},{"name":"Seltos","carNumber":"22가 2222","type":"SUV"}]}

 

Json 형식이 옆으로 길어져서 보기 어렵기 때문에 json validator를 사용해봅시다

 

 (9) json validator 

json 형식에 대한 정합성을 판단해 준다

https://jsonformatter.curiousconcept.com/

 

JSON Formatter & Validator

Format and validate JSON data so that it can easily be read by human beings.

jsonformatter.curiousconcept.com

 

 (10) Car에 Json 변수명을 설정하자 @JsonProperty 사용

package dto;

import com.fasterxml.jackson.annotation.JsonProperty;

public class Car {
    private String name;

    @JsonProperty("car_number")
    private String carNumber;

    @JsonProperty("TYPE")
    private String type;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCarNumber() {
        return carNumber;
    }

    public void setCarNumber(String carNumber) {
        this.carNumber = carNumber;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    @Override
    public String toString() {
        return "Car{" +
                "name='" + name + '\'' +
                ", carNumber='" + carNumber + '\'' +
                ", type='" + type + '\'' +
                '}';
    }
}

결과:

{
   "name":"홍길동",
   "age":10,
   "cars":[
      {
         "name":"K5",
         "car_number":"11가 1111",
         "TYPE":"sedan"
      },
      {
         "name":"Seltos",
         "car_number":"22가 2222",
         "TYPE":"SUV"
      }
   ]
}

 

 

 (11) JsonNode 를 활용해 json 의 노드를 읽어와봅시다

Main 문에 추가:

JsonNode jsonNode = objectMapper.readTree(json);
String _name = jsonNode.get("name").asText();
Integer _age = jsonNode.get("age").asInt();
System.out.println("name : " + _name);
System.out.println("age : " + _age);

결과:

name : 홍길동
age : 10

 

 (12) Main 문에 추가:

String _cars = jsonNode.get("cars").asText();
System.out.println(_cars);

결과:

아무것도 없음

 

그렇다면 리스트 형식은 어떻게 가져와야 할까?

 cars는 결국 json의 새로운 node와 마찬가지이다. 

 

 (13) ArrayNode로의 접근

 Main문에 추가/변경:

/*String _cars = jsonNode.get("cars").asText();
System.out.println(_cars);*/

JsonNode cars = jsonNode.get("cars");
ArrayNode arrayNode = (ArrayNode) cars;

List<Car> _cars = objectMapper.convertValue(arrayNode, new TypeReference<List<Car>>() {});
System.out.println(_cars);

결과:

[
   "Car"{
      "name=""K5",
      "carNumber=""11가 1111",
      "type=""sedan"
   },
   "Car"{
      "name=""Seltos",
      "carNumber=""22가 2222",
      "type=""SUV"
   }
]

 

Json Node에서는 값을 변경하는 것이 막혀있다. 그렇다면 어떻게 node의 값을 바꿀 수 있을까?

 (14) ObjectNode 를 사용해 json의 node 값 바꿔보기

 Main문에 추가/변경:

ObjectNode objectNode = (ObjectNode) jsonNode;
objectNode.put("name", "steve");
objectNode.put("age", 20);

System.out.println(objectNode.toPrettyString());

최종 결과:

{"name":"홍길동","age":10,"cars":[{"name":"K5","car_number":"11가 1111","TYPE":"sedan"},{"name":"Seltos","car_number":"22가 2222","TYPE":"SUV"}]}
name : 홍길동
age : 10
[Car{name='K5', carNumber='11가 1111', type='sedan'}, Car{name='Seltos', carNumber='22가 2222', type='SUV'}]
{
  "name" : "steve",
  "age" : 20,
  "cars" : [ {
    "name" : "K5",
    "car_number" : "11가 1111",
    "TYPE" : "sedan"
  }, {
    "name" : "Seltos",
    "car_number" : "22가 2222",
    "TYPE" : "SUV"
  } ]
}

 

: name이 홍길동에서 steve로, age가 10에서 20으로 변경된 것을 확인할 수 있다.

 

32일차 강의 완료~

필기 & 내 화면 스크린샷 저장

 

 

https://bit.ly/37BpXiC

 

패스트캠퍼스 [직장인 실무교육]

프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.

fastcampus.co.kr

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.