티스토리 뷰
자바에서 데이터를 핸들링하기 위해서는 객체화를 해주는게 편하다. 하지만 네이티브나 프론트엔드에서 원하는대로 데이터가 넘어오는 경우는 드물다.
물론 연동규격서가 서로 오고가는 정규 개발에서는 요청하는대로 보내주기는 하지만, 모든 상황이 그렇지 못하다보니 객체화를 편하게 하기 위한 방법이 필요하다.
다행히 자바에서는 ObjectMapper라는 클래스가 있다. JSON 처리를 위한 라이브러리인 Jackson의 일부이지만, 정말 널리 사용되고 있다.
이 ObjectMapper의 사용법 일부를 소개해 보고자 한다.
1. 설치
Jacskon 라이브러리의 일부이므로 Jackson을 설치한다.
pom.xml과 gradle 설치 방법
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.11.2</version>
</dependency>
OR
implementation 'com.fasterxml.jackson.core:jackson-databind:2.11.2'
2. 사용법
2-1. Object to JSON
- writeValueAsString(Object value) : 객체를 문자열로 변환
ObjectMapper mapper = new ObjectMapper();
YourJavaObject obj = new YourJavaObject();
// populate the object
String json = mapper.writeValueAsString(obj);
2-2. JSON to Object
- readValue(String content, Class valueType) : JSON 문자열을 객체로 변환
ObjectMapper mapper = new ObjectMapper();
String json = "{\"field1\":\"value1\",\"field2\":123}";
YourJavaObject obj = mapper.readValue(json, YourJavaObject.class);
2-3. JSONArray to Java List
- readValue에 TypeReference 객체에 데이터를 추가해 사용(<> 안에 별도의 객체이름을 써넣지 않아도 매핑이 된다.)
String jsonArray =
"[{ \"color\" : \"Black\", \"type\" : \"BMW\" }, { \"color\" : \"Red\", \"type\" : \"FIAT\" }]";
List<YourJavaObject> listCar = objectMapper.readValue(jsonArray, new TypeReference<List<YourJavaObject>>(){});
2-4. JSON to JavaMap
String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
Map<String, YourJavaObject> map
= objectMapper.readValue(json, new TypeReference<>(){});
3. 성능 이슈
ObjectMapper는 많은 양의 데이터로 작업하거나 트래픽이 많은 환경에서 작업할 경우 성능 이슈에 유의해야한다.
왜냐하면, ObjectMapper는 자바 리플렉션을 사용하여 JSON 데이터를 JAVA 객체에 매핑하기 때문이다.(일반적으로 자바의 리플렉션은 서버의 리소스를 과도하게 사용한다.)
또한 ObjectMapper는 역직렬화할 때마다 새 인스턴스를 생성하므로 많은 객체를 역직렬화하는 경우 상당한 오버헤드가 발생할 수 있다.
떄문에 단순 JSON Parsing을 위해서는 Gson과 같은 성능에 최적화된 라이브러리를 사용하는 것이 권장되니 구현에 있어서 반드시 참고해야한다.
4. 마치며
String을 JSON 형태로 변환해주는 라이브러리는 많지만 바로 객체로 매핑해 주기 때문에 단순하게 사용하기 쉽지만, 무분별하게 사용하면 안되는 대표적인 라이브러리이다. 사용하게 된다면 스트레스 테스트를 반드시 실행해주자.
'개발 > JAVA' 카테고리의 다른 글
[JAVA] 함수형 인터페이스 (1) | 2023.01.26 |
---|---|
[JAVA] TemporalAdjusters (0) | 2023.01.26 |
[JAVA] Thread Safety (0) | 2023.01.21 |
[JAVA] 난수 생성기 Random, SecureRandom (0) | 2022.12.27 |
[JAVA] HttpURLConnection, HttpClient, okHttp (0) | 2022.12.18 |
- Total
- Today
- Yesterday
- cache
- java
- springboot
- 티스토리챌린지
- Log
- S3
- OpenAI
- elasticsearch
- 오블완
- lambda
- JWT
- 람다
- ChatGPT
- 스프링부트
- Kotlin
- AWS EC2
- AOP
- terraform
- openAI API
- OpenFeign
- GIT
- Spring
- MySQL
- 후쿠오카
- EKS
- AWS
- Elastic cloud
- serverless
- docker
- CloudFront
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |