[API]post 할 때 body 순서를 맞추기 위해 LinkedHashMap과 Gson을 사용했다!

zzarbttoo·2021년 8월 4일
0

Spring/Java

목록 보기
2/5

안녕하세요!(다들 잘 지내셨나요 하하)

post 요청을 하려고 HashMap을 이용해 body를 생성하던 중 문제가 생겨(!)
LinkedHashMap으로 바꾸었던 썰(!)을 써보려고 합니다~

(최대한 비슷한 코드로 재연해볼게유!)


먼저 처음에 짠 body 생성 코드!(절망)


        Map<String, Object> body = new HashMap<String, Object>();

        Map<String, Object> first = new HashMap<String, Object>();
        first.put("first_1", "first_1");
        first.put("first_2", "first_2");

        Map<String, Object> second = new HashMap<String, Object>();
        second.put("second_1", "second_1");
        second.put("second_2", "second_2");


        Map<String, Object> third = new HashMap<String, Object>();
        third.put("third_1", "third_1");
        third.put("third_2", "third_2");

        body.put("first", first);
        body.put("second", second);
        body.put("third", third);

        log.info("body ::: " + body.toString());

        JSONObject jsonBody = new JSONObject(body);
        log.info(jsonBody + "");
   

첫번째는 그냥 습관처럼(!) HashMap을 사용해 body를 만들었어요!

사실 DTO를 이용해서 json으로 파싱해도 되지만 뭔가 이번에 일을 진행한 프로젝트에서 DTO를 사용 안하는 너낌적 너낌..
(쪼랩이여서 뭐가 좋다고 말하긴 잘 모르겠움 뭐가 좋은지는 사람들끼리 박 터지게 싸우더라구여)

고런데 문제가 발생한 것은
결과 순서가 이상한것..?

왼쪽 순서대로 나오기를 기대했지만 오른쪽이 현실..

이는 HashMap은 저장 순서가 없기 때문에 순서가 뒤죽박죽 된 것이더군요!🤦‍♀️

저렇게 주어진 스펙과 다르게 보내면 파싱할 때 에러가 나기 때문에..
순서가 있는 LinkedHashMap을 사용해보았습니다!

        Map<String, Object> body = new LinkedHashMap<String, Object>();

        Map<String, Object> first = new LinkedHashMap<String, Object>();
        first.put("first_1", "first_1");
        first.put("first_2", "first_2");

        Map<String, Object> second = new LinkedHashMap<String, Object>();
        second.put("second_1", "second_1");
        second.put("second_2", "second_2");


        Map<String, Object> third = new LinkedHashMap<String, Object>();
        third.put("third_1", "third_1");
        third.put("third_2", "third_2");

        body.put("first", first);
        body.put("second", second);
        body.put("third", third);

        log.info("body ::: " + body.toString());

        JSONObject jsonBody = new JSONObject(body);
        log.info( "jsonBody ::: " + jsonBody);
        

그리고 실행해보았는데

저장 순서대로 나오지는 않는 것
약간 희망차지긴 했지만 이친구도 몬가 약간 마라맛 절망..?(매콤)

맵 자체는 정렬이 되었는데 json으로 변환될 때
그냥 JSONObject(저는 org.json.simple.JSONObject 사용했어요)을 사용하면
정렬된 문자열로 되지 않는 듯 하더라구요

흠...

그래서 구글 선생님께서(매우 존칭) 제공해주시는 GSON을 이용해
파싱을 진행했어요!

먼저 pom.xml 추가!

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.7</version>
        </dependency>     

그리고 요로코롬 gson을 이용해 파싱을 하면...?

        <!--앞은 똑같아서 생략-->
        Gson gson = new Gson();
        String jsonByGson = gson.toJson(body);
        log.info("gson ::: " + jsonByGson);


뿌듯하게도 예상대로 파싱이 되는 것을 볼 수 있어용!

고럼 이걸 이제 RestTemplate에 잘 태워서 보내면 된답니다..하하

고럼 끝!(급발진)
즐코하세요~

profile
나는야 누워있는 개발머신

0개의 댓글