SpringBoot를 사용하면서 Null 체크는 필수적인 작업이다. NullPointerException은 예상치 못한 곳에서 발생할 수 있어, 이를 방지하기 위한 다양한 방법들이 존재한다. 오늘은 SpringBoot에서 효율적으로 Null 체크를 수행하기 위해 Optional과 Stream을 사용하는 방법을 공부했다.
Java 8에서 도입된 Optional 클래스는 Null을 명시적으로 처리할 수 있는 방법을 제공한다. Optional을 사용하면 객체가 존재할 수도 있고, 존재하지 않을 수도 있는 상황을 보다 명확하게 표현할 수 있다. 이를 통해 코드의 가독성을 높이고, NullPointerException을 방지할 수 있다.
Optional은 주로 다음과 같은 메서드들을 사용하여 Null 체크를 수행한다:
Optional.ofNullable(): 객체가 Null인지 아닌지를 확인하고, Null일 경우 빈 Optional 객체를 반환한다.map(): Optional 객체가 값을 가지고 있을 경우, 해당 값을 변환하여 새로운 Optional 객체를 반환한다.orElseThrow(): Optional 객체가 값을 가지고 있지 않을 경우, 지정된 예외를 발생시킨다.Java의 Stream API는 컬렉션 데이터를 처리하는 데 있어 강력한 도구이다. Stream을 사용하면 데이터의 필터링, 매핑, 축소 등의 작업을 간결하게 수행할 수 있다. 특히, Optional과 함께 사용하면 더욱 효율적인 Null 체크 및 데이터 처리가 가능하다.
다음은 Optional과 Stream을 활용하여 SpringBoot에서 Null 체크를 수행하는 예제 코드이다:
ResponseEntity<VelogPostResponseDto> response = sendPostRequest(webClient, query, cookie);
Optional.ofNullable(response.getBody()) // Response body의 null 체크
.map(VelogPostResponseDto::getData)
.map(VelogPostResponseDto.VelogResponseData::getWritePost) // Posting 실패 예외처리
.orElseThrow(() -> {
updateVelogTokens(member, response.getHeaders()); // Token 업데이트
throw new CustomException(ErrorCode.VELOG_POSTING_ERROR); // Retry 될 수 있도록 예외 Throw
});
sendPostRequest 메서드를 통해 ResponseEntity 객체를 받아온다.Optional.ofNullable(response.getBody())를 사용하여 Response body가 Null인지 체크한다.map 메서드를 사용하여 VelogPostResponseDto 객체의 데이터를 추출하고, 필요한 경우 변환 작업을 수행한다.orElseThrow를 통해 만약 데이터가 존재하지 않을 경우, 예외를 발생시킨다. 이 과정에서 토큰 업데이트 등의 추가 작업도 수행할 수 있다.이와 같은 방법을 통해 SpringBoot 애플리케이션에서 보다 안전하고 효율적인 Null 체크를 수행할 수 있다. Optional과 Stream을 적절히 활용하면 코드의 가독성을 높이고, 예외 처리 로직을 간결하게 유지할 수 있다.