본문 바로가기

cs(with 매일메일)

[250922월] 일급 컬렉션(패턴)이 무엇인가요?

일급 컬렉션 : 하나의 컬렉션을 감싸는 클래스를 만들고, 해당 클래스에서 컬렉션과 관련된 비즈니스 로직을 관리하는 패턴

 

일급 컬렉션을 사용해야 하는 이유

1) 일급 컬랙션 클래스에 로직을 포함하거나 비즈니스에 특화된 명확한 이름을 부여할 수 있다. 

2) 불필요한 API를 외부로 노출하지 않을 수 있다. 

3) 컬렉션을 변경할 수 없도록 만든다면, 예기치 않은 변경으로부터 데이터를 보호할 수 있다. 

 

일급 컬렉션을 사용할 때

> 이 컬렉션이 특별한 의미와 책임을 가지는가?

 

실무에서 자주 보는 예시:

  • Orders, OrderItems (주문 관련)
  • Products, Categories (상품 관련)
  • Members, Teams (회원/팀 관리)
  • Emails, PhoneNumbers (연락처 관리)
  • LottoNumbers, Cards (게임 로직)

1. 비즈니스 로직이 있는 컬렉션

class Orders {
    private final List<Order> orders;
    
    public Money calculateTotalAmount() {
        return orders.stream()
            .map(Order::getAmount)
            .reduce(Money.ZERO, Money::add);
    }
    
    public Orders filterByStatus(OrderStatus status) {
        // 주문 필터링 로직
    }
}

2. 검증 로직이 필요할 때

class LottoNumbers {
    private final List<Integer> numbers;
    
    public LottoNumbers(List<Integer> numbers) {
        validateSize(numbers);
        validateRange(numbers);
        validateDuplicate(numbers);
        this.numbers = numbers;
    }
    
    private void validateSize(List<Integer> numbers) {
        if (numbers.size() != 6) {
            throw new IllegalArgumentException("로또 번호는 6개여야 합니다");
        }
    }
}