Inflearn brand logo image

인프런 커뮤니티 질문&답변

고리오영감님의 프로필 이미지
고리오영감

작성한 질문수

Readable Code: 읽기 좋은 코드를 작성하는 사고법

일급 컬렉션

요구사항이 추가 될 때마다 하나의 일급 컬렉션을 재사용 하나요? 아니면 새롭게 만들어주나요?

해결된 질문

작성

·

182

1

  • 학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!

  • 먼저 유사한 질문이 있었는지 검색해 보세요.

  • 서로 예의를 지키며 존중하는 문화를 만들어가요.

     

 안녕하세요 우빈님!

프로젝트를 진행중인데, User 라는 엔티티가 있고, List<User> 를 감싸는 Users 라는 일급 컬렉션을 만들었습니다.



import java.util.Collections;
import java.util.List;
import java.util.Optional;

/**
 *
 * List<User>를 감싸는 일급 컬렉션
 * */
public class Users {

    private final List<User> users;

    private Users(List<User> users) {
        this.users = Collections.unmodifiableList(users);
    }

    public static Users from(List<User> users) {
        return new Users(users);
    }

    public List<User> getUsers() {
        // return new ArrayList<>(users);
        return Collections.unmodifiableList(this.users);
    }

    // 메소드 명으로 hasNotEnoughUsers()? hasNotBothSenderAndReceiver()?
    public boolean hasNotEnoughUsers() {
        return users.size() <= 1;

    }

    public Optional<String> getSlackIdById(Long userId) {
        return users.stream()
                .filter(user -> user.getId().equals(userId))
                .findFirst()
                .map(User::getSlackId);
    }
}

 

현재 사용 용도는 slack 메시지를 보내기 위한 발신자, 수신자의 정보를 가져와서 처리하는 용도인데요.

문득 든 생각이 지금 용도 말고 새로운 용도로 일급 컬렉션을 써야 한다면, 예를 들어 배송 담당자의 정보를 가져와서 처리 하는 용도가 필요해졌고, 일급 컬렉션을 적용해야 한다면, 지금의 Users 일급 컬렉션의 메서드를 추가해서 사용하는 건지, 새롭게 DeliveryStaffUsers 를 만들어서 사용하는건지, 우빈님께서는 어떻게 사용하시는지 궁금합니다.

답변 2

1

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, gotjd9773 님!

저는 먼저 Users에 로직을 넣어놓고, 추후에 Users의 책임이 너무 비대해진다면 그 때 가서 큰 도메인별로 Users를 세분화해볼 것 같아요. (하지만 생각보다 그럴 일이 거의 없긴 한 것 같아요.)

매번 새로운 일급컬렉션을 만드는 것은, 재사용성을 떨어뜨리기 때문인데요. 보통 하나의 도메인 객체 당 하나의 일급컬렉션을 가지도록 하고 있어요.

슬랙 메시지를 보내기 위한 발신자/수신자의 정보를 가공하는 일과 배송 담당자의 정보를 가공하는 일이, 엄연히 서로 다른 도메인인데 같은 Users를 사용해도 되는가, 라는 질문이 들 수도 있을 것 같아요.
저는 서로 다른 도메인이라면 애초에 User라는 도메인 객체 레벨에서부터 나뉘었어야 한다고 생각해요.
현재 User가 어떤 User인지는 제가 알 수 없지만, 슬랙 정보를 가지고 있는 User와 배송 관련된 User를 나누는 형태로 말이죠. (물론 슬랙/배송 정보가 같은 도메인에 속하는 것이 자연스러운 형태일수도 있고요.)

정리하면, 하나의 도메인 객체에는 하나의 일급 컬렉션을 두는 것이 좋아보인다, 입니다.

도움이 되셨기를 바랍니다.
감사합니다. 🙂

감사합니다!

1

안녕하세요, 인프런 AI 인턴입니다.

gotjd9773님이 제기한 질문은 소프트웨어 설계 방법론에서 많이 논의되는 주제입니다: 일급 컬렉션의 재사용과 새로운 생성의 결정입니다.

일급 컬렉션은 해당 컬렉션의 불변성과 메서드를 통해 로직을 구현하는 데 이점이 있으며, 이를 통해 코드의 명확성과 유지보수성을 높일 수 있습니다. 주어진 조건에서 새로운 요구사항들이 추가될 때, 기존의 일급 컬렉션을 확장하여 사용하는 것이 좋은지, 아니면 새로운 일급 컬렉션을 생성하는 것이 좋은지에 대한 논의는 유연하면서도 명확한 설계가 요구됩니다.

고려해야 할 점:

  1. 불변성과 책임: Users 클래스의 책임이 지나치게 많아지지 않도록 합니다. 발신자, 수신자, 배송 담당자 등의 역할이 점점 커질 경우, 이 하나의 클래스가 너무 많은 역할을 하게 되어 책임이 모호해질 수 있습니다. 이 경우 개별 책임을 수행하는 새로운 일급 컬렉션을 만드는 것이 좋습니다.

  2. 확장성 및 유지보수: 만약 동일한 도메인에서 약간의 차이만 있을 경우, 기존 일급 컬렉션을 확장하여 일반화된 기능은 부모 클래스에 두고, 세부 사항은 하위 클래스로 구현하는 방법도 고려해볼 수 있습니다. 그러나 이 경우에도 클래스 간의 명확한 경계를 유지하는 것이 중요합니다.

  3. 의도 파악: 코드를 읽는 다른 개발자가 일급 컬렉션의 용도를 명확히 이해할 수 있도록, 클래스 이름과 메서드 이름을 통해 의도가 뚜렷하게 드러나도록 합니다. 새로운 목적에 맞는 일급 컬렉션을 만들어 클래스 이름이 더 정확한 의미를 전달할 수 있다면 새로운 클래스를 생성하는 것도 좋습니다.

관련하여 아래의 게시물이 도움이 될 것 같습니다:

  1. 클래스를 나누는 이유 및 팁

이 링크에서는 클래스 분리와 통합의 장단점을 잘 설명하고 있으며, 일급 컬렉션을 포함한 여러 설계 패턴에 대해 언급하고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

고리오영감님의 프로필 이미지
고리오영감

작성한 질문수

질문하기