반응형
데이터 리스트에서 특정 조건을 만족하는 엔티티 중 가장 높은 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 설정 필요 |
반응형