티스토리 뷰

 

요약

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을 반복문을 돌면서 값을 하나씩 채운다

FieldProperty - set() 메서드를 통해 필드에 값을 채워넣는다!!!!

 


글 다 쓰고 나니 이거 알아서 뭐에 써먹나... 싶긴 한데 나름 좋은 경험 했다 생각하려고 한다..

코드 일일히 뜯어보면서 느낀건데 진짜 이런 라이브러리 어떻게 만들었는지 존경스러울 따름이다..

그리고 특히 인터페이스, 추상클래스 이런것들을 진짜 기똥차게 잘 사용하는 것 같다.

객체지향 냄새 펄펄 풍기고 다형성의 참맛을 제대로 느꼈다.

 

나도 언젠가 이런거 만들어볼 수 있을까..아마 공부를 한참 해야할 것 같다

 

 

<참고>

 

GitHub - FasterXML/jackson-databind: General data-binding package for Jackson (2.x): works on streaming API (core) implementatio

General data-binding package for Jackson (2.x): works on streaming API (core) implementation(s) - GitHub - FasterXML/jackson-databind: General data-binding package for Jackson (2.x): works on strea...

github.com

 

ObjectMapper는 Property를 어떻게 찾을까 ?

최근에 Restful API 에 POST Method로 요청 시에 Body의 Json을 requestDto로 매핑하는데 있어서 @Setter가 필요없다는 것을 알게 되었다.

bactoria.github.io

 

@RequestBody 모델에 기본생성자, setter/getter가 필요한가?

서론 최근에 Entity 모델의 속성의 성격을 잘 생각해보고 불변해야 하는 것들은 final로 선언해 명확하게 하라는 코드리뷰를 받았다. 한번 생성되면 변하면 안되는 것들, 이 속성 없이 생성되면 안

bbbicb.tistory.com

 

@RequestBody에 왜 기본 생성자는 필요하고, Setter는 필요 없을까? #3

이전 글에서는 RestController에서 @RequestBody 바인딩을 Jackson 라이브러리의 ObjectMapper가 하는 것을 확인했습니다.그리고 RequestBody를 생성할 때, DTO가 Property기반이 아니거나 Delegate를 한 상태가 아니라

velog.io

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함