DTO 지가 알아서 필드 순서를 바꾸네 ? how to solve ? => linked hash map 으루~

Yunny.Log ·2022년 8월 12일
0

Spring Boot

목록 보기
75/80
post-thumbnail

내가 설정해둔 dto 의 모습이다.

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TotalDoubleList {
    ToDoDoubleList Project;
    ToDoDoubleList Design;

    ToDoDoubleList Bom;
    ToDoDoubleList Item;

    ToDoDoubleList CRCO;
    ToDoDoubleList Release;
    ToDoDoubleList Document;
}
  • 디자인님께서 제시해주신 모듈 순서를 맞추기 위해서 순서를 맞췄다.
  • Project ~ Document 순으로 말이지
  • (아래는 디자인 순서)
  • 그리고 서비스단에서는 해당 필드에 맞게 값 채워서 주지

    public TotalDoubleList readTotalTodo(){

        TotalDoubleList total = new TotalDoubleList(

                readProjectTodo(),
                readDesignTodo(),

                readBomTodo(),
                readItemTodo(),

                readCrCoTodo(),
                readRELEASETodo(),
                readDOCUMENTTodo()
        );

        return total;
    }

  • 근데 json response 확인해보면?
         "release": {
                "lists": [
                    {
                        "category": "New First Release",
                        "toDoList": []
                    },
                    {
                        "category": "New CO Release",
                        "toDoList": []
                    },
                    {
                        "category": "Save as Draft",
                        "toDoList": []
                    },
                    {
                        "category": "Rejected Release",
                        "toDoList": []
                    },
                    {
                        "category": "Waiting Review",
                        "toDoList": []
                    }
                ]
            },
            "document": {
                "lists": [
                    {
                        "category": "Save as Draft",
                        "toDoList": []
                    },
                    {
                        "category": "Rejected Document",
                        "toDoList": []
                    },
                    {
                        "category": "Waiting Review",
                        "toDoList": []
                    }
                ]
            },
            "design": {
                "lists": [
                    {
                        "category": "Save as Draft",
                        "toDoList": []
                    },
                    {
                        "category": "New Design",
                        "toDoList": []
                    },
                    {
                        "category": "Rejected Design",
                        "toDoList": []
                    },
                    {
                        "category": "Waiting Review",
                        "toDoList": []
                    }
                ]
            },
            "project": {
                "lists": [
                    {
                        "category": "Save as Draft",
                        "toDoList": [
                            {
                                "id": 1804,
                                "name": "111 project ",
                                "type": "양산개발",
                                "number": "M-2022-0808144651",
                                "reviseId": -1
                            }
                        ]
                    }
                ]
            },
            "bom": {
                "lists": [
                    {
                        "category": "Save as Draft",
                        "toDoList": []
                    },
                    {
                        "category": "Add New Bom",
                        "toDoList": []
                    },
                    {
                        "category": "Rejected Bom",
                        "toDoList": []
                    },
                    {
                        "category": "Waiting Review",
                        "toDoList": []
                    }
                ]
            },
            "item": {
                "lists": [
                    {
                        "category": "Save as Draft",
                        "toDoList": []
                    },
                    {
                        "category": "Rejected Item",
                        "toDoList": []
                    },
                    {
                        "category": "Need Revise",
                        "toDoList": []
                    },
                    {
                        "category": "Waiting Review",
                        "toDoList": [
                            {
                                "id": 421,
                                "name": "강아지444",
                                "type": "프로덕트제품",
                                "number": "24000251",
                                "reviseId": -1
                            },
                            {
                                "id": 422,
                                "name": "강아지444",
                                "type": "프로덕트제품",
                                "number": "24000829",
                                "reviseId": -1
                            },
                            {
                                "id": 423,
                                "name": "강아지444",
                                "type": "프로덕트제품",
                                "number": "24000513",
                                "reviseId": -1
                            },
                            {
                                "id": 396,
                                "name": "www ",
                                "type": "프로덕트제품",
                                "number": "24000537",
                                "reviseId": -1
                            }
                        ]
                    }
                ]
            },
            "crco": {
                "lists": [
                    {
                        "category": "Save as Draft CR",
                        "toDoList": []
                    },
                    {
                        "category": "Save as Draft CO",
                        "toDoList": []
                    },
                    {
                        "category": "Rejected CR",
                        "toDoList": []
                    },
                    {
                        "category": "Rejected CO",
                        "toDoList": []
                    },
                    {
                        "category": "Waiting Review CR",
                        "toDoList": []
                    },
                    {
                        "category": "Waiting Review CO",
                        "toDoList": []
                    }
                ]
            }
        }
    }
}
  • 에잉 배은망덕한! 자기가 알아서 순서를 바꿨다 ㅠㅠ Project 부터 와야하는데 갑분 release 가 온 것이다. 허거걱

OK , 그냥 저렇게 키값만 나열해놓으면 순서 보장 X

HashMap ? 순서보장 nono

  • hashmap 은 순서를 보장해주지 않는다. 그럼 순서 보장하는 키 : 값 형태는 어떻게 저장?

순서 보장은 LinkedHashMap 사용 !

  • 아까 DTO 를 그냥 쓰지 않고 바로, LinkedHashMap에 담긴 키와 값을 전달해주는 것으로 코드 수정!
  • 바로 linked hash map 을 돌려주자~

linked hash map 을 반환값으로 설정한 모습


    public Map<String, ToDoDoubleList> readTotalTodo(){

        //TotalDoubleList total = totalMap;
        Map<String, ToDoDoubleList> totalMap= new LinkedHashMap<>();
        totalMap.put("Project", readProjectTodo());
        totalMap.put("Design", readDesignTodo());
        totalMap.put("Bom", readBomTodo());
        totalMap.put("Item", readItemTodo());
        totalMap.put("CR / CO", readCrCoTodo());
        totalMap.put("Release", readRELEASETodo());
        totalMap.put("Document", readDOCUMENTTodo());
        return totalMap;
    }

  • 이렇게 맵이나 리스트 안에다가 데이터를 dto 에 감싸줘야 순서보장이 된다!

참고, 출처

https://stackoverflow.com/questions/16870416/does-the-sequence-of-the-values-matter-in-a-json-object
https://codechacha.com/ko/java-hashmap-with-insertion-order/

0개의 댓글