티스토리 뷰
의역/오역이 있을 수 있고 잘못된 부분이 다수 존재할 수 있습니다
요약
1. JSON을 파싱함
2. 기본 생성자를 이용해 반환할 객체(Object)를 생성한다
3. 키값을 기준으로 반복문을 돈다
3-1. 객체에서 getter 또는 setter를 통해 얻은 프로퍼티들 중 키값의 이름이랑 같은거를 찾음
3-2. 리플렉션을 이용해 빈 객체에 값을 채워넣는다
3-3. 반복
4. 결과(Object) 리턴
# Jackson
- the Java Json Library / the best JSON parser for Java
- 스프링 부트에서 기본적으로 내장하고 있음
# ObjectMapper
- com.fasterxml.jackson.databind
- POJO <--> JSON 변환하는 역할 수행
MyValue value = mapper.readValue(new File("data.json"), MyValue.class);
// or:
value = mapper.readValue(new URL("http://some.com/api/entry.json"), MyValue.class);
// or:
value = mapper.readValue("{\"name\":\"Bob\", \"age\":13}", MyValue.class);
mapper.writeValue(new File("result.json"), myResultObject);
// or:
byte[] jsonBytes = mapper.writeValueAsBytes(myResultObject);
// or:
String jsonString = mapper.writeValueAsString(myResultObject);
- 특징으로는 신기하게도 DTO에 "getter" 만 있어도 바인딩이 된다는 것이다 ("setter" 없어도 된다)
- getter/setter가 둘 다 필요했던 ModelAttribute와 차이!!
대체 어떻게 이게 가능할까?? 리플렉션을 이용한다고 하는데 직접 찾아보고 싶어서 공식 문서를 한참동안 찾아봤는데 공식 문서로는 잘 알 수가 없었다.
그래서 할까말까 진짜 고민 많이했는데 안하기는 또 아쉬워서 직접 코드를 일일히 뒤져보기로...한다......
시간이......정말 많이 걸렸다..........
# 코드 뜯어보기
1. Json 데이터를 역직렬화 해줄 Root Deserializer 를 찾는다
2. Deserializer를 통해 Deserialize 한다
저 deser.deserialize() 메서드를 통해 역직렬화를 진행한다.
+ 한단계 더 들어가면 저 Root Deserializer(JsonDeserializer)로서 BeanDeserializer가 들어간다.
(Bean이 Java Bean 할 때 그 Bean을 의미하는 것 같다.)
BeanDeserializer 내부에서는 JSON을 파싱한 다음 키값에 대해 반복문을 돌면서 해당하는 키값과 맞는 프로퍼티를 찾고, 해당 프로퍼티에 값을 채워넣는 방식으로 진행된다.
1. 기본 생성자를 이용해 Object를 생성한다
2. 파싱한 JSON을 반복문을 돌면서 값을 하나씩 채운다
글 다 쓰고 나니 이거 알아서 뭐에 써먹나... 싶긴 한데 나름 좋은 경험 했다 생각하려고 한다..
코드 일일히 뜯어보면서 느낀건데 진짜 이런 라이브러리 어떻게 만들었는지 존경스러울 따름이다..
그리고 특히 인터페이스, 추상클래스 이런것들을 진짜 기똥차게 잘 사용하는 것 같다.
객체지향 냄새 펄펄 풍기고 다형성의 참맛을 제대로 느꼈다.
나도 언젠가 이런거 만들어볼 수 있을까..아마 공부를 한참 해야할 것 같다
<참고>
'웹 > Spring' 카테고리의 다른 글
@RequestBody 공식문서를 읽어보자 + HttpMessageConverter (0) | 2022.11.28 |
---|---|
@ModelAttribute 공식 문서를 읽어보자 (0) | 2022.11.23 |
@WebMvcTest 에서 Spring Security 적용, 401/403 에러 해결하기 - csrf (4) | 2022.11.22 |
스프링 + Thymeleaf로 게시글 비밀번호 기능 구현하기 (0) | 2022.10.29 |
DTO는 대체 어디서 변환하는 것이 좋을까? (2) | 2022.10.27 |