데이터 베이스/데이터베이스 기본

Ch01. 내부 조인 - 조인이 필요한 이유

webmaster 2026. 5. 23. 16:37

대표님이 "최근 주문 현황을 고객 이름과 상품명을 포함해서 보고서로 만들어줘!"라고 요청했다고 가정하자.

우리는 앞서 쇼핑몰 운영에 필요한 users , products , orders 테이블을 만들고 데이터를 입력했다. 주문 현황이 필요하기 때문에 orders 의 정보를 제공하면 같다.

select * from orders;

Orders 결과

  • 대표님의 요구사항은 "최근 주문 현황을 고객 이름과 상품명을 포함해서 보고서로 만들어줘!"라는 것이었다. 그런데 orders 테이블에는 고객 이름과 상품명이 없다. 이 테이블만 보고서는 user_id가 1인 고객이 누구인지, product_id가 4인 상품이 무엇인지 즉시 알 수가 없다.
  • 추가 과정이 필요하다.
    • 고객 이름을 구하기 위해서는 users 테이블을 통해 user_id 에 해당하는 고객명을 하나하나 직접 찾아야 한다
    • 상품명을 구하기 위해서는 products 테이블을 통해 product_id 해당하는 상품명을 하나하나 직접 찾아야 한다.

데이터를 여러 테이블에 나누어 저장하는 이유

만약 모든 데이터가 한 곳에 저장된다면??

  • 데이터 중복
    • "션" 고객이 상품을 100 주문했다고 생각해 보자. 그의 이름, 이메일, 주소 정보가 100번이나 불필요하게 반복 저장된다. 이건 매우 저장 공간의 낭비다.
  • 갱신 이상
    • 만약 "션" 고객이 이메일 주소를 변경했다고 가정해 보자. 우리는 "션" 주문한 100개의 주문 데이터를 모두 찾아, 이메일 정보를 일일이 새로운 주소로 변경해야 한다.
    • 만약 실수로 하나라도 누락한다면? 어떤 주문에서는 고객의 이메일이 예전 주소로, 다른 주문에서는 주소로 저장되어 데이터의 일관성이 깨져버린다. 어떤 정보가 진짜인지 믿을 없게 되는 것이다.
  • 삽입 이상
    • 우리 쇼핑몰에 아직 아무도 주문하지 않은 새로운 상품 '초경량 노트북' 등록하고 싶다. 하지만 테이블 구조에서는 "주문" 발생해야만 데이터를 추가할 있다. 주문한 사람이 없으니, 상품 정보조차 등록할 없는 말도 안 되는 상황이 발생한다.
  • 삭제 이상
    • "이순신" 고객이 주문한 기록이 있다고 하자. 만약 회사 정책상 주문 기록을 삭제해야 한다면 어떻게 ?
    • 주문 데이터를 삭제하는 순간, '이순신' 고객의 이름, 이메일, 주소 정보까지 데이터베이스에서 영원히 사라져 버릴 있다. 우리는 단지 주문 내역 하나를 지웠을 뿐인데, 소중한 고객 정보까지 잃게 되는 것이다.

이러한 문제들 때문에 우리는 데이터베이스를 설계할 정규화(Normalization)라는 과정을 거친다. 정규화는 데이터의 중복을 최소화하고, 데이터의 일관성을 해치는 '이상 현상'들을 방지하기 위해 데이터를 논리적인 단위로 분리하는 과정이다. 우리가 "users", "products" , "orders"로 테이블을 나눈 것이 바로 정규화의 결과물이다.

 

조인이 필요한 이유

관리하기 위해 흩어놓은 데이터에서 의미 있는 정보를 얻으려면, 흩어진 조각들을 다시 합쳐야만 한다. "어떤 고객이 어떤 상품을 주문했는지" 같은 통합된 보고서를 만들기 위해, 분리된 테이블들을 다시 연결해야 하는 것이다.

 

이때 사용하는 기술이 바로 조인(JOIN)이다.

  • 조인은 두 개 이상의 테이블을 특정 컬럼을 기준으로 연결하여, 마치 처음부터 하나의 테이블이었던 것처럼 보여주는 기능이다.
  • 보통 테이블을 설계할 연결고리로 사용하는 "기본 (Primary Key)"와 "외래 (Foreign Key)"를 용해 이들을 합친다.

조인은 데이터 정규화(분리)를 통해 얻는 일관성과 효율성의 장점은 그대로 유지하면서, 우리가 원하는 통합된 정보를 얻을 수 있게 해주는, 데이터 분리와 통합을 완성하는 기술이다.