ObjectMapper 더 알아보기

gradle + java 프로젝트로 생성한 후, Jackson Databind 라이브러리를 gradle의존성에 추가한다.

지난 강의에서 한 부분까지 리마인드를 해보자.

ObjectMapper Basic

public class User {

    private String name;
    private Integer age;
    private List<Car> cars;
}
//getter, setter, toString 생략
public class Car {
    private String name;
    private String carNumber;
    private String type;
}

이제 메인함수에서 ObjectMapper를 활용하기 위해 인스턴스를 생성한다.

//psvm
ObjectMapper objectMapper = new ObjectMapper();

User user = new User();
user.setName("dboo");
user.setAge(31);

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

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

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

System.out.println(user);

이제 객체 인스턴스를 ObjectMapper를 이용해 json으로 바꿔보자.

String json = objectMapper.writeValueAsString(user);
System.out.println(json);
/*
{"name":"dboo","age":31,"cars":[{"name":"k5","carNumber":"11가 1111","type":"sedan"},{"name":"Q5","carNumber":"22가 2222","type":"SUV"}]}
*/

여기서 만약에 jsonNaming을 특별하게 가져가고 싶다면 dto에 다음과 같이 어노테이션을 붙이는 것 까지는 지난 시간에 돌아보았다.

public class Car {
    private String name;

    @JsonProperty("car_number")
    private String carNumber;

    @JsonProperty("TYPE")
    private String type;
}

Json Node 에 접근하기

이번 시간에 주안점은, json 노드에 어떻게 접근할 것인가에 대해서 이다.

일단 json 구조를 보자.

{
  "name": "dboo",
  "age": 31,
  "cars": [
    {
      "name": "k5",
      "car_number": "11가 1111",
      "TYPE": "sedan"
    },
    {
      "name": "Q5",
      "car_number": "22가 2222",
      "TYPE": "SUV"
    }
  ]
}

이제 노드 접근을 해보자. 일단 최상위 노드에서 name, age는 쉽게 가져올 수 있다.

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

그런데 cars는 다시 하위 노드로 들어가므로 위와 같이 쉽게 가져오지는 못하고 다음과 같이 상위 노드를 가져온 jsonNode에서 다시 노드를 뽑아내야한다.

JsonNode cars = jsonNode.get("cars"); //cars노드
ArrayNode arrayNode = (ArrayNode) cars; //배열이므로 ArrayNode로 형변환
//다시 변수 타입으로 형변환
List<Car> _cars = objectMapper.convertValue(arrayNode, new TypeReference<List<Car>>() {});

System.out.println(_cars);
//[Car{name='k5', carNumber='11가 1111', type='sedan'}, Car{name='Q5', carNumber='22가 2222', type='SUV'}]

Json 값 변경하기

그리고 json의 값을 바꾸려면 다음과 같이한다.

//json 값 바꾸기
ObjectNode objectNode = (ObjectNode) jsonNode;
objectNode.put("name", "부대환");
objectNode.put("age", 20);
System.out.println(objectNode.toPrettyString());

ObjectNode는 json의 값을 바꿀수만 있을 뿐 아니라, toPrettyString메소드로 예쁘게 출력해주기 때문에 사용성이 훌륭한것 같다.

Annotaion정리

4장의 강의를 마무리하면서 4장에서 공부했던 Annotation들을 표로 정리해보자.

Annotation 기능
@SpringBootApplication Spring boot application으로 설정
@Controller View를 제공하는 Controller로 설정
@RestController REST API를 제공하는 Controller로 설정
@RequestMapping URL 주소를 매핑
@GetMapping HTTP GetMethod URL주소를 매핑
@PostMapping HTTP PostMethod URL주소를 매핑
@PutMapping HTTP PutMethod URL주소를 매핑
@DeleteMapping HTTP DeleteMethod URL주소를 매핑
@RequestParam URL Query Parameter를 매핑
@RequestBody HTTP Body를 Parsing 매핑
@Valid POJO Java Class의 검증
@Configuration 1개 이상의 Bean을 등록할 때 사용
@Component 1개의 클래스단위로 등록할 때 사용
@Bean 1개의 외부 Library로부터 생성한 객체를 등록 시 사용
@Autowired DI를 위한 곳에 사용
@Qualifier @Autowired사용 시 bean을 명시적으로 쓸때 사용
@Resource @Autowired + @Qualifier
@Aspect AOP 적용시 사용
@PointCut AOP 적용 지점 설정
@Before AOP 메소드 이전 호출 지정
@After AOP 메소드 호출 이후 예외발생 포함
@Arround AOP 메소드 호출 이전/이후 예외발생 포함
@AfterReturning AOP호출 정상시 실행
@AfterThrowing AOP호출 예외발생시 실행