멀티파트 파일 null체크를 하고 업로드하는 로직을 구현했다. 결과는 아래와 같다.
AwsS3 awsS3;
if (!dto.getFile().isEmpty()) {
awsS3 = awsS3Service.upload(dto.getFile(), "tayo");
} else {
awsS3 = null;
}
음... 저기서 구멍이 있었다. 바로 dto.getFile
에서 NPE가 나타날 수도 있다는 것이다. 해당 로직을 수정하면 아마도 아래처럼 될 것이다.
AwsS3 awsS3;
if (dto.getFile != null && !dto.getFile().isEmpty()) {
awsS3 = awsS3Service.upload(dto.getFile(), "tayo");
} else {
awsS3 = null;
}
하고보니 뭔가 지저분하다. 나는 Optional을 배웠는데 왜 저렇게 쓰고 있는것인가. 옵셔널을 쓴다면 좀 더 세련되게 표현할 수 있을거라고 생각했다.
옵셔널로 표현한 코드는 아래와 같다.
AwsS3 awsS3 = Optional.ofNullable(dto.getFile())
.filter(image -> !image.isEmpty())
.map(image -> awsS3Service.upload(image, "tayo"))
.orElse(null);
.ofNullable
에서 dto의 getFile의 객체가 null인지 파악한다. 즉, dto.getFile != null
이 부분과 같다.
.filter에서는 파일이 비어있는지를 체크한다.
.map에서는 upload하고 나온 결과 객체를 반환한다.
.orElse 그리고 만약 없으면 null을 반환한다.