[sellFarm] DB-Table JOIN

silverKi·2023년 9월 29일

sellFarm

목록 보기
4/8

셀팜(sellFarm) 프로젝트를 진행하면서, 서로 다른 table에 있는 칼럼들을 하나의 table로 만들어 같은 페이지에 노출해야 하는 작업이 있었다.

✅ JOIN을 적용한 이유

나는 주문내역 페이지 부분을 담당 하였는데, 이전의 주문내역에는 사용자가 구매한 상품명이 노출되지 않고 "주문번호가 노출"이 되어 사용자 입장에서 "매번 주문번호를 클릭하여야만 자신이 구매한 상품이 무엇인지 알 수 있어" 다소 불편하다고 생각했다.

그래서 "주문내역에 주문번호와 상품명을 같이 노출"하여 클릭하지 않아도 바로 볼 수 있게 하고 싶었다. 그러기 위해서 일단 주문내역page에서 어떤 table을 참조하고 있는지 살펴볼 필요가 있었다.


🧩 JOIN문 작성하기

변경 전 코드

    $sql = " select * from {$g5['g5_shop_order_table']}
            where mb_id = '{$member['mb_id']}' {$sql_where}
            order by od_id desc $limit ";

하나의 table만 참조하고 있었고 g5_shop_order_table에는 상품명을 나타내는 칼럼이 존재하지 않았고, 주문번호 칼럼만 보유하고 있었다. 따라서 주문번호를 갖고 있는 다른 table을 찾았고, 주문번호라는 공통 칼럼을 이용하여 서로 다른 table을 INNER JOIN 하는 것으로 방향을 잡았다.

변경 후의 코드

$sql_common = "from {$g5['g5_shop_order_table']} o
              join {$g5['g5_shop_cart_table']} c on o.od_id = c.od_id
              where o.mb_id = '{$member['mb_id']}'";
                        
$sql = "select c.ba_id, o.od_id, o.od_time, o.od_cart_count, c.it_name,
        o.od_cart_price + o.od_send_cost + o.od_send_cost2 as total_cost,
        o.od_status, o.od_invoice
      $sql_common order by o.od_id desc $limit ";

위 쿼리의 구조를 살펴보면:

1. {$g5['g5_shop_order_table']} o : g5_shop_order_table에서 레코드를 선택하고 이 테이블을 o라는 별칭을 사용하여 참조한다.

2. join {$g5['g5_shop_cart_table']} c on o.od_id = c.od_id: g5_shop_cart_table를 c로 참조하며, o.od_id와 c.od_id가 일치하는 레코드를 찾아 조인한다.

3. where o.mb_id = '{$member['mb_id']}': o.mb_id가 지정된 mb_id와 일치하는 레코드만 필터링한다.(사용자 별로 주문내역이 다르기 때문) 이후에는 select 문을 사용하여 필요한 특정 필드만을 선택해 가져온다.

사용자('{$member['mb_id']}')의 주문과 카트 정보를 결합하여 반환하여 사용자가 주문한 상품명도 같이 나타날수 있게 변경하였다.

데이터베이스 table JOIN은 두 개 이상의 테이블에서 관련된 정보를 함께 가져오는 데 사용된다. 이를 통해 효율적으로 복잡한 쿼리를 수행할 수 있다. 위의 코드는 사용자의 주문 정보와 카트 정보를 한번에 가져오기 위해 조인을 사용하였다.

🧩 해결 방식 : INNER JOIN

JOIN에 대해 얘기할 때는 보통 INNER JOIN을 지칭하는데, 테이블 데이터 간 교집합과 비슷하다. 두 테이블의 공통 속성을 이용하여 table을 확장한다.
테이블 조인에 대한 조건은 ON, 데이터 필터링에 대한 조건은 WHERE을 사용한다.

✅ JOIN 사용시 주의 사항

  • SQL 작성을 명확히
    SQL을 어떻게 작성하느냐에 따라 성능이 크게 좌우된다. 어떤 질의를 수행할 것인지를 명확하게 정의한 후, 비효율을 제거하여 최적의 SQL을 작성해야 한다.

  • 명확한 조인 조건 제공
    조인 조건을 명확하게 제공하지 않을 경우, 의도치 않게 CROSS JOIN이 수행될 수 있다.

  • 조인할 대상의 집합을 최소화
    집합을 최소화할 방법이 있으면, 조건을 먼저 적용하여 관계를 맺을 집합을 최소화한 후, 조인을 맺는 것이 효율적이다.

profile
아악! 뜨거워!!

0개의 댓글