728x90
Null Object Pattern이란?
객체가 존재 하지 않는 경우의 처리를 위해 많은 경우 if (ref == null) 혹은 try catch 구문을 사용해서 예외 처리를 한다.
Null Object Pattern이란 유저가 직접 null check를 하지 않고, 정의된 액션을 수행을 하지만 수행의 내용은 비어있는 빈 객체를 기본으로 제공해 줌으로서 예외 처리를 사전에 피하는 안전한 방식의 프로그래밍 패턴이다.
Null 객체의 의도는 적절한 기본 동작을 제공하는 대체 가능한 대안을 제공하여 객체의 부재를 캡슐화하기 위한 것이다. 간단히 말해, "아무것도 없는 것에서 아무것도 나오지 않는" 디자인이다.
특히 DB에서 데이터를 가지고 오는 경우 id값에 따라 null을 가져올 가능성이 매우 높고, 이를 미리 예측하기도 힘든 경우가 많다. 이럴 경우 예외처리를 하는 것은 가독성을 떨어뜨릴 수 있어 Null Object Pattern을 사용해서 NullPointerException을 방지한다.
활용 예시
Collections.emptySet, Collections.emptyList, Spring 프레임워크의 Pageable의 unpaged
package org.springframework.data.domain;
import java.util.Optional;
import org.springframework.util.Assert;
/**
* Abstract interface for pagination information.
*
* @author Oliver Gierke
*/
public interface Pageable {
/**
* Returns a {@link Pageable} instance representing no pagination setup.
*
* @return
*/
static Pageable unpaged() {
return Unpaged.INSTANCE;
}
// 이하 생략
- Unpaged.INSTANCE 가 널 객체 패턴이다.
package org.springframework.data.domain;
enum Unpaged implements Pageable {
INSTANCE;
@Override
public boolean isPaged() {
return false;
}
@Override
public Pageable previousOrFirst() {
return this;
}
@Override
public Pageable next() {
return this;
}
@Override
public boolean hasPrevious() {
return false;
}
@Override
public Sort getSort() {
return Sort.unsorted();
}
@Override
public int getPageSize() {
throw new UnsupportedOperationException();
}
@Override
public int getPageNumber() {
throw new UnsupportedOperationException();
}
@Override
public long getOffset() {
throw new UnsupportedOperationException();
}
@Override
public Pageable first() {
return this;
}
}
- 실제 코드를 확인해보면 실제 객체와 똑같은 모든 메시지에 응답하게 되어있으며 문제가 되는 메서드에서는 예외를 던지게 되어 있다.
널 오브젝트 패턴의 장단점
장점
- 클라이언트 코드에서 null 값을 비교하는 구문을 최소화 할수 있다.
- 라이브러리를 제공하는 측면에서 안정성있는 API를 제공할수 있다.
- 기존에 존재하는 어플리케이션 코드의 변함없이 기능을 제거하고자 할 때
단점
- Null 객체를 요구하는 클래스마다 인터페이스를 선언하고 이를 구현하는 Null 객체를 만들어주어야 한다.
- 클라이언트에서 Null 객체의 존재를 모르는 경우, 디버깅시에 약간의 혼선이 올 수 있다.
728x90
'design & development' 카테고리의 다른 글
[만들면서 배우는 클린 아키텍처] 8. 경계 간 매핑하기 (1) | 2024.11.22 |
---|---|
[만들면서 배우는 클린 아키텍처] 7. 아키텍처 요소 테스트하기 (0) | 2024.11.21 |
[만들면서 배우는 클린 아키텍처] 6. 영속성 어댑터 구현하기 (1) | 2024.11.18 |
[만들면서 배우는 클린 아키텍처] 5. 웹 어댑터 구현하기 (1) | 2024.11.17 |
[만들면서 배우는 클린 아키텍처] 4. 유스케이스 구현하기 (0) | 2024.11.16 |