본문 바로가기
카테고리 없음

테이블

by 두잇건강 2025. 8. 1.
반응형

2. Authority 테이블 (권한 테이블)

-- 권한 테이블 생성
CREATE TABLE authority (
    authority_name VARCHAR(50) NOT NULL PRIMARY KEY,
    description VARCHAR(255) NULL,
    created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    COMMENT = '사용자 권한 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 기본 권한 데이터 삽입
INSERT INTO authority (authority_name, description) VALUES 
('ROLE_USER', '일반 사용자 권한'),
('ROLE_ADMIN', '관리자 권한'),
('ROLE_MANAGER', '매니저 권한');

3. Users 테이블 (사용자 테이블)

-- 사용자 테이블 생성
CREATE TABLE users (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    email VARCHAR(100) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    name VARCHAR(50) NOT NULL,
    created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    is_enabled BOOLEAN DEFAULT TRUE,
    is_locked BOOLEAN DEFAULT FALSE,
    last_login TIMESTAMP NULL,
    
    INDEX idx_users_email (email),
    INDEX idx_users_name (name),
    INDEX idx_users_created_date (created_date),
    COMMENT = '사용자 정보 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

4. User_Authority 테이블 (사용자-권한 연결 테이블)

-- 사용자-권한 연결 테이블 생성 (다대다 관계)
CREATE TABLE user_authority (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    authority_name VARCHAR(50) NOT NULL,
    granted_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (authority_name) REFERENCES authority(authority_name) ON DELETE CASCADE,
    
    UNIQUE KEY uk_user_authority (user_id, authority_name),
    INDEX idx_user_authority_user_id (user_id),
    INDEX idx_user_authority_name (authority_name),
    COMMENT = '사용자-권한 연결 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

5. 테스트 사용자 데이터 삽입

-- 테스트용 사용자 생성 (비밀번호는 BCrypt로 암호화된 "password123")
INSERT INTO users (email, password, name) VALUES 
('admin@example.com', '$2a$10$rYL4UG70wpz1nRLJTsF2yutQPq/RYkSjqZ8pqzx8d3DnAHcvNw7M6', '관리자'),
('user@example.com', '$2a$10$rYL4UG70wpz1nRLJTsF2yutQPq/RYkSjqZ8pqzx8d3DnAHcvNw7M6', '일반사용자'),
('manager@example.com', '$2a$10$rYL4UG70wpz1nRLJTsF2yutQPq/RYkSjqZ8pqzx8d3DnAHcvNw7M6', '매니저');

-- 사용자별 권한 부여
INSERT INTO user_authority (user_id, authority_name) VALUES 
(1, 'ROLE_ADMIN'),
(1, 'ROLE_USER'),
(2, 'ROLE_USER'),
(3, 'ROLE_MANAGER'),
(3, 'ROLE_USER');

6. 추가 테이블들 (옵션)
로그인 이력 테이블

-- 로그인 이력 테이블 (선택사항)
CREATE TABLE login_history (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    login_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    ip_address VARCHAR(45) NULL,
    user_agent TEXT NULL,
    is_success BOOLEAN DEFAULT TRUE,
    failure_reason VARCHAR(255) NULL,
    
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    INDEX idx_login_history_user_id (user_id),
    INDEX idx_login_history_time (login_time),
    COMMENT = '로그인 이력 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

JWT 토큰 블랙리스트 테이블

-- JWT 토큰 블랙리스트 테이블 (로그아웃된 토큰 관리)
CREATE TABLE jwt_blacklist (
    id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    token_id VARCHAR(255) NOT NULL UNIQUE,
    user_id BIGINT NOT NULL,
    expired_at TIMESTAMP NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    INDEX idx_jwt_blacklist_token_id (token_id),
    INDEX idx_jwt_blacklist_user_id (user_id),
    INDEX idx_jwt_blacklist_expired_at (expired_at),
    COMMENT = 'JWT 토큰 블랙리스트 테이블'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

7. 사용자 및 권한 부여

-- MariaDB 사용자 생성 및 권한 부여
CREATE USER IF NOT EXISTS 'jwt_user'@'localhost' IDENTIFIED BY 'jwt_password123!';
CREATE USER IF NOT EXISTS 'jwt_user'@'%' IDENTIFIED BY 'jwt_password123!';

-- 데이터베이스 권한 부여
GRANT SELECT, INSERT, UPDATE, DELETE ON jwt_auth_db.* TO 'jwt_user'@'localhost';
GRANT SELECT, INSERT, UPDATE, DELETE ON jwt_auth_db.* TO 'jwt_user'@'%';

-- 권한 적용
FLUSH PRIVILEGES;

8. 테이블 정보 확인 쿼리

-- 생성된 테이블들 확인
SHOW TABLES;

-- 테이블 구조 확인
DESCRIBE users;
DESCRIBE authority;
DESCRIBE user_authority;

-- 테이블 생성 쿼리 확인
SHOW CREATE TABLE users;
SHOW CREATE TABLE authority;
SHOW CREATE TABLE user_authority;

-- 데이터 확인
SELECT u.id, u.email, u.name, u.created_date, 
       GROUP_CONCAT(ua.authority_name) as authorities
FROM users u
LEFT JOIN user_authority ua ON u.id = ua.user_id
GROUP BY u.id, u.email, u.name, u.created_date;


반응형