SpringBoot를 사용하면서 Null 체크는 필수적인 작업 중 하나다. Null 체크를 효율적으로 처리하지 않으면 코드가 복잡해지고, 예외 처리가 어려워질 수 있다. 오늘은 SpringBoot에서 Optional과 Stream을 사용하여 효율적으로 Null 체크를 하는 방법에 대해 알아보자.
Java 8부터 도입된 Optional은 Null을 처리하는 데 유용한 도구다. Optional을 사용하면 NullPointerException을 방지하고, 코드의 가독성을 높일 수 있다. Optional은 값이 존재할 수도 있고, 존재하지 않을 수도 있는 컨테이너 객체다.
Optional을 사용하면 객체가 Null인지 아닌지를 명시적으로 처리할 수 있다. 다음은 Optional의 기본적인 사용 예제다.
Optional<String> optionalString = Optional.ofNullable(getString());
optionalString.ifPresent(s -> System.out.println(s));
위 코드에서 getString() 메서드가 Null을 반환할 수 있는 상황이라면, Optional.ofNullable()을 사용하여 안전하게 Null 체크를 수행할 수 있다. ifPresent() 메서드를 사용하여 값이 존재할 때만 특정 로직을 수행하도록 한다.
Stream과 Optional을 함께 사용하면 더욱 강력한 Null 체크와 데이터 처리 로직을 구현할 수 있다. 특히, 데이터 변환 및 필터링 작업을 수행할 때 유용하다.
다음은 Optional과 Stream을 사용하여 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 객체의 body가 Null인지 체크하고 있다. Optional.ofNullable()을 사용하여 Null 체크를 수행하고, map() 메서드를 통해 필요한 데이터로 변환한다. 만약 데이터가 존재하지 않는다면 orElseThrow()를 통해 예외를 발생시킨다. 이 과정에서 토큰을 업데이트하는 로직도 포함되어 있다.
SpringBoot에서 Null 체크는 필수적인 작업이며, 이를 효율적으로 처리하기 위해 Optional과 Stream을 활용할 수 있다. 이러한 방법을 사용하면 코드의 가독성을 높이고, 예외 처리를 보다 명확하게 할 수 있다. 앞으로 SpringBoot 프로젝트를 진행할 때, 이러한 방법을 활용하여 안전한 서비스를 개발하자.