인프런 커뮤니티 질문&답변

brwnsugr님의 프로필 이미지
brwnsugr

작성한 질문수

실전! 스프링 데이터 JPA

Entity Optional 반환 값에 대한 질문(왜 optional로 하는게 좋을까요?)

작성

·

1.3K

2

강의와 관련있는 질문을 남겨주세요.
• 강의와 관련이 없는 질문은 지식공유자가 답변하지 않을 수 있습니다. (사적 상담, 컨설팅, 과제 풀이 등)
• 질문을 남기기 전, 비슷한 내용을 질문한 수강생이 있는지 먼저 검색을 해주세요. (중복 질문을 자제해주세요.)
서비스 운영 관련 질문은 인프런 우측 하단 ‘문의하기’를 이용해주세요. (영상 재생 문제, 사이트 버그, 강의 환불 등)

질문 전달에도 요령이 필요합니다.
• 지식공유자가 질문을 좀 더 쉽게 확인할 수 있게 도와주세요.
• 강의실 페이지(/lecture) 에서 '질문하기'를 이용해주시면 질문과 연관된 수업 영상 제목이 함께 등록됩니다.
• 강의 대시보드에서 질문을 남길 경우, 관련 섹션 및 수업 제목을 기재해주세요. 
• 수업 특정 구간에 대한 질문은 꼭 영상 타임코드를 남겨주세요!

구체적인 질문일수록 명확한 답을 받을 수 있어요.
• 질문 제목은 핵심 키워드를 포함해 간결하게 적어주세요.
• 질문 내용은 자세하게 적어주시되, 지식공유자가 답변할 수 있도록 구체적으로 남겨주세요.
• 정확한 질문 내용과 함께 코드를 적어주시거나, 캡쳐 이미지를 첨부하면 더욱 좋습니다.

기본적인 예의를 지켜주세요.
• 정중한 의견 및 문의 제시, 감사 인사 등의 커뮤니케이션은 더 나은 강의를 위한 기틀이 됩니다. 
• 질문이 있을 때에는 강의를 만든 지식공유자에 대한 기본적인 예의를 꼭 지켜주세요. 
반말, 욕설, 과격한 표현 등 지식공유자를 불쾌하게 할 수 있는 내용은 스팸 처리 등 제재를 가할 수 있습니다. 

안녕하세요, 김영한님.

저 역시 실무에서 자바 개발자로 일하고 있고, 강의에서 많은 도움 받아오고 있는 수강생입니다. 항상 고맙게 생각하고 있습니다. 

다름이 아니고, Repository interface에서 특정 entity 값을 반환하려는 메소드에서 왜 Optional로 반환을 해주는 이점이 있나요?

단순 코드 가독성이 좋아지는 부분 외에 이점이 또 어떤게 있을까요? 오히려 null로 뱉어주게 해서 if 조건으로 entity가 null임을 체크해서 예외를 던져주는 코드를 작성하는게 나은게 아닐까 싶어서요.. 왜냐하면, Optional<T> 역시 결국 기존 DataType을 Optional로 한번 Wrapping해주고, Optional<T> 인스턴스를 생성하기 때문에, 자원을 낭비하지 않나 싶어서요. 

(아래는 수업 중 MemberRepository에 구현된 부분입니다.)

답변 4

10

brwnsugr님의 프로필 이미지
brwnsugr
질문자

먼저, 바쁘신데, 빠른 답변 고맙습니다! 

자원비가 생각보다 미미하다는 점이 포인트네요..! 그리고, NullpointerException 이 터질 때 Error Trace를 찾기 힘들다는 점도 있겠고요.

아래는 제가 추가로 정리했던거 여기에 공유드리는 내용입니다.(다른 수강생들도 보시면 도움이 될듯합니다.)

Java의 optional이란?
  • 기존의 반환 값 타입 T에 Optional<T>를 Wrapping 하여, null 대신 Optional 안에 빈 타입 객체를 돌려주는 기법이다.
Optional 은 반환값이 없을 수도 있다고 미리 가정하고, 이 반환값을 통제하기 위해 사용함.
그럼 걍 null을 뱉을 수도 있지않나?
  • 반환값으로 null 을 return 받는 경우, 추후 null을 반환해준 라인과는 상관없는 코드에서 null pointer Exception이 터질 수 있어서 트래킹이 어렵다.
    • 즉, 예외 발생 시 예외 스택 전체를 캡쳐하는 비용을 아낄 수 있음
    • Optional 안에 빈 타입 객체가 들어 있는 경우, Optional에서 정의된 method 등을 이용하여, 좀 더 유연한 핸들링이 가능함
  • null대신 optional로 반환한다면, optional
언제 Optional을 사용하는게 좋을까?
  • 값을 반환하지 못할 가능성이 있고, 호출할 때마다 반환값이 없을 가능성을 염두에 둬야 하는 메서드라면 옵셔널 반환을 고려할 수 있음
  • 즉, 반환 값이 없을 수 있고, 클라이언트가 이 상황을 특별하게 처리해야할 경우 Optional<T> 로 반환하는게 좋다. 
  • 그리고 optional로 Wrapping하는 비용은 그리 크지 않음...! 
Optional로 당연히 해서는 안될 것

  • Optional 을 반환하는 메서드에서는 절대 null을 뱉게 하면 안됨(null 뱉으면 optional Wrapping의미가 없으므로..) 

3

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. brwnsugr님 좋은 질문입니다.

null을 뱉어주는 부분 자체가 사실 문제가 됩니다. 수 많은 버그와 장애의 원인을 제공하는 것이지요.

(생각해보시면 NullPointerException을 진짜 많이 만나지요. 정말 ㅠㅠ...)

Optional을 사용하면 언어 차원에서 null 문제를 해결할 수 있습니다. 그리고 Optional 타입으로 한번 감싼다고 해서 자원비는 아무 미미합니다.

최근 언어들은 이미 optional의 개념을 빠르게 적용했고, 상대적으로 자바는 상당히 늦게 적용이 되었습니다.

java8 optional의 유용성은 자바 언어에서 권장하는 것이고, null을 반환하는게 얼마나 좋지 않지 그리고 java8 optional을 왜 사용해야 하는지는 java8 optional로 구글에 검색해보시면 정말 많은 이유를 찾으실 수 있을꺼에요^^

저는 자바 8 인 액션 책을 한번 읽어보시길 추천드립니다.

감사합니다.

1

brwnsugr님의 프로필 이미지
brwnsugr
질문자

말씀주신 책도 꼭 읽어볼게요. 고맙습니다. 

0

김영한님의 프로필 이미지
김영한
지식공유자

네 화이팅입니다^^

brwnsugr님의 프로필 이미지
brwnsugr

작성한 질문수

질문하기