티스토리 뷰

반응형

PHP와 MySQL을 활용해 데이터를 검색할 때, 효율적으로 작성된 SQL 쿼리는 성능을 크게 좌우합니다. 특히 다양한 조건에서 데이터를 검색하고, 중복된 데이터를 제거하는 작업이 필요할 경우, 잘 설계된 쿼리와 준비된(Prepared) 문장은 중요한 역할을 합니다. 이번 포스팅에서는 PHP와 PDO를 사용해 특정 steel_item과 spec을 검색하는 예제를 알아봅니다. 이 코드는 세 개의 데이터 테이블을 참조하

며, 검색 조건에 따라 동적으로 동작하도록 설계되었습니다.

 

코드 설명

아래의 코드는 두 가지 주요 조건에서 동작합니다.

  1. 사용자가 특정 steel_item과 search 값을 입력한 경우.
  2. search 값 없이 steel_item만 입력한 경우.

이 두 가지 경우에 따라 쿼리를 분리해 처리하고 있습니다.

1. search 값이 입력된 경우

사용자가 특정 검색어를 입력하면, 검색어를 포함하는 데이터를 가져오도록 설계되었습니다. 세 개의 테이블(eworks, steelmake, steel)에서 데이터를 검색하고, 각 테이블의 steel_item과 spec 필드를 통합합니다.

if (!empty($search)) {
    $stmt_unique = $pdo->prepare("  
        SELECT DISTINCT TRIM(steel_item) AS steel_item, TRIM(spec) AS spec
        FROM eworks
        WHERE is_deleted IS NULL
          AND TRIM(steel_item) = :steel_item
          AND spec LIKE :search
        UNION
        SELECT DISTINCT TRIM(proditem) AS steel_item, TRIM(prodspec) AS spec
        FROM steelmake
        WHERE is_deleted IS NULL
          AND TRIM(proditem) = :steel_item2
          AND prodspec LIKE :search2
        UNION
        SELECT DISTINCT TRIM(steel_item) AS steel_item, TRIM(spec) AS spec
        FROM steel
        WHERE is_deleted IS NULL
          AND TRIM(steel_item) = :steel_item3
          AND spec LIKE :search3
    ");

    $stmt_unique->execute([
        ':steel_item' => trim($steel_item),
        ':search' => "%$search%",
        ':steel_item2' => trim($steel_item),
        ':search2' => "%$search%",
        ':steel_item3' => trim($steel_item),
        ':search3' => "%$search%"
    ]);
}

주요 포인트:

  • TRIM() 함수: 데이터를 검색할 때 불필요한 공백을 제거하여 정확한 검색을 보장합니다.
  • LIKE 연산자: %$search%로 감싸 검색어를 포함하는 데이터를 찾습니다.
  • UNION: 세 테이블에서 반환된 결과를 통합하고 중복된 항목을 제거합니다.

2. search 값이 입력되지 않은 경우

search 값 없이 특정 steel_item만으로 데이터를 검색해야 할 경우에는 아래 코드가 실행됩니다. 이는 모든 spec 데이터를 반환하며, search 조건을 제거한 간단한 구조로 작성되었습니다.

else {
    $stmt_unique = $pdo->prepare("  
        SELECT DISTINCT TRIM(steel_item) AS steel_item, TRIM(spec) AS spec
        FROM eworks
        WHERE is_deleted IS NULL
          AND TRIM(steel_item) = :steel_item
        UNION
        SELECT DISTINCT TRIM(proditem) AS steel_item, TRIM(prodspec) AS spec
        FROM steelmake
        WHERE is_deleted IS NULL
          AND TRIM(proditem) = :steel_item2
        UNION
        SELECT DISTINCT TRIM(steel_item) AS steel_item, TRIM(spec) AS spec
        FROM steel
        WHERE is_deleted IS NULL
          AND TRIM(steel_item) = :steel_item3
    ");

    $stmt_unique->execute([
        ':steel_item' => trim($steel_item),
        ':steel_item2' => trim($steel_item),
        ':steel_item3' => trim($steel_item)
    ]);
}

주요 포인트:

  • 동일한 steel_item 조건: 세 테이블에서 동일한 steel_item에 해당하는 데이터를 모두 가져옵니다.
  • 단순화된 조건: 검색어를 추가하지 않아 조건문이 단순합니다.

코드 실행 흐름

  1. search 값이 있는지 확인:
    • !empty($search) 조건을 사용하여 검색어가 비어 있는지 체크합니다.
  2. SQL 쿼리 작성:
    • 조건에 따라 WHERE 문에 LIKE 절을 추가하거나 생략합니다.
  3. Prepared Statement 실행:
    • execute() 메서드에 파라미터를 배열로 전달하여 안전한 쿼리 실행을 보장합니다.

활용 시나리오

이 코드는 다음과 같은 경우에 적합합니다:

  • 재고 관리 시스템: 철강 제품의 종류와 사양을 빠르게 검색해야 할 때.
  • 상품 검색 기능: 사용자 입력에 따라 특정 제품을 필터링해야 할 때.
  • 중복 데이터 제거: 여러 테이블에서 데이터를 조회하며 중복 항목을 통합해야 할 때.

성능 최적화 팁

  1. 인덱스 활용: steel_item과 spec 컬럼에 인덱스를 설정하면 검색 속도가 향상됩니다.
  2. 필요 없는 데이터 필터링: is_deleted IS NULL 조건을 통해 삭제된 데이터를 배제합니다.
  3. Prepared Statement: SQL 인젝션 공격을 방지하고 쿼리 실행 속도를 높이는 데 도움을 줍니다.

결론

PHP와 PDO를 활용한 검색 쿼리 작성법은 효율적인 데이터 관리를 가능하게 합니다. 이 코드 구조는 다양한 시나리오에서 활용할 수 있으며, 중복 제거와 조건별 검색이 필요한 상황에 특히 유용합니다. 적절한 데이터 정리와 조건 설정을 통해 시스템의 성능과 안정성을 함께 향상시킬 수 있습니다.

반응형
댓글