이 저장소는 3-Tier 기반 개인 금융 관리 웹사이트의 데이터베이스 설계 및 관리를 위한 레포지토리
사용자는 직접 입력한 문자열 ID(
user_id)를 기준으로 데이터를 관리하며, 금융 소비/자산/예산 내역을 통합적으로 기록
ERD 구성 요약
users: 사용자 계정 정보 (직접 지정 ID)expenses: 소비 내역budgets: 월별 예산assets: 금융 자산
| 컬럼 | 타입 | 설명 |
|---|---|---|
| user_id | VARCHAR(30) | 사용자 ID (직접 입력) |
| VARCHAR(100) | 이메일 (고유) | |
| password | VARCHAR(255) | 암호 (bcrypt 해시) |
| name | VARCHAR(50) | 사용자 이름 |
| refresh_token | VARCHAR(100) | JWT 토큰 |
| created_at | TIMESTAMP | 가입일 |
| 컬럼 | 타입 | 설명 |
|---|---|---|
| id | BIGINT | PK |
| user_id | VARCHAR(30) | 사용자 ID (FK) |
| category | VARCHAR(30) | 소비 카테고리 |
| description | VARCHAR(100) | 내용 |
| amount | DECIMAL(12,2) | 금액 |
| spent_at | DATE | 지출일 |
| created_at | TIMESTAMP | 생성일 |
| 컬럼 | 타입 | 설명 |
|---|---|---|
| id | BIGINT | PK |
| user_id | VARCHAR(30) | 사용자 ID (FK) |
| month | CHAR(7) | 월 단위 ('YYYY-MM') |
| amount | DECIMAL(12,2) | 예산 금액 |
| created_at | TIMESTAMP | 생성일 |
| 컬럼 | 타입 | 설명 |
|---|---|---|
| id | BIGINT | PK |
| user_id | VARCHAR(30) | 사용자 ID (FK) |
| name | VARCHAR(50) | 자산명 (ex. 카카오뱅크, 삼성전자 주식) |
| type | VARCHAR(30) | 자산 유형 (현금, 예금, 주식 등) |
| amount | DECIMAL(15,2) | 자산 금액 |
| created_at | TIMESTAMP | 생성일 |
MySQL을 안전하게 허용하기 위한 실무 가이드 접근 제한, 사용자 권한 분리, 방화벽 설정을 통해 보안성과 유연성을 동시에 확보
- 3-Tier 아키텍처 구성: WAS ↔ DB 분리
- 보안 강화를 위한 접속 제어 (IP, 계정, 포트 레벨)
- MySQL 외부 접속 수신 허용
# /etc/mysql/mysql.conf.d/mysqld.cnf
bind-address = 0.0.0.0
sudo systemctl restart mysql- 지정된 IP에서만 접속 가능한 계정 생성
CREATE USER 'remote_user'@'remote_ip' IDENTIFIED BY 'StrongPassword!';
GRANT SELECT, INSERT ON your_database.* TO 'remote_user'@'remote_ip';
FLUSH PRIVILEGES;- 해당 IP만 3306 포트 접근 허용
sudo ufw allow from 'remote_ip' to any port 3306
sudo ufw deny 3306MySQL에서 쿼리 및 오류 로그를 남겨 운영 분석, 성능 개선, 보안 추적에 활용
- 모든 쿼리 실행 내역을 기록
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
general_log = 1
general_log_file = /var/log/mysql/mysql.log
log_output = FILE- 지정된 시간 이상 걸리는 느린 쿼리만 기록
# /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 1- 설정 파일 수정 후에는 반드시 MySQL 재시작
sudo systemctl restart mysql