CollectionUtils.isEmpty ? Optional ?
개발 중에 이런 상황이 있었다.
메서드 파라미터로 List<객체>
를 받는데, 나는 아래와 같이 null 및 empty 를 체크하고 있었다.
if (CollectionUtils.isEmpty(list)) {
return;
}
// 처리 로직
그러던 중, 선임 개발자한테 아래와 같은 피드백을 받은 적이 있다.
"왜 Optional 안 써? Optional 쓰면 더 깔끔하지 않아?"
그래서 궁금해졌다.
Optional을 쓰면 정말 더 좋은 걸까?
✔️ 선임 개발자가 원하는 방향
Optional.ofNullable(list)
.filter(l -> !l.isEmpty())
.ifPresent(l -> {
// 처리 로직
});
null 또는 빈 리스트면 아무것도 안하고,
값이 존재하고 리스트가 비어있지 않으면 로직 수행
✔️ 그런데 정말 Optional이 더 나을까?
1. 가독성이 떨어진다.
if (CollectionUtil.isEmpty(list)) {
return;
}
이 코드 한 줄만으로도
리스트가 없거나 비었으면 리턴한다는 의도가 바로 드러난다.
반면, Optional을 사용하면 이 단순한 조건이 filter, ifPresent 등의 체이닝 안에 숨어버려서
오히려 코드의 흐름을 직관적으로 이해하기 어려워질 수 있다.
2. Optional의 목적은 ‘값이 있을 수도 없음’을 표현하는 것
Optional은 null을 명시적으로 다루기 위해 만들어진 컨테이너다.
보통은 리턴값에서 많이 사용되고, 내부 로직에서 orElse, map, filter 등을 활용해 값을 안전하게 처리할 때 유용하다.
하지만 지금처럼 단순히
null이거나 비어있으면 return 하는 정도의 로직이라면
Optional 체이닝은 오히려 코드가 과하게 포장되어 보일 수 있다.
단순한 조건문 한 줄로도 충분히 의도를 전달할 수 있는데,
Optional.ofNullable(...).filter(...).ifPresent(...) 식으로 감싸면
오히려 의도 파악이 더 어려워질 수 있다.
3. 성능 측면에서도 큰 차이는 없다
Optional.ofNullable(list)는 내부적으로 Optional 객체를 한 번 더 생성하게 되는데,
실제 성능에 영향을 줄 정도는 아니지만, 단순 조건 분기라면 굳이 Optional을 도입할 필요는 없어 보인다.
가독성과 실용성을 우선으로 판단하는 게 더 중요할 수 있다.
💡 Optional는 언제 쓰는게 좋을까?
상황 | 추천 방식 |
null 체크 + empty 체크 | CollectionUtils.isEmpty(list) |
리턴값이 null일 수도 있을 때 | Optional<List<>> |
fallback 기본값이 필요할 때 | Optional.ofNullable(...).orElse(...) |
✏️ 내 결론
Optional을 무조건 쓰는 게 더 낫다고 보긴 어렵다.
상황에 따라 적절한 도구를 선택하는 게 더 중요하다고 생각한다.
지금처럼 단순히 리스트가 null이거나 비어있는지를 체크하려는 목적이라면,
개인적으로는 기존 방식이 더 명확하고 깔끔하다고 느껴졌다.
(물론 상황과 팀의 스타일에 따라 다를 수도 있을 것 같다!)
'개발 > 개발 일상' 카테고리의 다른 글
BeanCopy는 편한데 왜 불안할까? 실무에서 setter로 바꾸게 된 이유 (0) | 2025.03.22 |
---|