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

s_971001님의 프로필 이미지

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

회원 리포지토리 테스트 케이스 작성

get()을 하는 이유

해결된 질문

작성

·

573

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]

안녕하세요! 수업 도중 궁금한 점이 생겨 질문드립니다.

@Test
    public void save() {
        Member member = new Member();
        member.setName("spring");
        repository.save(member);
        Member result = repository.findById(member.getId()).get();
//        System.out.println("result = " + (result==member));
        Assertions.assertEquals(member, result);
    }

이 부분에서 Member result를 할 때 get()을 해주는 이유는 findById의 반환값이 optional이기 때문인건가요...? 그렇다면 optional은 get을 왜 해줘야하는지도 궁금합니다.

 

감사합니다

답변 2

2

choi님의 프로필 이미지

2023. 11. 27. 21:50

  1. findById의 반환값이 optional이기 때문인건가요...?
    -> 네 맞아요. 영한님이 강의에서도 설명해주지만, 강의 내용자체가 optional을 다루는 수업은 아니라서
    Optional.get()으로 바로 member 객체를 가져오죠

  2. optional은 get을 왜 해줘야하는지

-> Optional 은 null일 수 있는 객체를 감싸는 wrapper 객체이구요.
wrapper라는건 무언가를 감싸고있는 객체란 의미고, 이 경우에는 Member를 감싸고 있겠죠

그래서 .get() 메서드를 통해 감싸진 Member를 가져오는 겁니다.

지금 우리에게 필요한건 햄버거인데, 배달시켜서 온 배달 봉투를 받게 되었고,
봉지 속에서 햄버거를 꺼내는 과정이라고 비유할 수 있겠네요!
java 8 optional 이란 키워드로 검색해보세용

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

2023. 11. 28. 14:50

감사합니다!

1

OMG님의 프로필 이미지

2023. 11. 28. 02:02

안녕하세요. s_971001님, 공식 서포터즈 OMG입니다.

Optional이기 때문에 .get()을 사용한게 맞습니다 :)

 

Optional<Member> result = repository.findById(member.getId());

Member result = repository.findById(member.getId()).get();

 

두 코드를 비교해보시면 확인 가능한데요, findById()의 반환 타입은 Optional<Member>이므로

첫번째와 같이 result 변수의 타입이 Optional<Member>인 반면,

.get()을 호출함으로써 Member타입의 반환 타입을 사용할 수 있게 됩니다.

 

강의에서 검증하려는 단언문은 다음과 같이

Assertions.assertEquals(member, result);

Member타입의 member 인스턴스와 findById()의 반환 타입을 맞춰주기 위해 .get()을 사용하였습니다.

감사합니다.

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

2023. 11. 28. 14:50

감사합니다!

s_971001님의 프로필 이미지

작성한 질문수

질문하기