Part3 - CH5. 스프링 더 알아보기(3) ObjectMapper 더 알아보기
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호출 예외발생시 실행 |