개요
사용자가 작성한 서식을 엑셀로 다운로드하는 부분을 개발하는데,
기존 프로젝트에는 QueryDsl에서 읽어 들일 때 JSON의 각 필드에 JSON_EXTRACT만 사용하여 나온 결과를
String 형식으로 저장 후 해당 문자열에 값이 있는지를 판별하는 식으로 작업되어 있었다.
중복 선택이 가능한 필드의 경우 배열에서 1 값을 찾을 때,
"[1, 2]"라는 문자열 내에 "1"이라는 문자가 있는지 확인하는 방식이다.
해당 방식의 가장 큰 단점은 저장해야 할 값이 10 이상일 때 발생하는데,
0~9 내에서는 문자가 중복되지 않아 기능 상으로는 문제가 없으나 10 이상의 값이 생기면 1을 찾을 때 10이라는 값이 있어도 true를 반환하게 되는 등의 이슈가 발생한다.
프로젝트를 개발하는 과정에서 해당 경우가 실제로 발생하여 기존 코드를 그대로 사용할 수 없어 수정 작업을 진행하였는데,
최초에 데이터베이스에서 값을 가져올 때 형식에 맞춰서 가져온다면 가장 좋겠지만
그러기에는 이미 작성된 코드의 양이 많아서 수정할 시간도 부족하고 사이드 이펙트도 감당이 되지 않았기 때문에
String으로 가져온 필드를 List 형식으로 변환한 후 stream을 통해 값을 찾는 빠른 방식을 채택하였다.
그러는 과정에서 JSON 형식의 String을 List로 변환하는 방법이 구글링 했을 때 생각보다 찾기 어려웠고,
별 거 아닌 작업이지만 추후에 비슷하게 또 시간을 지체할 수 있을 것 같아 포스팅으로 남기기로 결정했다.
코드
Java에서 JSON을 다룰 때에는 주로 org.json 라이브러리를 사용한다. 필자는 20180813 버전을 사용하였다.
// https://mvnrepository.com/artifact/org.json/json
implementation group: 'org.json', name: 'json', version: '20180813'
라이브러리를 설치하고 아래와 같이 코드를 작성한다.
import org.json.JSONArray;
import java.util.List;
public class Test {
public static void main(String[] args) {
String field = "[1, 2, 3, 4, 5]"; // 변환할 문자열
JSONArray jsonArray = new JSONArray(field); // field 값이 null인 경우 NPE
List<Object> list = jsonArray.toList();
int targetValue = 1;
boolean isValueExists = list.stream().anyMatch(o -> o.equals(targetValue));
if (isValueExists) {
System.out.println("JSON 배열에 " + targetValue + " 값이 있습니다.");
} else {
System.out.println("JSON 배열에 " + targetValue + " 값이 없습니다.");
}
}
}
JSONArray를 변환할 String을 담아 생성하고 toList를 통해 List 형식으로 받아온다.
이후 stream의 anyMatch를 사용하여 값이 있는지를 판별할 수 있다.
참고) 아래는 List를 Integer 형식으로 받아오거나, toArray를 통해 int[] 형식으로 변환하여 사용하는 방법이다.
// List
List<Integer> integerList = list.stream()
.map(o -> (Integer) o)
.collect(Collectors.toList());
// int[]
int[] intArray = list.stream()
.mapToInt(o -> (Integer) o)
.toArray();
'Java & Spring' 카테고리의 다른 글
[JAVA] LocalDate로 한국식 월 주차 구하기 (6) | 2023.07.27 |
---|---|
[JAVA] Calendar로 한국식 월 주차 구하기 (0) | 2023.07.24 |
[JAVA] Lombok Builder, SuperBuilder와 Generic 사용하기 (0) | 2023.07.21 |
[JAVA] poi에서 SXSSFWorkbook 사용 시 NullPointerException이 발생하는 경우 (0) | 2023.04.28 |
[JAVA] poi에서 엑셀을 다룰 때 발생하는 여러가지 오류 (1) | 2023.04.05 |