티스토리 뷰
Space club 프로젝트를 진행하는데 있어서 코드리뷰를 활성화 했다.
팀원들과의 코드리뷰는 직설적이고 간결하게 진행하는 것을 원칙으로 했다.
코드에 있어서 당연한 것은 없었다. 기능적으로 올바르게 동작하는 것은 필수적이였지만 어떻게 구현하는지, 어떠한 방식이 더 효율적인지 고민하는 것도 필수적이라고 생각했다.
위 팀원과 마주친 상황 다음과 같다.
null 체크 할때 optional의 메서드를사용하는게 맞는가?
아니면 그냥 value == null 비교를 통해 검증하는게 맞는가?
❓먼저 나는 왜 Optional을 사용했는가
나는 null을 직접 다루는 것이 NPE에 있어서 위험하기때문에 null을 직접적으로 다루기보다 Optional 클래스를 통해 한번 wrapping해 사용하는 것이 낫다는 생각하에 Optional 클래스를 사용했다.
또한 null check에 있어서 Optional 클래스 안에 isEmpty()와 같은 메서드를 통해 가독성을 증가 시킬 수 있다고 생각해 사용했다.
그런데 꼭 그렇게 해야하나?는 생각이 들었고 Optional 이렇게 사용하는게 맞나..?는 생각이 들었다
🔍 Optional에 대해서 찾아보자
그래서 Optional에 대해서 찾아보았다.
Optional을 통해 null값을 안전하게 사용할 수 있다는 것은 알고 있는데, 위 코드에서 처럼 사용하는게 맞을까?
자바 언어 아키텍트인 Brian Goetz가 스택오버플로우에 남긴 답글인데,
반환할 결과값이 없고 NPE 위험이 높은 null을 사용하는 곳을 분명하게 표현할 필요가 있는 곳에서 라이브러리 메서드 반환 타입을 제한하는 메커니즘을 제공하는 것이 Optional을 만든 의도였다고 한다.
따라서 Optional 사용에 대한 조언은 다음과 같다
- Optional.get을 절대 null이 될 수 없는 곳이 아니면 사용하지 마라
- 대신 orElse나 ifPresent를 사용해라
그리고 Optional에 대한 올바르게 사용하는 26가지 방법에 대한 글이 있어 보았는데 내용은 다음과 같다.
여러 가지 Optional을 올바르게 사용하는 방법이 있지만, 위 12번에서 답을 찾을 수 있었다.
“Optional 체이닝을 단지 값을 얻기 위해서 사용하지 마라"
✅ 해결
나는 null값을 얻기 위해서 Optional 클래스를 사용했다.
하지만 이럴 경우는 Optional로 감싸는게 아닌 단순 값 비교만 하면 된다는 것이 더 나은 방식이라는 것을 알았다.
왜냐하면 Optional은 꽤 비싼 객체이기 때문이다.
기존 코드
private RequiredInfo generateRequiredInfo(String nickname, String phoneNumber) {
if (Optional.ofNullable(nickname).isEmpty() || Optional.ofNullable(phoneNumber).isEmpty()) {
return new RequiredInfo();
}
return new RequiredInfo(nickname, new PhoneNumber(phoneNumber));
}
수정한 코드
private RequiredInfo generateRequiredInfo(String nickname, String phoneNumber) {
if (nickname == null || phoneNumber == null) {
return new RequiredInfo();
}
Assert.hasText(nickname, "닉네임은 필수입니다.");
Assert.hasText(phoneNumber, "전화번호는 필수입니다.");
return new RequiredInfo(nickname, new PhoneNumber(phoneNumber));
}
Reference
26 Reasons Why Using Optional Correctly Is Not Optional - DZone
'Programming > Java' 카테고리의 다른 글
📝 Function.identity() vs i -> i, 람다식에서 무엇을 사용해야 할까? (0) | 2024.01.30 |
---|---|
Scanner와 BufferedReader / BufferedWriter의 차이점과 사용법 (0) | 2023.06.05 |
try-with-resources 적용 후기 (0) | 2023.03.17 |
Java Exception: Checked vs Unchecked, @SneakyThrows (0) | 2023.02.28 |
@SafeVarargs Annotation (추가 학습 필요) (0) | 2022.12.19 |
- Total
- Today
- Yesterday