728x90
반응형
일급 컬렉션(First-Class Collection)
- 하나의 컬렉션을 감싸는 클래스를 만들고, 해당 클래스에서 컬렉션과 관련된 비즈니스 로직을 관리하는 패턴
아래 코드 중에서 Order의 List 자료구조를 감싼 Orders가 일급 컬렉션의 예시입니다.
- 컬렉션을 Wrapping 하면서, 그 외 다른 멤버 변수가 없는 상태
// 일급 컬렉션
public class Orders {
private final List<Order> orders;
public Orders(List<Order> orders) {
validate(orders); // 검증 수행
...
}
public void add(Order order) {
if (order == null) {
throw new IllegalArgumentException("Order cannot be null");
}
orders.add(order);
}
public List<Order> getAll() {
return Collections.unmodifiableList(orders);
}
public double getTotalAmount() {
return orders.stream()
.mapToDouble(Order::getAmount)
.sum();
}
}
public class OrderService {
private final Orders orders = new Orders();
public void addOrder(Order order) {
orders.add(order);
}
public Orders getOrders() {
return orders;
}
// 추가 비즈니스 로직...
}
장점
- 일급 컬렉션 클래스에 로직을 포함하거나 비즈니스에 특화된 명확한 이름을 부여할 수 있다.
- 불필요한 컬렉션 API를 외부로 노출하지 않도록 할 수 있다.
- 컬렉션을 변경할 수 없도록 만든다면 예기치 않은 변경으로부터 데이터를 보호할 수 있다.
- final 은 재할당을 금지하는 것이며, 불변을 보장하지 않는다.
예시
// 사용 X
Map<String, String> map = new HashMap<>();
map.put("1", "A");
map.put("2", "B");
map.put("3", "C");
// 일급 컬렉션 사용 후 (Wrapping 진행)
public class GameRanking {
private Map<String, String> ranks;
public GameRanking(Map<String, String> ranks) {
this.ranks = ranks;
}
}
728x90
반응형
'Back-End' 카테고리의 다른 글
JPA ID 생성 전략 (0) | 2025.03.12 |
---|---|
로그와 메트릭 (0) | 2025.03.11 |
엔티티 매니저 (0) | 2025.03.04 |
JPA의 ddl-auto 옵션은 각각 어떤 동작을 하고 어떤 상황에서 사용해야 하는지 (0) | 2025.02.28 |
Spring Data JPA에서 새로운 Entity인지 판단하는 방법 (1) | 2025.02.28 |
댓글