스프링 부트 공부를 하면서 간간히 Optional 클래스를 사용하는 경우를 보았다.
//업데이트(수정)
public List<TodoEntity> update(final TodoEntity entity){
//1) 저장할 entity 유효성 검사
validate(entity);
//2)넘겨받은 entity의 User를 이용하여 TodoEntity를 가져옴
final Optional<TodoEntity> original = repository.findById(entity.getId());
//오리지날이 존재하면
original.ifPresent(todo->{
//3) 반환된 TodoEntity가 존재하면 값을 새 entity 값으로 덮어씌우기
todo.setTitle(entity.getTitle());
todo.setDone(entity.isDone());
log.info(entity.getTitle() + " "+ entity.isDone());
//4)데이터 베이스에 새 값 넣기
repository.save(todo);
});
//5) 사용자의 모든 리스트 리턴
return retrieve(entity.getUser());
}
final Optional<TodoEntity> original = repository.findById(entity.getId());
id를 이용하여 TodoEntity 객체를 가져오는 것인데
byid면 selectOne인 경우라 TodoEntity로 가져오면 되는데 왜 Optional에 제네럴까지 써서 가져온 것일까?
java.util.Optional<T> 클래스
Optional<T> 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)입니다.
따라서 Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있습니다.
이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있습니다.
즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 됩니다.
Optional 객체의 생성
of() 메소드나 ofNullable() 메소드를 사용하여 Optional 객체를 생성할 수 있습니다.
of() 메소드는 null이 아닌 명시된 값을 가지는 Optional 객체를 반환합니다.
만약 of() 메소드를 통해 생성된 Optional 객체에 null이 저장되면 NullPointerException 예외가 발생합니다.
따라서 만약 참조 변수의 값이 만에 하나 null이 될 가능성이 있다면, ofNullable() 메소드를 사용하여 Optional 객체를 생성하는 것이 좋습니다.
ofNullable() 메소드는 명시된 값이 null이 아니면 명시된 값을 가지는 Optional 객체를 반환하며, 명시된 값이 null이면 비어있는 Optional 객체를 반환합니다.
get() 메소드를 사용하면 Optional 객체에 저장된 값에 접근할 수 있습니다.
만약 Optional 객체에 저장된 값이 null이면, NoSuchElementException 예외가 발생합니다.
따라서 get() 메소드를 호출하기 전에 isPresent() 메소드를 사용하여 Optional 객체에 저장된 값이 null인지 아닌지를 먼저 확인한 후 호출하는 것이 좋습니다.
출처 : http://tcpschool.com/java/java_stream_optional
요약하자면 null일 경우 예외처리를 쉽게 하기 위해 좀 더 안전한 Optional 클래스를 이용한다는 것이다.
'Java' 카테고리의 다른 글
SimpleDateFormat으로 시간, 날짜 형식 지정하기 (0) | 2022.05.23 |
---|
댓글