일급 컬렉션이란?
- 컬렉션을 포함한 클래스가 다른 멤버 변수 없이 단 하나의 컬렉션만 멤버 변수로 가지는 것
즉,
- 컬렉션 (Collection) 을 포장하여 그 자체를 하나의 클래스로 만드는 것을 말한다.
- 비즈니스 로직상에서 사용되는
- 데이터에 대한 유효성 검사
- 비즈니스 규칙 적용 등
내부에서
캡슐화하여
관리할 수 있게됨.
일급 컬렉션 예시
public class LottoNumbers {
private final Set<Integer> numbers;
public LottoNumbers(Set<Integer> numbers) {
if (numbers == null || numbers.size() != 6 || !numbers.stream().allMatch(num -> 1<=num && num <= 45)) {
throw new IllegalArgumentException("유효하지 않은 로또 번호입니다.");
}
this.numbers = Collections.unmodifiableSet(new HashSet<>(numbers));
}
// 로또 번호에 대한 추가적인 비즈니스 로직
}
- 클래스안에 하나의 컬렉션을 정의
생성자에서 해당 컬렉션에 대한 검증
생성시 불변을 보장이 가능하다.
상태와 행위를 한 곳에서 관리가능
public class PayGroups {
private List<Pay> pays;
public PayGroups(List<Pay> pays) {
this.pays = pays;
}
public Long getNaverPaySum() {
return pays.stream()
.filter(pay -> PayType.isNaverPay(pay.getPayType()))
.mapToLong(Pay::getAmount)
.sum();
}
}
- 에서 원래같으면 서비스 로직에서 해당 스트림을 수행했겠지만,
- 일급 컬렉션의 경우,
- 상태(결제수단목록)
- 행위(금액합산로직)
을 동시에 관리가 가능해진다.
- 코드의 응집도가 높아진다고 함.
- 일급 컬렉션의 경우,
public class PayGroups {
private List<Pay> pays;
public PayGroups(List<Pay> pays) {
this.pays = pays;
}
public Long getNaverPaySum() {
return getFilteredPays(pay -> PayType.isNaverPay(pay.getPayType()));
}
public Long getKakaoPaySum() {
return getFilteredPays(pay -> PayType.isKakaoPay(pay.getPayType()));
}
private Long getFilteredPays(Predicate<Pay> predicate) {
return pays.stream()
.filter(predicate)
.mapToLong(Pay::getAmount)
.sum();
}
}
- 다른 결제 수단에 대한 합산 로직도 같은 방식으로 추가가 가능함.
- 필요한 경우 람다식으로 사용해 리팩토링이 가능
내 프로젝트상의 일급컬렉션 적용처?
- 솔직히 일급컬렉션의 의미에 부합한지는 모르겠다.
- 회원 목록
- 엔티티내의
- 상품 목록
등에 별도 일급컬렉션을 적용할 수 있을 것 같기도?
근데 무슨 말인지는 알겠는데 언제 어떻게 써야할지에 대해도 고민을 좀 해봐야할 것같다.
- 상품 목록
Uploaded by N2T
'자바 > 일반' 카테고리의 다른 글
Collections.emptyList() vs List.of() (0) | 2024.02.28 |
---|---|
__[Java] UnmodifiableList는 진짜 불변 리스트가 아니다 ( 참고 )__ (0) | 2024.02.24 |
BIGDECIMAL 사용시 주의점 (0) | 2024.02.24 |
[팁] compareTo 기준점 (0) | 2024.02.19 |
final 키워드 사용처 (0) | 2023.11.04 |