에러 상황
@GetMapping("/findByID/{userId}")
public ResponseEntity<ResponseUser> findByID(@PathVariable("userId") Long userId) {
Optional<UserEntity> userEntity = userService.findByUserId(userId);
if (userEntity.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
ResponseUser returnValue = new ModelMapper().map(userEntity, ResponseUser.class);
return ResponseEntity.status(HttpStatus.OK).body(returnValue);
}
userEntity를 ReponseUser로 변환하려 했지만, 다른 값이 모두 null로 나오는 상황
에러 해결
ModelMapper의 map 메서드를 사용하여 UserEntity를 ResponseUser로 변환하려고 했지만, map 메서드는 Optional을 직접 처리 할 수 없다.
대신 Optional을 처리하여 UserEntity를 가져와야 한다.
Optional 객체에 map 메서드를 사용할 때, 해당 메서드는 Optional 내부의 값을 변환하여 새로운 Optional 객체로 감싸서 반환합니다.
그러나 이 변환은 Optional 객체 자체가 아니라 내부의 값을 변환하는 것입니다.
따라서 map 메서드를 사용하여 UserEntity를 ResponseUser로 변환할 수는 없습니다.
왜냐하면 이는 Optional 객체 자체를 변환하는 것이 아니기 때문입니다.
즉, Optional 객체에는 새로운 값이 포함된 새로운 Optional 객체만 반환되는데, 이는 ResponseUser 타입이 아닌 Optional 타입이 될 것입니다.
따라서 Optional를 ResponseUser로 변환하는 것은 map 메서드로 직접적으로 수행할 수 없습니다.
public ResponseEntity<ResponseUser> findByID(@PathVariable("userId") Long userId) {
Optional<UserEntity> userEntityOptional = userService.findByUserId(userId);
if (userEntityOptional.isEmpty()) {
return ResponseEntity.status(HttpStatus.NOT_FOUND).build();
}
// ✔ Optional를 안전하게 처리하고, UserEntity를 ResponseUser로 변환할 수 있다.
UserEntity userEntity = userEntityOptional.get(); // 여기!
ResponseUser returnValue = new ModelMapper().map(userEntity, ResponseUser.class);
return ResponseEntity.status(HttpStatus.OK).body(returnValue);
}
💡 Optional
Optional은 실제 객체의 존재 유무를 표현하는 래퍼 클래스입니다.
따라서 Optional 내부에 객체가 있는지 여부를 확인하고 그에 따른 처리를 해주어야 합니다.
Optional 클래스는 이러한 패턴을 사용하여 NullPointerException 등의 오류를 방지하고 안전한 코드를 작성할 수 있도록 지원합니다.
💡 map 메서드
map 메서드는 내부의 값을 변환하는 역할을 합니다.
Optional 객체에 함수를 적용하여 그 결과를 새로운 Optional 객체로 반환합니다.
이때, 함수가 적용된 결과는 새로운 Optional 객체에 포함됩니다.
하지만 map 메서드는 직접적으로 Optional 객체 자체를 변환하는 것이 아니라, 변환된 값을 포함한 새로운 Optional 객체를 생성하여 반환합니다.
따라서 map 메서드를 통해 Optional<UserEntity>를 직접적으로 ResponseUser로 변환할 수는 없습니다.
ModelMapper은 Optional 객체를 직접 처리할 수 없는 이유
ModelMapper은 Optional 객체를 직접 처리할 수 없는 이유는 Optional이 값을 감싸고 있을 수도 있고 없을 수도 있는 래퍼 클래스이기 때문입니다.
ModelMapper는 기본적으로 Java 객체 간의 매핑을 지원하며, Optional을 처리하는 기능을 내장하고 있지 않습니다.
따라서 Optional을 처리할 때에는 값을 안전하게 추출하여 사용해야 합니다.