기술 - 서버/Java

외부 라이브러리를 쓰기전에, 항상 주석을 먼저 읽어보자

졸린개발자 2025. 10. 9. 21:53

안녕하세요. 졸린 개발자입니다.

 

오늘은 구글 캘린더 java 클라이언트 예시로

외부 라이브러리를 쓸 때의 조심해야 할 점을 알아봅시다!

 

NPE가 발생한 코드

 

Client는 구글 캘린더 클라이언트라고 생각해주시면 되고

일정 하나가 Event라고 보시면 됩니다.

 

그러면 간단하게, 일정의 첫번째 참석자의 이메일을 가져오는 함수라고 해석이 가능하겠군요

public Optional<String> getAttendeeEmail(Client client, String eventId) {
    return Optional.ofNullable(client.events().get(eventId)) // 일정을 가져옴
        .flatMap(event -> event.getAttendees().stream().findFirst()) // 일정의 첫번째 참석자를 가져옴
        .map(EventAttendee::getEmail) // 첫번째 참석자의 이메일을 가져옴
}

 

위 코드에서 어떤 부분이 문제였을까요?

 

척 보면 Optional로 Nullable 처리도 잘 되어있는거 같은데

NPE가 발생할 여지가 어디서 있었을까요?

 

놀랍게도....

놀랍게도 문제가 발생할 수 있는 부분은, 아래였습니다.

event.getAttendees().stream().findFirst()

 

네??? 어떻게 가능하죠?

놀랍게도 event.getAttendees()는 null을 반환할 수 있습니다.

 

wow

 

해결

해결책은 간단했습니다.

null 체크를 넣어주면 되겠죠

public Optional<String> getAttendeeEmail(Client client, String eventId) {
    return Optional.ofNullable(client.events().get(eventId)) // 일정을 가져옴
    	.filter(event -> event.getAttendees() != null) // null check 추가됨
        .flatMap(event -> event.getAttendees().stream().findFirst()) // 일정의 첫번째 참석자를 가져옴
        .map(EventAttendee::getEmail) // 첫번째 참석자의 이메일을 가져옴
}

 

교훈

이때까지 List 반환값에, null이 아닌 빈 List로 리턴하는것은

java에서 베스트 프렉티스라고 생각했었고, 누구나 그 프렉티스를 따를 것이라고 생각했습니다.

 

하지만 외부 라이브러리는 그 컨벤션을 무조건 지켜야 할 이유는 없겠죠.

다양한 원인으로 인해, null을 반환하는것이 이득일 수도 있었겠죠.

혹은, 이런 프렉티스가 만들어지기 전부터 있던 라이브러리인데, 나중에는 사용하는 사람들이 많아 변경하기 어려웠을 수도 있구요

 

어쨌든 라이브러리를 사용하는 입장에서는

이런 케이스들이 생긴다는 것을 항상 인지 하고 있어야 합니다.

 

따라서 외부 라이브러리를 쓸 때에는 주석을 꼼꼼히 읽을 뿐만 아니라,

항상 테스트를 해봐야합니다.

 

제가 원하는 기대값이 나오는지,

아니면 다른 값이 나와서 추가적인 처리가 필요한지를 항상 체크해야합니다.

 

 

 

썸네일 사진: Unsplash의 Doncoombez