중복값 체크를 이따위로?

onlyJoon·2024년 7월 25일
post-thumbnail

코드의 성능과 가독성을 개선하는 것은 소프트웨어 개발의 중요한 부분입니다. 특히 데이터베이스 조회와 같은 작업에서 효율적인 코드를 작성하는 것은 시스템의 전반적인 성능에 큰 영향을 미칩니다.

이번 글에서는 회사에서 사용하는 기존의 중복값 체크 로직을 개선하는 과정을 통해 왜 특정 코드로 변경해야 하는지, 그리고 이러한 변경으로 인해 어떤 장점이 있는지를 알아보겠습니다.

stream().filter()

먼저, 기존의 중복값 체크 로직을 살펴보겠습니다.

long existCount = codeRepo.findAll().stream().filter(e -> e.getCode().equals(code)).count();
if (existCount > 0) {
    // 중복 값 처리 로직
}

이 코드는 codeRepo.findAll()을 호출하여 데이터베이스의 모든 레코드를 가져온 후, Java Stream API를 사용하여 code와 일치하는 레코드를 필터링하고 그 개수를 세어 중복 여부를 확인합니다. 로직의 다른 부분에서 codeRepo.findAll()의 결과를 사용해야 한다면 괜찮은 방법일 수 있지만, 현재는 중복값 확인을 위해서만 사용되고 있습니다.

이 접근 방식의 문제점

  1. 비효율적인 데이터베이스 조회:

    • findAll() 메서드는 데이터베이스의 모든 레코드를 메모리로 로드합니다.
    • 이는 데이터가 많을 경우 메모리 사용량이 급증할 수 있습니다. 또한 모든 데이터를 가져온 후 필터링하는 과정은 불필요한 리소스를 소비하게 됩니다.
  2. 성능 저하:

    • 데이터베이스의 모든 레코드를 가져오는 데 시간이 오래 걸릴 수 있습니다.
    • 스트림 필터링과 카운트 연산이 추가적인 연산 비용을 발생시킵니다.

개선된 코드: existsByCode()

이제 개선된 코드를 살펴보겠습니다.

boolean exist = codeRepo.existsByCode(code);
if (exist) {
    // 중복 값 처리 로직
}

이 코드는 existsByCode() 메서드를 사용하여 데이터베이스에서 code가 존재하는지 여부를 직접 확인합니다.

장점

  1. 효율적인 데이터베이스 조회:

    • existsByCode() 메서드는 데이터베이스에 존재 여부를 묻는 단일 쿼리를 실행합니다. 이는 필요한 데이터만 조회하므로 불필요한 메모리 사용을 줄여줍니다.
    • 데이터베이스가 인덱스를 사용하는 경우, 조회 속도가 매우 빠릅니다.
  2. 성능 향상:

    • 단일 쿼리로 존재 여부를 확인하므로, 대량의 데이터를 메모리로 로드할 필요가 없습니다.
    • 필터링과 카운트 연산이 없으므로 연산 비용이 절감됩니다.
  3. 가독성 및 유지보수성:

    • existsByCode() 메서드는 이름만으로도 코드의 의도를 명확히 전달합니다. 이는 코드 가독성을 높이고, 유지보수 시 코드의 이해를 돕습니다.

자세히

<<작성 예정>>

  • existsByGrpCd를 jpa 메서드로 만들면 결과적으로 어떤 쿼리가 나가는가?
  • 이미 grpCd는 해당 테이블의 PK라면 existsById와 뭐가 다를까?
  • grpCd에 인덱스 설정이 되어있다면?
  • 대규모 데이터에서의 성능 차이는 어떻게 되는가?
  • 데이터 삽입과 중복 체크가 동시에 요청이 들어오면 어떻게 처리해야 하고 어떤 기술이나 인프라들을 사용하면 좋은가?
  • existsbygrpcd를 사용하는 것 외에 다른 방법은 없는지?

결론

이번 포스팅에서는 중복값 체크 로직을 개선하기 위해 stream().filter() 방식을 existsByGrpCd() 방식으로 변경하는 과정을 살펴보았습니다. 이러한 변경을 통해 성능을 향상시키고, 코드의 가독성을 높이며, 유지보수성을 개선할 수 있었습니다. 데이터베이스 조회와 관련된 작업에서는 항상 효율적인 방법을 선택하여 시스템의 전반적인 성능을 최적화하는 것이 중요합니다.

profile
A smooth sea never made a skilled sailor

0개의 댓글