Develop/Java

[Java] Optional과 List의 상관관계 : isEmpty(), isPresent()의 차이와 동작 원리

DevPi 2024. 9. 18. 19:04
반응형

Java의 Optional 클래스는 값이 있을 수도 있고 없을 수도 있는 상황을 처리하기 위해 설계된 클래스입니다. 특히, JPA와 같은 ORM 프레임워크에서 쿼리 결과를 다룰 때 Optional은 많이 사용됩니다. 이번 포스팅에서는 Optional<List<A>>, Optional<A>의 타입을 다룰 때 각 메서드인 isEmpty()와 isPresent()의 차이점과 그 상관관계에 대해 설명하겠습니다.


1. Optional 개념 정리

Optional은 Java 8에 도입된 클래스이며, 값이 존재할 수도 있고 존재하지 않을 수도 있는 객체를 표현하기 위해 사용됩니다. 이를 통해 null 값을 직접 처리하는 것을 피하고, 더 명확하고 안전한 코드를 작성할 수 있습니다.

 

2. Optional<List<A>> 사용 시 동작

1) Optional<List<A>>란?

  • Optional<List<A>>는 리스트 객체 자체가 존재하는지 여부를 표현합니다. 즉, 리스트의 존재 유무를 나타내며, 리스트가 비어있거나 존재하지 않을 수 있는 상황을 처리합니다.

2) 메서드 동작

  • isEmpty():
    • 리스트 객체가 없을 때(즉, Optional이 비어있을 때) true를 반환합니다.
    • 리스트 객체는 존재하나 리스트의 크기가 0일 때는 false를 반환합니다.
  • isPresent():
    • 리스트 객체가 있을 때(즉, Optional 안에 값이 존재할 때) true를 반환합니다.
    • 리스트 객체 자체가 없을 때는 false를 반환합니다.

3) 예시 코드

Optional<List<A>> optionalList = findEntities();
if (optionalList.isPresent()) {
    List<A> list = optionalList.get();
    if (!list.isEmpty()) {
        // 리스트 안에 값이 있을 때 처리
    }
} else {
    // 리스트 자체가 없는 경우 처리
}

여기서 중요한 점은, Optional<List<A>>에서 isPresent()는 리스트 객체 자체가 존재하는지 여부를 확인하는 메서드라는 점입니다. isEmpty()는 리스트 객체가 없을 때 true를 반환하며, 리스트가 비어 있더라도 객체가 존재하면 false를 반환합니다.

 

3. Optional<A> 사용 시 동작

1) Optional<A>란?

  • Optional<A>는 A 타입의 객체가 존재하는지 여부를 나타냅니다. 즉, 단일 객체가 존재하는지 확인할 수 있습니다.

2) 메서드 동작

  • isEmpty():
    • 객체가 없을 때(즉, Optional이 비어있을 때) true를 반환합니다.
    • 객체가 있을 때는 false를 반환합니다.
  • isPresent():
    • 객체가 존재할 때 true를 반환합니다.
    • 객체가 없으면 false를 반환합니다.

3) 예시 코드

Optional<A> optionalEntity = findEntity();
if (optionalEntity.isPresent()) {
    A entity = optionalEntity.get();
    // 객체가 존재할 때 처리
} else {
    // 객체가 없을 때 처리
}

Optional<A>는 객체 자체가 존재하는지 여부만을 판단하며, 값이 존재하는 경우에만 get()으로 객체를 가져옵니다.

 

4. Optional<List<A>>와 Optional<A>의 차이점

  • Optional<List<A>>는 리스트 객체가 존재하는지 여부를 표현하며, 그 리스트가 비어 있는지는 상관하지 않습니다. 리스트가 비어있더라도 Optional 안에 리스트 객체 자체가 존재한다면 isPresent()는 true를 반환합니다.
  • 반면, Optional<A>는 단일 객체가 존재하는지 여부를 나타내며, 값이 없을 경우 isPresent()는 false를 반환합니다.

5. JPA와 Optional의 관계

JPA에서 데이터를 조회할 때, Optional을 활용하면 조회된 값이 없을 때 발생하는 null 문제를 쉽게 처리할 수 있습니다.

 

1) Optional<List<A>>

JPA에서 여러 개의 엔티티를 조회할 때는 List<A> 형태로 반환됩니다. 이때 Optional<List<A>>를 사용하면 리스트가 없을 때 Optional 자체가 비어있음을 표현할 수 있으며, 이를 통해 조회 결과가 없는 상황을 쉽게 처리할 수 있습니다.

public Optional<List<A>> findEntities() {
    return Optional.ofNullable(entityManager.createQuery("SELECT a FROM A a").getResultList());
}

 

2) Optional<A>

단일 엔티티를 조회할 때 Optional<A>를 사용하면, 엔티티가 존재하지 않을 경우의 처리를 간편하게 할 수 있습니다.

public Optional<A> findEntity(Long id) {
    return Optional.ofNullable(entityManager.find(A.class, id));
}

결론

  • Optional<List<A>>와 Optional<A>는 리스트와 단일 객체의 존재 여부를 확인하는 데 유용합니다.
  • isPresent()는 값이 존재하는지 여부를, isEmpty()는 값이 없을 때를 명확하게 나타냅니다.
  • 특히 JPA와 함께 사용할 때 Optional을 이용하면 null 체크를 보다 간편하게 할 수 있습니다.
  • Optional<List<A>>와 Optional<A>의 차이를 이해하고 적절히 사용하는 것이 중요합니다.

Optional을 사용하여 코드의 가독성을 높이고, null 처리를 보다 명확하게 할 수 있습니다.

반응형