에러 노트: NullPointerException - 포인트 값이 없을 경우
### 에러 노트: NullPointerException - 포인트 값이 없을 경우
#### 발생 원인:
- **`NullPointerException` 발생**: `MobilePoint` 객체가 `null`일 경우, `point.getPoint()` 메소드 호출에서 `NullPointerException`이 발생.
- **기존 코드**:
return new PageImpl<>(list.getResults().stream()
.map(tuple -> {
MobileUsers data = tuple.get(userInfo);
MobilePoint point = tuple.get(userPoint);
return new MobileUserDTO.UserListData(
point.getPoint()
);
})
.collect(Collectors.toList()), pageable, list.getTotal());
- **문제**: `point`가 `null`일 때 `point.getPoint()`를 호출하려고 해서 `NullPointerException`이 발생.
- **해결 코드**:
return new PageImpl<>(list.getResults().stream()
.map(tuple -> {
MobileUsers data = tuple.get(userInfo);
MobilePoint point = tuple.get(userPoint);
return new MobileUserDTO.UserListData(
point != null && point.getPoint() != null ? point.getPoint() : 0
// point가 null일 경우 0 반환
);
})
.collect(Collectors.toList()), pageable, list.getTotal());
#### 영향 범위:
- **NullPointerException**: `MobilePoint` 객체가 `null`일 경우, `point.getPoint()` 호출 시 예외가 발생하여 애플리케이션이 중단될 수 있음.
- **데이터 처리 오류**: `point`가 `null`인 경우에도 `getPoint()`를 안전하게 처리하지 않으면, 해당 사용자에 대한 데이터를 처리할 수 없거나, 오류가 발생하여 결과가 정상적으로 반환되지 않음.
#### 주요 프로세스 영향:
1. **데이터 조회 실패**:
- `MobilePoint` 객체가 `null`인 경우, `point.getPoint()` 호출에서 오류가 발생하여, 해당 사용자의 정보가 잘못 처리되거나 조회되지 않음.
2. **응답 지연**:
- 예외가 발생하여 요청이 실패하거나 예외 처리 로직으로 넘어가게 되어, 응답 시간이 지연될 수 있음.
3. **서비스 장애**:
- `NullPointerException`으로 인해 서비스가 중단되거나, 일부 기능이 정상적으로 작동하지 않음.
#### 해결 방안:
1. **`null` 체크 추가**:
- `MobilePoint` 객체가 `null`일 경우, `getPoint()`를 호출하지 않도록 `null` 체크를 추가하여 `NullPointerException`을 방지.
- `point`가 `null`일 경우에는 기본 값(예: `0`)을 반환하도록 처리.
- **수정된 코드**:
return new PageImpl<>(list.getResults().stream()
.map(tuple -> {
MobileUsers data = tuple.get(userInfo);
MobilePoint point = tuple.get(userPoint);
return new MobileUserDTO.UserListData(
point != null && point.getPoint() != null ? point.getPoint() : 0
// point가 null일 경우 0 반환
);
})
.collect(Collectors.toList()), pageable, list.getTotal());
2. **`Optional` 사용**:
- `Optional`을 사용하여 `null` 처리를 더 안전하게 할 수 있음. 예를 들어, `point.getPoint()` 대신 `Optional.ofNullable(point).map(MobilePoint::getPoint).orElse(0)`와 같이 처리할 수 있음.
return new PageImpl<>(list.getResults().stream()
.map(tuple -> {
MobileUsers data = tuple.get(userInfo);
MobilePoint point = tuple.get(userPoint);
return new MobileUserDTO.UserListData(
Optional.ofNullable(point).map(MobilePoint::getPoint).orElse(0)
);
})
.collect(Collectors.toList()), pageable, list.getTotal());
3. **테스트 및 검증**:
- 수정된 코드가 정상적으로 동작하는지 확인하기 위해, `point`가 `null`인 경우와 아닌 경우에 대해 다양한 테스트를 진행.
- 특히 `point`가 `null`일 때 결과가 `0`으로 반환되는지 검증.
4. **로깅**:
- `point`가 `null`인 경우에 대한 로깅을 추가하여, 데이터가 `null`인 이유와 함께 문제를 추적할 수 있도록 함.
- 예시:
if (point == null) {
log.warn("MobilePoint is null for user: {}",data.getId());
}
#### 결론:
`MobilePoint` 객체가 `null`일 경우 `getPoint()` 메소드 호출에서 `NullPointerException`이 발생하는 문제를 해결하기 위해 `null` 체크를 추가하여 안전하게 처리하도록 수정해야 합니다. `Optional`을 사용하면 코드가 더 깔끔하고 안전하게 `null` 값을 처리할 수 있습니다. 이를 통해 애플리케이션이 중단되지 않고 정상적으로 데이터를 처리할 수 있습니다.