HSEOM GeckoHSEOM
Instagram

흑섬 TECH 블로그 - 데이터 기반 브리딩 기술

레오파드게코 브리딩에 데이터 분석과 AI 기술을 접목합니다. Python, NumPy를 활용한 체중 관리, 성장 추이 분석, 환경 데이터 시각화 등 실무에서 직접 사용하는 기술을 일반인도 이해하기 쉽게 설명합니다.

주요 카테고리

Data Viz 카테고리

NumPy, Pandas를 활용한 데이터 분석과 시각화 기술을 일상 예제로 쉽게 설명합니다.

12개의 글이 있습니다.

[SQL 실습 #2] 도서관 대출 시스템 테이블 구조 만들기

1:N 관계와 Foreign Key 개념을 배우고 JOIN 쿼리로 여러 테이블을 연결합니다. 회원, 도서, 대출 기록 3개 테이블로 관계형 데이터베이스를 완성합니다.

카테고리: Data Viz

작성일: 2026-01-26

예상 읽기 시간: 15

Back to Tech
Data Viz·15min read·

[SQL 실습 #2] 도서관 대출 시스템 테이블 구조 만들기

1:N 관계와 Foreign Key 개념을 배우고 JOIN 쿼리로 여러 테이블을 연결합니다. 회원, 도서, 대출 기록 3개 테이블로 관계형 데이터베이스를 완성합니다.

시작 전, 워밍업

도서관 앱에서 "누가 어떤 책을 빌렸나" 정보는 어디에 저장될까?
회원 정보는 회원 테이블에, 책 정보는 도서 테이블에.
그럼 "회원이 책을 빌렸다"는 기록은?

시작하며 - 관계를 설계한다는 것

지난 글에서는 학생 정보 데이터베이스를 만들었습니다.
테이블 하나로 완성되는 간단한 구조였죠.

그런데 실제 세상의 데이터는 대부분 관계가 있습니다.
"회원이 책을 빌린다"
"학생이 수업을 듣는다"
"고객이 상품을 구매한다"

이번 실습에서는 도서관 대출 시스템을 만들면서
여러 테이블을 연결하는 방법을 배워봅니다.

"한 회원이 여러 책을 빌릴 수 있다."
이 한 문장을 데이터베이스로 표현하려면 어떻게 해야 할까요?


ERD 설계하기

코드를 작성하기 전에, 먼저 설계도를 그려봅시다.

필요한 Entity (개체)

도서관 대출 시스템에 필요한 것들:

  • members (회원) - 도서관 회원 정보
  • books (도서) - 도서 목록
  • loans (대출 기록) - 누가 언제 어떤 책을 빌렸는지

테이블 구조

1. members 테이블

  • member_id (회원 ID) - Primary Key
  • name (이름)
  • email (이메일)

2. books 테이블

  • book_id (도서 ID) - Primary Key
  • title (제목)
  • author (저자)

3. loans 테이블

  • loan_id (대출 ID) - Primary Key
  • member_id (회원 ID) - Foreign Key → members.member_id
  • book_id (도서 ID) - Foreign Key → books.book_id
  • loan_date (대출일)
  • return_date (반납일)
도서관 시스템 ERD

members, books, loans 테이블과 관계선 (Foreign Key)

Foreign Key란?
다른 테이블의 Primary Key를 참조하는 컬럼입니다.
loans.member_id는 members.member_id를 가리키고,
loans.book_id는 books.book_id를 가리킵니다.
이렇게 테이블끼리 관계가 만들어집니다.


테이블 생성하기

이제 3개의 테이블을 차례대로 만들어봅시다.

1. members 테이블 생성

CREATE TABLE members (
    member_id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT
);
CREATE TABLE members 실행

회원 테이블 생성

2. books 테이블 생성

CREATE TABLE books (
    book_id INTEGER PRIMARY KEY,
    title TEXT NOT NULL,
    author TEXT
);
CREATE TABLE books 실행

도서 테이블 생성

3. loans 테이블 생성 (Foreign Key 포함)

CREATE TABLE loans (
    loan_id INTEGER PRIMARY KEY,
    member_id INTEGER,
    book_id INTEGER,
    loan_date DATE,
    return_date DATE,
    FOREIGN KEY (member_id) REFERENCES members(member_id),
    FOREIGN KEY (book_id) REFERENCES books(book_id)
);

코드 설명:

  • FOREIGN KEY (member_id) REFERENCES members(member_id) - member_id는 members 테이블의 member_id를 참조
  • FOREIGN KEY (book_id) REFERENCES books(book_id) - book_id는 books 테이블의 book_id를 참조
CREATE TABLE loans 실행

대출 기록 테이블 생성 - Foreign Key 제약 조건 포함


데이터 입력하기

테이블 3개가 만들어졌으니, 이제 데이터를 넣어봅시다.

1. members 데이터 입력

INSERT INTO members (member_id, name, email)
VALUES
    (1, '김독서', 'kim@example.com'),
    (2, '이책벌레', 'lee@example.com'),
    (3, '박다독', 'park@example.com');
회원 데이터 입력

회원 3명 데이터 입력 완료

2. books 데이터 입력

INSERT INTO books (book_id, title, author)
VALUES
    (1, '해리포터', 'J.K. 롤링'),
    (2, '반지의 제왕', 'J.R.R. 톨킨'),
    (3, '어린왕자', '생텍쥐페리'),
    (4, '1984', '조지 오웰'),
    (5, '데미안', '헤르만 헤세');
도서 데이터 입력

도서 5권 데이터 입력 완료

Browse Data 탭에서 books 테이블을 선택하면, 5권의 책이 보입니다.

도서 목록 확인

Browse Data 탭에서 도서 목록 확인

3. loans 데이터 입력

INSERT INTO loans (loan_id, member_id, book_id, loan_date, return_date)
VALUES
    (1, 1, 1, '2026-02-01', NULL),
    (2, 1, 3, '2026-02-05', '2026-02-10'),
    (3, 2, 2, '2026-02-03', NULL),
    (4, 3, 4, '2026-02-07', '2026-02-12');

데이터 설명:

  • loan_id 1: 김독서(1)가 해리포터(1)를 2/1에 빌림, 아직 반납 안 함 (NULL)
  • loan_id 2: 김독서(1)가 어린왕자(3)를 2/5에 빌려서 2/10에 반납함
  • loan_id 3: 이책벌레(2)가 반지의 제왕(2)를 2/3에 빌림, 아직 반납 안 함
  • loan_id 4: 박다독(3)이 1984(4)를 2/7에 빌려서 2/12에 반납함
대출 기록 입력

대출 기록 4건 입력 완료

대출 기록 확인

Browse Data 탭에서 대출 기록 확인


JOIN - 테이블 연결하기

지금 loans 테이블을 보면, member_id와 book_id만 숫자로 보입니다.
"누가 어떤 책을 빌렸는지" 알려면 여러 테이블을 연결해야 해요.

이때 사용하는 게 JOIN입니다.

JOIN 쿼리 작성하기

SELECT
    members.name AS 회원명,
    books.title AS 도서명,
    loans.loan_date AS 대출일
FROM loans
JOIN members ON loans.member_id = members.member_id
JOIN books ON loans.book_id = books.book_id;

코드 설명:

  • FROM loans - loans 테이블에서 시작
  • JOIN members ON loans.member_id = members.member_id - members 테이블과 연결 (member_id로)
  • JOIN books ON loans.book_id = books.book_id - books 테이블과 연결 (book_id로)
  • AS - 컬럼 이름을 한글로 바꿔서 보여줌
JOIN 쿼리 코드

3개 테이블을 연결하는 JOIN 쿼리

JOIN 결과 확인

실행하면, 숫자(ID)가 아니라 실제 이름으로 보입니다!

JOIN 쿼리 결과

회원명과 도서명이 함께 조회됩니다

이제 "김독서가 해리포터를 빌렸구나" 한눈에 알 수 있습니다.


실전 쿼리 예시

JOIN을 활용한 유용한 쿼리들을 알아봅시다.

1. 미반납 도서 조회

아직 반납하지 않은 책(return_date가 NULL)을 찾아봅시다.

SELECT
    members.name AS 회원명,
    books.title AS 도서명,
    loans.loan_date AS 대출일
FROM loans
JOIN members ON loans.member_id = members.member_id
JOIN books ON loans.book_id = books.book_id
WHERE loans.return_date IS NULL;

결과:

  • 김독서 - 해리포터 (2026-02-01)
  • 이책벌레 - 반지의 제왕 (2026-02-03)

2. 특정 회원의 대출 이력

SELECT
    books.title AS 도서명,
    loans.loan_date AS 대출일,
    loans.return_date AS 반납일
FROM loans
JOIN books ON loans.book_id = books.book_id
WHERE loans.member_id = 1;

김독서(member_id=1)가 빌렸던 모든 책을 볼 수 있습니다.


축하합니다!

여러분은 관계형 데이터베이스를 만들었습니다.

배운 내용 정리:

  • Foreign Key - 다른 테이블의 Primary Key 참조
  • 1:N 관계 - 한 회원이 여러 책을 빌릴 수 있음
  • JOIN - 여러 테이블을 연결해서 조회
  • WHERE - JOIN과 함께 조건 필터링

실생활 응용
이 구조를 응용하면 다양한 관계를 관리할 수 있습니다.
예를 들어:

  • 블로그 시스템: users(회원), posts(게시물), comments(댓글)
  • 쇼핑몰: customers(고객), products(상품), orders(주문)
  • 학원 관리: students(학생), courses(강좌), enrollments(수강)

레오파드 게코 급여 기록이라면?
individuals(개체), feeders(먹이 종류), feeding_logs(급여 기록)으로
"어떤 개체가 언제 무엇을 먹었나"를 추적할 수 있어요.


다음 글 예고

다음 실습에서는 주차 관리 시스템을 만들어봅니다.
이번엔 시간 데이터를 다루는 법을 배워요.

"입차 시간 - 출차 시간 = 요금 계산"
실시간으로 변하는 데이터를 데이터베이스로 어떻게 관리할까요?

다음 글에서 만나요! 👋

#SQL#JOIN#Foreign Key#1:N 관계#실습