Programing/JAVA

Java List<VO> to JsonArray, String, StringBuilder, StringBuffer

리커니 2018. 5. 3.
반응형

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)));
...중략...

 

코드도 매우 간단해 지고 메모리의 사용도 줄었습니다.

 

리펙토링의 장점이 이런 것 같습니다. 시간이 없을 때도 있고, 생각없이 개발 할 떄도 있는데

이런 코드들을 발견해서 클린코드를 만드는 것.

리펙토링 없이 좋은 코드로 개발하기 위해 더 노력해야겠습니다...

반응형

댓글

💲 추천 글