기업회원 전체 조회 + 페이지네이션 + 필터링 기능 구현중 발생한 트러블과 기술적 의사결정

금은체리·2024년 6월 22일
0

1. 문제 정의 및 초기 요구사항

기업회원의 전체 조회 기능은 다음과 같은 요구사항을 포함하고 있었습니다:

  • 페이지네이션을 통해 대량의 데이터를 효율적으로 처리
  • 필터링을 통해 사용자가 원하는 조건에 맞는 데이터만 조회
  • 조회 시 각 기업회원의 조회수(viewCount)를 증가시킴

2. 트러블슈팅 과정

문제 1: viewCount 초기화 문제

초기에는 viewCount 필드가 null인 상태로 조회되는 경우가 발생했습니다. 이는 신규 기업회원 등록 시 viewCount가 명시적으로 설정되지 않았기 때문입니다.

해결책: 엔티티 코드에서 viewCount 필드의 디폴트 값을 0으로 설정하였습니다.

@Column(nullable = false, columnDefinition = "INTEGER DEFAULT 0")
private Integer viewCount;
문제 2: 데이터베이스 쿼리 최적화

대량의 기업회원 데이터를 필터링하고 페이지네이션 하면서 성능 이슈가 발생했습니다. 특히, 특정 필드로 정렬 및 필터링하는 과정에서 쿼리 응답 시간이 길어졌습니다.

해결책: 다음과 같은 최적화 작업을 수행했습니다:

  • 인덱스 설정: 자주 필터링 및 정렬에 사용되는 필드에 대해 인덱스를 추가했습니다.
    CREATE INDEX idx_cp_name ON CompanyUsers(cpName);
    CREATE INDEX idx_cp_rating ON CompanyUsers(averageRating);
  • JPQL 및 Criteria API 활용: JPA에서 제공하는 JPQL 및 Criteria API를 통해 동적 쿼리를 생성하고 최적화된 쿼리를 실행했습니다.
    public Page<CompanyUser> findAllWithFilters(String sort, Float minRating, Float maxRating, Pageable pageable) {
        // 동적 쿼리 생성 로직
    }
문제 3: 필터링 로직의 복잡성

필터링 조건이 복잡해지면서 코드의 가독성이 떨어지고 유지보수가 어려워졌습니다.

해결책: 필터링 로직을 별도의 서비스 클래스로 분리하여 책임을 분산시켰습니다.

  • Specification 패턴: JPA Specification을 사용하여 필터링 조건을 캡슐화하고, 이를 조합하여 동적 쿼리를 생성했습니다.
    public class CompanyUserSpecification implements Specification<CompanyUser> {
        @Override
        public Predicate toPredicate(Root<CompanyUser> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
            // 필터링 조건 로직
        }
    }

3. 기술적 의사결정

의사결정 1: 페이지네이션 전략 선택

페이지네이션은 클라이언트와 서버 간의 데이터 전송량을 줄이고 응답 속도를 개선하기 위해 필수적입니다. 이를 위해 Spring Data JPA의 Pageable 인터페이스를 활용했습니다.

  • 장점: 표준화된 방식으로 쉽게 페이지네이션을 구현할 수 있으며, Spring Data JPA에서 제공하는 다양한 기능을 활용할 수 있습니다.
  • 결정 이유: 복잡한 커스터마이징 없이도 강력한 페이지네이션 기능을 제공하며, 프로젝트의 유지보수성을 높일 수 있습니다.
의사결정 2: 동적 필터링 구현

기업회원 조회 시 다양한 조건으로 필터링할 수 있도록 요구되었습니다. 이를 위해 Criteria API와 Specification 패턴을 도입했습니다.

  • 장점: 동적 쿼리를 효율적으로 생성할 수 있으며, 코드의 재사용성과 가독성을 높일 수 있습니다.
  • 결정 이유: 다양한 필터링 조건을 유연하게 처리할 수 있으며, 추후 필터링 조건이 추가되거나 변경되더라도 쉽게 확장할 수 있습니다.
의사결정 3: 조회수 증가 로직

기업회원 프로필 조회 시마다 viewCount를 증가시키는 요구사항이 있었습니다. 이를 트랜잭션 내부에서 처리하여 데이터의 일관성을 보장했습니다.

  • 장점: 트랜잭션 내에서 안전하게 조회수 증가 로직을 처리할 수 있으며, 동시성 문제를 예방할 수 있습니다.
  • 결정 이유: 데이터의 일관성과 무결성을 보장하기 위해 트랜잭션 내에서 처리하는 것이 적절하다고 판단했습니다.

4. 결론

이번 기업회원 전체 조회, 페이지네이션 및 필터링 기능 구현은 다음과 같은 트러블슈팅과 기술적 의사결정을 통해 성공적으로 완성되었습니다:

  • viewCount 필드 초기화 문제 해결
  • 데이터베이스 쿼리 최적화
  • 필터링 로직의 복잡성 해소
  • 페이지네이션 및 동적 필터링 전략 결정

이 과정에서 성능과 유지보수성을 고려한 다양한 최적화 작업과 디자인 패턴을 적용하였으며, 이를 통해 보다 효율적이고 확장 가능한 시스템을 구축할 수 있었습니다.

profile
전 체리 알러지가 있어요!

0개의 댓글