일급 컬렉션은 단일 컬렉션(List, Set 등)을 감싸는 클래스로, 컬렉션과 관련된 비즈니스 로직을 책임지고 관리하는 객체입니다. 아래 코드는 Order의 List 자료구조를 감싼 Orders가 일급 컬렉션의 예시입니다.
public class Orders {
private final List<Order> orders;
public Orders(List<Order> orders) {
validate(orders);
this.orders = new ArrayList<>(orders);
}
public void add(Order order) {
...
}
public double getTotalAmount() {
...
}
public List<Order> getAll() {
return Collections.unmodifiableList(orders);
}
}
왜 일급 컬렉션을 써야 하나요?
응집도를 높인다
- List<Order> 대신 Orders를 쓰면 해당 컬렉션과 관련된 모든 책임이 하나의 클래스에 모이므로 도메인에 가까운 코드 구조를 만들 수 있습니다.
캡슐화
- List를 직접 노출하지 않고 불변 컬렉션으로 반환하여 데이터 보호를 합니다.
- 불필요한 API 사용을 막고, 의도치 않은 변경을 방지합니다.
비즈니스 의미를 표현할 수 있다
- Orders, CartItems, Tags, Comments 등 의미 있는 이름을 부여함으로써 코드의 의도와 도메인을 명확하게 표현할 수 있습니다.
추가 개념
불변 객체
- 일급 컬렉션 내부 컬렉션을 Collections.unmodifiableList()로 노출하는 것은 불변 객체의 한 예입니다.
- 불변 객체는 동시성 문제를 줄이고, 참조로 인한 사이드 이펙트를 줄입니다.
- 불변 객체는 값이 바뀌지 않기에 여러 스레드가 동시에 접근해도 안전하다
- 참조를 공유해도 값이 변하지 않아 사이드 이팩트가 없다
- 불변성과 일급 컬렉션을 같이 사용하면 안정성과 가독성이 높아집니다.
객체지향 원칙 - 단일 책임 원칙(SRP)
- List<Order> 대신 Orders라는 객체로 비즈니스 로직을 포함시키면 컬렉션에 대한 책임이 분리됩니다.
디미터 법칙
- orderService.getOrders().getList().get(0).getSomething() 같은 깊은 체이닝을 줄이고, 일급 컬렉션에 메시지를 보내도록 유도합니다.
- 즉, 내부 구조를 알 필요 없이 메시지만 전달하도록 설계할 수 있습니다.
'CS' 카테고리의 다른 글
| 스프링 빈 생명주기(Bean LifeCycle)가 무엇인가요? (0) | 2025.04.14 |
|---|---|
| 데이터베이스 인덱스에 대해서 설명해주세요 (0) | 2025.04.12 |
| Spring Data JPA에서 새로운 Entity인지 판단하는 방법은 무엇일까요? (0) | 2025.04.08 |
| 스프링 Ioc와 DIP란? (1) | 2025.02.10 |
| 트랜잭션 전파 제어 (0) | 2025.01.27 |