Java List<VO> to JsonArray, String, StringBuilder, StringBuffer
타 업체 API를 걷어내고
새로 구축한 DB 베이스의 API를 개발하는 업무를 맡았을 때의 코드를
리펙토링 하는 도중 이상한 코드가 발견되어 수정하였습니다.
List<VtxVO> rows = null;
JSONArray jarry = new JSONArray();
try{
rows = apiService.getRouteVtx(id);
for(int i=0; i<rows.size(); i++){
JSONObject jobj = new JSONObject();
jobj.put("updown", rows.get(i).getUpdown());
jobj.put("geoX", rows.get(i).getGpsX());
jobj.put("geoY", rows.get(i).getGpsY());
jarry.add(jobj);
}
...중략...
문제의 코드는 List<VO> 형태로 데이터를 받아 JSONArray로 변환하는 코드였는데요,
리스트 형태로 받은 데이터를 for문을 돌며 JSONObject를 만들고 그 것을 JSONArray에 add 하고 있습니다.
이 코드의 문제점은 6번째 라인에서, new명령을 사용해 JSONObject를 생성하는 부분인데
for문 내에서 new 명령어를 사용하게 되면, 사이즈 만큼 Heap 메모리 영역에 객체가 생성되게 됩니다.
이는 Major GC를 발생시키게 되고, 성능상 좋지도 않죠.
for문을 사용하여 String값을 연산하는 것과 같은 것이죠.
[참고]
String객체에 연산을 하게되면 기존 String 객체에 크기가 늘어나는 것이 아니라
새로운 객체를 만들어 연산한 값을 넣는 방식입니다. 이는 연산 과정이 많을 수록 Heap 메모리 부하를 가져오죠.
이를 해결하기 위해 StringBuilder와 StringBuffer를 사용하게 됩니다. 이 둘은 연산 시 객체의 크기를 유동적으로 변경하기 때문에 String 연산의 단점을 해결했습니다. (객체의 크기가 늘어날 때는 기존크기*2)
StringBuilder와 StringBuffer의 차이는 동기화에 있습니다. StringBuffer는 동기화를 제공하는 대신 StringBuilder 보다는 속도가 느리죠. 스레드와 관련이 있다면 StringBuffer를, 없다면 StringBuilder를 사용하는 것을 권장 합니다. 단순 성능 : StringBuilder > StringBuffer >>> String
물론 저런 코드 한 두개가 당장 문제를 발생시키는건 아닙니다. 저런 코딩 습관이 문제가 되는 것이죠..
for문을 제거하고 Gson 을 사용해 코드를 수정하였습니다.
List<VtxVO> rows = null;
Gson gson = new Gson();
JSONParser jsonParser = new JSONParser();
JSONArray jarry = new JSONArray();
try{
rows = apiService.getRouteVtx(id);
jarry = jsonParser.parse(gson.toJson(rows)));
...중략...
코드도 매우 간단해 지고 메모리의 사용도 줄었습니다.
리펙토링의 장점이 이런 것 같습니다. 시간이 없을 때도 있고, 생각없이 개발 할 떄도 있는데
이런 코드들을 발견해서 클린코드를 만드는 것.
리펙토링 없이 좋은 코드로 개발하기 위해 더 노력해야겠습니다...
'Programing > JAVA' 카테고리의 다른 글
Java boxing, unboxing 자바 박싱 언박싱 Wrapper Class 확실히 이해하기 (0) | 2018.06.12 |
---|---|
Java 8 Stream 을 사용해보자. About Stream in collection of java8 (0) | 2018.05.23 |
알기쉽게 정리한 JAVA의 컴파일과정 및 JVM 메모리 구조, JVM GC (0) | 2018.05.02 |
Java 오라클, 티베로, Mysql(MariaDB), Mssql 연동 (0) | 2018.04.06 |
ORA-28040: 일치하는 인증 프로토콜 없음, No matching authentication protocol 해결방법 (0) | 2018.02.22 |
댓글