• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

c. Collection,Map 질문

23.08.14 13:07 작성 23.08.14 13:08 수정 조회수 289

1

Collection.Map의 Good 케이스를 알 수 있을까요?

맵을 사용할 때 맵 안에 맵이 있고 이런 형태를 사용하지 않는게 좋은건지 아니면 따로 dto로 변환해서 사용해야하는건지 구분이 안 가서 질문 드립니다 ! 지정된 scope를 넘나들지 않는다는 것도 이해가 가지 않습니다 ㅠㅠ

조금만 더 쉽게 설명 붙여주시면 감사드리겠습니다!

답변 2

·

답변을 작성해보세요.

1

안녕하세요. 답변이 늦어 죄송합니다.

질문이 여러개 인 것 같아서 <정리, 답변>하는 방식으로 답변하겠습니다.

1. 맵을 사용할 때 맵 안에 맵이 있고 이런 형태를 사용하지 않는 게 좋은지

네 맞습니다. Map은 강력한 기능입니다. 하지만 Map<Long, Map<A, B>> 이런 식으로 코드를 짜는 것은 명백한 안티 패턴입니다. 이렇게 해서 기능은 만들 수 있을지도 모릅니다. 하지만 유지보수가 안 됩니다. Map 사용을 자제해야 한다고 문제 제기하는 자료는 워낙 많으니 여기에 추가로 적지 않겠습니다. 구글에 “클린 코드 map” 정도로만 검색해도 왜 문제가 되는지 해답을 얻으실 수 있을 겁니다.

 

2. Map을 따로 dto로 변환해서 사용해야 하는 건지

네 맞습니다. Map보다 dto로 변환해서 사용하는 것이 훨씬 낫습니다.

 

3. 지정된 scope를 넘나들지 않아야 한다.

흔히 개발에서 말하는 scope은 쉽게 이야기해서 { ... } 처럼 중괄호 처리된 body라고 보시면 되십니다. 따라서 Map은 사용하더라도 scope 밖을 벗어나선 안 된다는 의미입니다. 즉 아래와 같은 코드가 나와선 안 됩니다.

public void doSomething1() {
    Map foobar = new Map();
    doSomething2(foobar); // scope을 벗어나 Map이 다른 scope까지 연장됩니다.
}

public void doSomething2(Map temp) {
    // do something...
}

foobar는 doSomething1 에서만 사용되어야 합니다. 이를 외부에 전달하거나 return 해선 안 됩니다.

이러한 유형의 코드는 가독성을 심히 해칩니다. doSomething2 입장에서는 Map에 들어가 있는 데이터가 무엇인지 파악할 수 없고 이를 파악하기 위해선 doSomething1의 코드로 올라가서 확인해 봐야 합니다. 그래도 그나마 위와 같은 코드면 다행입니다. 어떤 값이 들어가는지 유추는 할 수 있을 테니까요.

public void doSomething1() {
    Map foobar = anotherApiSereverClient.get(...);
    doSomething2(foobar);
}

public void doSomething2(Map temp) {
    // do something...
}

이런 코드였다면, Client 응답인 map에 어떤 값이 들어가는지 파악하기 위해 외부 서버의 API 응답을 확인해 주어야 합니다.

따라서 Map은 사용하지 않는 것이 최선이고, scope을 벗어나지 않도록 유의를 기울이는 것이 차선입니다. 답변이 도움 되셨길 바랍니다.

HOYA님의 프로필

HOYA

질문자

2023.08.21

아하 답변 감사합니다 🙏🙏
그렇다면 이런식으로 작성한 것도 안티패턴일까요?

바쁜 시간 내어주셔서 감사합니당

data class Adto (
    val a: LocalDate,
    val b: Map<LocalDate, Int>,
    val c: Map<LocalDate, Int>,
    val d: List<Bdto>
)

data class ResponseDto (
    val a: Int,
    val b: Adto
)

저는 Map을 사용한다고 하시길래.. 😂 DTO로 감싸지도 않고 모든 코드가 Map으로 처리되는 좀 더 무지막지한 상상을 하고 있었습니다.

차트를 그리기 위한 응답으로 Map을 사용하신 것 같으신데요. 필요한 상황일 것 같기도 하고, DTO의 역할이 크지 않은 상황에서 외부에서 Adto.b, Adto.c에 대한 접근 통제만 제대로 되고 있다면 상관없을 것 같습니다.

단 이것 또한 저의 의견일 뿐이라는 점 상기해 주시길 바랍니다. :)

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.08.15

안녕하세요, 인프런 AI 인턴이에요.

맵(Map)은 데이터의 키(key)와 값(value)을 쌍으로 저장하는 자료구조입니다. 맵 안에 맵이 있는 형태를 사용하는 것은 권장되는 패턴은 아니지만, 특정 상황에 따라 유용할 수 있습니다. 예를 들어, 게시글의 ID를 키로 가지고 해당 게시글의 작성자, 제목, 내용 등을 값으로 가지는 맵을 저장할 수 있습니다.

하지만 중첩된 맵을 사용할 경우 복잡도가 증가하여 코드의 가독성과 유지보수에 어려움을 초래할 수 있습니다. 따라서 가능하다면 중첩된 맵의 대신에 적절한 데이터 전달 객체(DTO)를 생성하고 사용하는 것이 좋습니다. DTO는 논리적으로 관련된 데이터를 묶어서 표현하기 때문에 가독성과 유지보수성을 향상시킬 수 있습니다.

맵을 사용할 때 “지정된 scope를 넘나들지 않는다는 것”은 맵의 특정한 요소에 접근할 때 해당 요소의 범위(scope)를 벗어나지 않는다는 의미입니다. 맵의 요소에 접근하는 방법에는 다양한 메서드와 연산자가 제공되는데, 이를 사용하여 범위를 지정하고 해당 범위 내에서 요소를 조작할 수 있습니다.

더 자세한 설명을 원하신다면 해당 맵의 사용 상황에 대해 구체적으로 알려주시면 더 정확한 답변을 드릴 수 있을 것 같아요. 쉽게 설명이 되지 않는다고 느껴진다면 원하시는 내용을 좀 더 구체적으로 알려주시면 도움을 드릴 수 있을 것 같습니다.

더 도움이 필요하시면 언제든 질문해주세요. 감사합니다.