안녕하세요 저번 게임 아이템 거래 사이트 구현에서는 JSON을 사용하였습니다. 앞에 블로그에서 JSON을 사용한 이유는 전체 구조에 대한 흐름을 이해하려고 사용했습니다. 사실상 보안이나 최적화 검색, 대용량 데이터 처리 및 관리, 많은 사용자가 이용을 할 경우 꼬이는 한계가 있다는것을 알고 있었으며 그렇기에 이번 주제는 기존의 아이템 거래 사이트 구현 + MYSQL 활용입니다.
목차
1. JSON과 MYSQL 차이
2. MYSQL스키마 구조
3. 테이블 설계
4. 서버와 MYSQL 연결 구조
5. 앞으로의 개선 방향성
1. JSON과 MYSQL 차이
| 특징 | 기존 (JSON 파일) | 변경 (MySQL) |
| 데이터 저장 | 로컬 .json 파일 | 데이터베이스 테이블 |
| 확장성 | 데이터가 늘어날수록 관리가 힘듦 | 수백만 개의 데이터도 효율적으로 관리 |
| 보안 | 비밀번호 등 민감 정보 노출 위험 | 암호화 및 접근 권한 설정 가능 |
| 검색 로직 | 전체 배열을 돌며 필터링 (느림) | SQL 쿼리를 통한 고속 검색 (빠름) |
2. MYSQL스키마 구조

3. 테이블 설계
(FK)
| 테이블 | 컬럼(FK) | 제약조건 이름 | 참조 테이블 | 참조 컬럼(PK) |
| inventory | user_id | inventory_ibfk_1 | users | id |
| inventory | item_id | inventory_ibfk_2 | item | id |
| trade_history | buyer_id | fk_history_buyer | users | id |
| trade_history | item_id | fk_history_item | item | id |
| trade_history | seller_id | fk_history_seller | users | id |
| trades | item_id | fk_trades_item | item | id |
| trades | seller_id | fk_trades_seller | users | id |
-item테이블-
item 테이블은 아이템의 기본 정보를 저장하는 핵심 테이블입니다.
아이템의 세부 능력치, 이미지 경로, 메인 카테고리 및 서브 카테고리 등
사이트의 기본 화면 구성에 필요한 컬럼들을 포함하고 있습니다.

item 테이블의 Primary Key인 id는 다음 테이블들과 Foreign Key로 연결되어 있습니다.
- trades
- trade_history
- inventory
이를 통해
- 사용자에게 보여지는 아이템 상세 정보
- 거래 진행 시 해당 아이템 정보
- 거래 완료 후 기록되는 아이템 정보
- 사용자의 인벤토리 정보
를 모두 일관성 있게 관리할 수 있도록 설계했습니다.
※ inventory 테이블은 아래에서 추가로 설명하겠습니다.
idx_item_name 인덱스는 자동 검색 기능을 위해 생성했습니다.
사용자는 아이템 ID가 아닌 아이템 이름으로 검색하기 때문에,
item_name 컬럼에 인덱스를 설정하여 검색 속도를 최적화했습니다.
-users테이블-
users 테이블은 사용자 계정 정보를 관리하는 테이블입니다.
Primary Key인 id는 로그인 인증 및 아이템 거래 과정에서
사용자를 식별하는 기준 값으로 사용됩니다.

사용자는 로그인 시 ID가 아닌 닉네임(username) 을 입력합니다.
만약 인덱스가 없다면, 사용자 수가 많아질 경우 로그인 시 전체 레코드를 하나씩 비교해야 합니다.
이를 방지하기 위해 username 컬럼에 인덱스를 설정하여 로그인 속도를 최적화했습니다.
또한 UNIQUE 제약 조건을 추가하여 중복 회원가입을 방지하도록 설계했습니다.
username_2 인덱스는 테스트 과정에서 중복 생성된 것으로, 현재 구조상 의미가 없기 때문에 무시하셔도 됩니다.
.
-trades테이블-
trades 테이블은 사이트 내 거래 게시글을 관리하는 테이블입니다.
- 아이템 정보 불러오기
- 구매(buy) / 판매(sell) 구분
- 게시글 작성 정보 저장
을 담당합니다.

이 테이블을 통해 누가, 어떤 아이템을, 어떤 방식으로, 언제 등록했는지 확인할 수 있습니다.
또한 item, users 테이블과 Foreign Key로 연결하여 거래가 어떤 아이템이며 어떤 사용자인지
정확하게 매핑되도록 설계했습니다.
-trade_history테이블-
trade_history 테이블은 거래 완료 이력을 저장하는 테이블입니다.

사용자는 자신이 어떤 상품을 구매 또는 판매했는지 내역 리스트 형태로 확인할 수 있습니다.
즉, 단순 게시글이 아닌 거래 완료 기록을 보관하는 로그 테이블의 역할을 합니다.
-inventory테이블-
inventory 테이블은 사용자와 아이템 간의 관계를 관리하는 중간 매핑 테이블입니다.
현재는 거래 게시글 CRUD 기능까지만 구현되어 있어 실제 사용되지는 않습니다.
하지만 향후
- 거래 완료 처리
- 아이템 소유권 이전
- 사용자별 보유 아이템 목록 관리
기능을 확장할 것을 고려하여 미리 설계해두었습니다.
4. 서버와 MYSQL 연결 구조

| Client (Browser) | 사용자가 버튼을 누르거나 데이터를 입력합니다. |
| Server (Node.js/VS Code) | 사용자 요청을 받아 SQL 문으로 변환해 DB에 전달합니다. |
| Database (MySQL) | 요청받은 데이터를 찾거나, 새 데이터를 저장합니다. |
| Response | DB에서 나온 결과가 서버를 거쳐 다시 사용자에게 보입니다. |
1) users테이블

2) item, inventory테이블

3) trades,trade_history테이블

5. 앞으로의 개선 방향성
이번 프로젝트를 진행하면서 가장 크게 느낀 점은 데이터베이스(DB) 유무에 따른 구조적 차이였습니다.
기존 JSON 기반 구조와 비교했을 때, DB를 직접 구축하고 서버와 연동하는 과정은 단순 기능 구현을 넘어
전체 시스템 흐름을 이해하는 데 큰 도움이 되었습니다.
이번 프로젝트에서는 MySQL을 직접 설계하고 연결해보는 것 자체에 의미를 두었으며, 이를 통해 데이터 관계 설계, FK 구조 이해, 인덱스 최적화 등 백엔드 구조에 대한 이해도를 높일 수 있었습니다.
다만, 현재 아이템 거래 사이트를 다시 돌아보면 UI/UX 디자인 측면이나 기능 확장성 부분에서 아직 개선할 여지가 많다고 느꼈습니다. 최근 AI를 활용해 페이지별 이미지를 생성해보는 시도도 해보았지만, 아직 완성도나 일관성 측면에서 부족한 부분이 있었습니다. 따라서 앞으로의 방향성은 다음과 같습니다.
- 기존 프로젝트에 DB를 단계적으로 확장 적용
- 거래 완료 로직 및 인벤토리 소유권 이전 기능 구현
- UI/UX 개선 및 디자인 완성도 향상
- 검색 기능 및 성능 최적화 고도화
단순히 기능을 추가하는 수준이 아니라, 구조적으로 안정적인 서비스로 발전시키는 것을 목표로 프로젝트를 계속 발전시켜 나갈 계획입니다.
참고로 기존 JSON 형식의 코드에서 MYSQL연결 코드로 바꿨습니다. 코드는 github를 참고하시면 됩니다.
github 주소: https://github.com/aerfdad/item-trading-MYSQL
GitHub - aerfdad/item-trading-MYSQL
Contribute to aerfdad/item-trading-MYSQL development by creating an account on GitHub.
github.com
감사합니다!
'웹 개발' 카테고리의 다른 글
| 미국, 한국 주식 모의 투자 사이트 만들기 (0) | 2025.11.17 |
|---|---|
| 게임 아이템 거래 사이트 구현 (0) | 2025.10.24 |
| 쇼핑몰 사이트 만들기 (1) | 2025.06.16 |