NPE
방지NPE(NullPointerExceotion) - 런타임예외
- 프로그램이 null 값으로 설정된 개체 참조를 사용하려고하면이 예외가 throw
- NPE를 피하려면 null 여부를 검사해야 하는데, null 검사를 해야하는 변수가 많은 경우 코드가 복잡해지고 번거로움.
- 그래서 null 대신 초기값을 사용하길 권장함
public final class Optional<T> {
private static final Optional<?> EMPTY = new Optional<>();
private final T value;
private Optional() {
this.value = null;
}
...
}
# UserRepository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findByUsername(String username);
}
# UserService
@Transactional
public void signup(SignupRequest request) {
String username = request.getUsername();
String password = request.getPassword();
Optional<User> found = userRepository.findByUsername(username);
if (found.isPresent()) {
throw new IllegalArgumentException("중복된 이름이 있습니다.");
}
// username 으로 찾았을 때 null 값이 나올 수도 있기때문에 Optional 사용
// Optional 클래스의 메소드 isPresen() 사용
UserRoleEnum role = UserRoleEnum.USER;
if (request.isAdmin()) {
if (!request.getAdminToken().equals(ADMIN_TOKEN)) {
throw new IllegalArgumentException("관리자 암호가 틀려 등록이 불가능합니다.");
}
role = UserRoleEnum.ADMIN;
}
User user = new User(username, password, role);
userRepository.save(user);
}