티스토리 뷰
Optional 클래스를 사용하면 null 처리를 쉽고 가독성 좋게 표현해줄 수 있습니다.
그 중 JPA에서 자주 사용하는
엔티티 ID 값으로 조회하는 findById 는 Optional<> 로 리턴하는 메소드 중 하나인데요.
Optional<T> findById(ID id);
이렇게 id 값에 따른 엔티티를 조회하여
엔티티가 존재하지 않을 경우 대체처리하는 로직을 간결하게 수행할 수 있습니다.
저도 연관된 id 값을 반복 돌리면서
update를 수행하는 코드가 있었는데
생각없이 조건문과 isPresent() 를 이용해서 코드를 작성해놓고 보니
if != null 처리와 뭐가 다른가 싶은 생각이 들었습니다.
param.getFileList().forEach(file -> {
Optional<requestFileEntity> loadEntityOptional = fileRepository.findById(file);
if(loadEntityOptional.isPresent()) {
loadEntityOptional.get().updateParentUuid(requestEntity);
}
});
requestFileEntity 의 영속성으로 update 를 하려다 보니 위와 같은 코드를 작성하게 되었고
동작에는 문제가 없으나 Optional을 쓰는 의미가 있나 싶은 코드가 되서
ifPresent 로 코드를 바꿔봤습니다.
ifPresent 는 아래와 같이 정의되어 있습니다.
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}
param.getFileList().forEach(file -> {
Optional<requestFileEntity> loadEntityOptional = fileRepository.findById(file);
loadEntityOptional.ifPresent(entity -> {
entity.updateParentUuid(requestEntity);
});
});
엔티티가 null 아니고 존재할 경우에만 지정자를 호출하여 다음 동작을 수행하게 됩니다.
Optional.isPresent() 남발로 if null 조건문 처럼 쓰지 말자는 취지로 포스트를 작성하게 되었고
Optional 에 구현된 것들을 실제로 다 사용해보진 않았지만
잘 활용하면 무수히 반복적으로 길어지는 조건문을 한줄로도 처리 가능함을 얻게 되었습니다.
요즘엔 새로운 코드를 작성하는 것보다
이 코드를 어떻게 더 간결하고 가독성있게 할까 고민해보는게 재밌는 것 같다.