본문 바로가기
Backend

JAVA - 조건에 따라 검색된 엔티티 중 가장 높은 PK 값을 가진 엔티티 찾기

by 재성스 2025. 2. 11.
반응형

데이터 리스트에서 특정 조건을 만족하는 엔티티 중 가장 높은 PK 값을 가진 엔티티를 찾는 방법은 여러 가지가 있습니다. 특히 Java Stream API, Collections, Comparator, Spring Data JPA, 그리고 Querydsl을 활용하면 효율적으로 최댓값을 가진 엔티티를 찾을 수 있습니다.

이번 글에서는 조건을 추가하여 최댓값을 가진 엔티티를 찾는 방법을 정리해보겠습니다.

1. Java Stream API 활용 (가장 간결한 방법)

Optional<Entity> maxEntity = list.stream()
    .filter(entity -> entity.getStatus().equals("ACTIVE"))  // 특정 조건 적용
    .max(Comparator.comparing(Entity::getId));  // ID 값 기준 최댓값 찾기

maxEntity.ifPresent(entity -> System.out.println(entity.getId()));
  • .filter(entity -> 조건): 조건을 만족하는 엔티티만 필터링
  • .max(Comparator.comparing(Entity::getId)): 가장 높은 ID 값을 가진 엔티티 찾기
  • Optional<Entity>을 반환하여 ifPresent()로 값이 존재할 때만 처리

가장 간결한 코드이지만, 데이터가 많으면 성능 부담이 있을 수 있습니다.

 

2. Collections.max() 사용

List<Entity> filteredList = list.stream()
    .filter(entity -> entity.getStatus().equals("ACTIVE"))  // 특정 조건 적용
    .collect(Collectors.toList());

Entity maxEntity = Collections.max(filteredList, Comparator.comparing(Entity::getId));

System.out.println(maxEntity.getId());
  • .filter(entity -> 조건): 조건을 만족하는 엔티티 리스트로 변환
  • Collections.max(filteredList, Comparator.comparing(Entity::getId)): 최댓값을 가진 엔티티 반환

이 방법은 가독성이 좋고 직관적이지만, 리스트를 추가로 생성해야 하므로 메모리 사용량이 증가할 수 있습니다.

 

3. SQL에서 바로 가져오기 (Spring Data JPA 활용)

데이터가 많다면 findAll()을 사용하지 않고, JPA를 이용해 조건을 만족하는 엔티티 중 가장 높은 ID 값을 가진 엔티티를 직접 조회하는 것이 더 효율적입니다.

@Query("SELECT e FROM Entity e WHERE e.status = :status ORDER BY e.id DESC LIMIT 1")
Entity findMaxIdEntity(@Param("status") String status);
  • 필터링과 정렬을 SQL에서 직접 수행하여 애플리케이션 메모리를 절약
  • 데이터가 많을 때 가장 효율적인 방법
  • ORDER BY e.id DESC LIMIT 1 → 조건을 만족하는 엔티티 중 가장 높은 PK 값을 가진 엔티티를 반환

이 방법을 사용하면 대량의 데이터가 있는 경우 가장 좋은 성능을 제공할 수 있습니다.

 

4. Querydsl 활용 (동적 쿼리 가능)

public Entity findMaxIdEntityWithQuerydsl(String status) {
    QEntity entity = QEntity.entity;

    return queryFactory
        .selectFrom(entity)
        .where(entity.status.eq(status))
        .orderBy(entity.id.desc())
        .limit(1)
        .fetchOne();
}
  • queryFactory.selectFrom(entity).where(entity.status.eq(status))
    • 조건을 만족하는 엔티티 필터링
  • .orderBy(entity.id.desc()).limit(1).fetchOne()
    • 가장 높은 PK 값을 가진 엔티티 하나만 반환

Querydsl을 사용하면 복잡한 동적 쿼리도 쉽게 구현할 수 있으며, 코드의 가독성을 높일 수 있습니다.

 

결론: 어떤 방법을 선택할까?

방법 장점 단점
Stream API (max()) 간결하고 가독성이 좋음 데이터가 많으면 성능 저하
Collections.max() 사용법이 직관적 리스트를 추가로 생성해야 함
JPA 쿼리 (@Query) 성능적으로 가장 효율적 DB 접근이 필요
Querydsl (max()) 동적 쿼리 가능, 가독성이 좋음 Querydsl 설정 필요
반응형