본문 바로가기

교육

Java Spring Boot 백엔드 구조

반응형

Java Spring Boot + MyBatis + MariaDB 구조 디렉토리 생성

mkdir -p /home/user/webapp/backend/src/main/{java/com/warehouse/{config,controller,service,mapper,dto,entity,exception},resources/{mapper,static,templates}}

 

원도우즈

@echo off
set base=C:\vinci\vinci_backend\src\main

mkdir "%base%\java\com\warehouse\config"
mkdir "%base%\java\com\warehouse\controller"
mkdir "%base%\java\com\warehouse\service"
mkdir "%base%\java\com\warehouse\mapper"
mkdir "%base%\java\com\warehouse\dto"
mkdir "%base%\java\com\warehouse\entity"
mkdir "%base%\java\com\warehouse\exception"
mkdir "%base%\resources\mapper"
mkdir "%base%\resources\static"
mkdir "%base%\resources\templates"

echo Directories created.
pause

 

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.1</version>
        <relativePath/>
    </parent>
    
    <groupId>com.warehouse</groupId>
    <artifactId>warehouse-management</artifactId>
    <version>1.0.0</version>
    <name>Warehouse Management System</name>
    <description>Enterprise Warehouse Management System with Spring Boot and MyBatis</description>
    
    <properties>
        <java.version>17</java.version>
        <mybatis-spring-boot.version>3.0.3</mybatis-spring-boot.version>
    </properties>
    
    <dependencies>
        <!-- Spring Boot Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- Spring Boot Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        
        <!-- Spring Boot Validation -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-validation</artifactId>
        </dependency>
        
        <!-- MyBatis Spring Boot Starter -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis-spring-boot.version}</version>
        </dependency>
        
        <!-- MariaDB Driver -->
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <scope>runtime</scope>
        </dependency>
        
        <!-- JWT -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-api</artifactId>
            <version>0.12.3</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-impl</artifactId>
            <version>0.12.3</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt-jackson</artifactId>
            <version>0.12.3</version>
            <scope>runtime</scope>
        </dependency>
        
        <!-- Lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        
        <!-- Spring Boot DevTools -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        
        <!-- Spring Boot Test -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
        <!-- Spring Security Test -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

 

 

/src/main/resources/application.yml

# Spring Boot Configuration
spring:
  application:
    name: warehouse-management
  
  # DataSource Configuration
  datasource:
    driver-class-name: org.mariadb.jdbc.Driver
    url: jdbc:mariadb://localhost:3306/warehouse_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Seoul
    username: root
    password: password
    hikari:
      maximum-pool-size: 10
      minimum-idle: 5
      connection-timeout: 30000
      idle-timeout: 600000
      max-lifetime: 1800000
  
  # Jackson Configuration
  jackson:
    time-zone: Asia/Seoul
    date-format: yyyy-MM-dd HH:mm:ss
    default-property-inclusion: non_null
  
  # Server Configuration
server:
  port: 8080
  servlet:
    context-path: /api
    encoding:
      charset: UTF-8
      enabled: true
      force: true

# MyBatis Configuration
mybatis:
  mapper-locations: classpath:mapper/**/*.xml
  type-aliases-package: com.warehouse.entity
  configuration:
    map-underscore-to-camel-case: true
    cache-enabled: true
    lazy-loading-enabled: true
    aggressive-lazy-loading: false
    multiple-result-sets-enabled: true
    use-column-label: true
    use-generated-keys: true
    default-statement-timeout: 30
    default-fetch-size: 100
    log-impl: org.apache.ibatis.logging.slf4j.Slf4jImpl

# JWT Configuration
jwt:
  secret: your-256-bit-secret-key-change-this-in-production-environment
  expiration: 86400000  # 24 hours in milliseconds
  refresh-expiration: 604800000  # 7 days in milliseconds

# Logging Configuration
logging:
  level:
    root: INFO
    com.warehouse: DEBUG
    com.warehouse.mapper: TRACE
  pattern:
    console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
    file: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
  file:
    name: logs/warehouse-management.log
    max-size: 10MB
    max-history: 30

 

MariaDB 스키마 생성

-- Create database
CREATE DATABASE IF NOT EXISTS warehouse_db
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_unicode_ci;

USE warehouse_db;

-- Users table
CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    full_name VARCHAR(100) NOT NULL,
    company_id BIGINT,
    department_id BIGINT,
    role VARCHAR(50) NOT NULL DEFAULT 'USER',
    enabled BOOLEAN NOT NULL DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_username (username),
    INDEX idx_email (email),
    INDEX idx_company_id (company_id),
    INDEX idx_department_id (department_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Companies table
CREATE TABLE companies (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(200) NOT NULL,
    code VARCHAR(50) NOT NULL UNIQUE,
    address VARCHAR(500),
    phone VARCHAR(50),
    enabled BOOLEAN NOT NULL DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_code (code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Departments table
CREATE TABLE departments (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    company_id BIGINT NOT NULL,
    name VARCHAR(200) NOT NULL,
    code VARCHAR(50) NOT NULL,
    enabled BOOLEAN NOT NULL DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (company_id) REFERENCES companies(id),
    INDEX idx_company_id (company_id),
    INDEX idx_code (code)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Materials table
CREATE TABLE materials (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(50) NOT NULL UNIQUE,
    name VARCHAR(200) NOT NULL,
    category VARCHAR(100),
    unit VARCHAR(20),
    quantity INT DEFAULT 0,
    unit_price DECIMAL(15, 2) DEFAULT 0.00,
    status VARCHAR(20) NOT NULL DEFAULT 'Active',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_code (code),
    INDEX idx_category (category),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Warehouse Bins table
CREATE TABLE warehouse_bins (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(50) NOT NULL UNIQUE,
    name VARCHAR(200) NOT NULL,
    zone VARCHAR(50),
    aisle VARCHAR(20),
    rack VARCHAR(20),
    level VARCHAR(20),
    capacity INT DEFAULT 0,
    current_usage INT DEFAULT 0,
    status VARCHAR(20) NOT NULL DEFAULT 'Active',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_code (code),
    INDEX idx_zone (zone),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Arrivals table
CREATE TABLE arrivals (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(50) NOT NULL UNIQUE,
    po_number VARCHAR(100),
    supplier VARCHAR(200),
    material_id BIGINT,
    expected_qty INT DEFAULT 0,
    received_qty INT DEFAULT 0,
    arrival_date DATE,
    status VARCHAR(20) NOT NULL DEFAULT 'Pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (material_id) REFERENCES materials(id),
    INDEX idx_code (code),
    INDEX idx_po_number (po_number),
    INDEX idx_status (status),
    INDEX idx_arrival_date (arrival_date)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Putaway table
CREATE TABLE putaway (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(50) NOT NULL UNIQUE,
    material_id BIGINT,
    quantity INT DEFAULT 0,
    from_location VARCHAR(100),
    to_bin_id BIGINT,
    assigned_to_user_id BIGINT,
    status VARCHAR(20) NOT NULL DEFAULT 'Pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (material_id) REFERENCES materials(id),
    FOREIGN KEY (to_bin_id) REFERENCES warehouse_bins(id),
    FOREIGN KEY (assigned_to_user_id) REFERENCES users(id),
    INDEX idx_code (code),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Picking table
CREATE TABLE picking (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(50) NOT NULL UNIQUE,
    material_id BIGINT,
    requested_qty INT DEFAULT 0,
    picked_qty INT DEFAULT 0,
    from_bin_id BIGINT,
    order_no VARCHAR(100),
    picker_user_id BIGINT,
    status VARCHAR(20) NOT NULL DEFAULT 'Pending',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (material_id) REFERENCES materials(id),
    FOREIGN KEY (from_bin_id) REFERENCES warehouse_bins(id),
    FOREIGN KEY (picker_user_id) REFERENCES users(id),
    INDEX idx_code (code),
    INDEX idx_order_no (order_no),
    INDEX idx_status (status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Onhand Inventory table
CREATE TABLE onhand_inventory (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    material_id BIGINT NOT NULL,
    bin_id BIGINT NOT NULL,
    quantity INT DEFAULT 0,
    reserved_qty INT DEFAULT 0,
    status VARCHAR(20) NOT NULL DEFAULT 'Active',
    last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (material_id) REFERENCES materials(id),
    FOREIGN KEY (bin_id) REFERENCES warehouse_bins(id),
    INDEX idx_material_id (material_id),
    INDEX idx_bin_id (bin_id),
    INDEX idx_status (status),
    UNIQUE KEY uk_material_bin (material_id, bin_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Announcements table
CREATE TABLE announcements (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200) NOT NULL,
    content TEXT,
    is_important BOOLEAN NOT NULL DEFAULT FALSE,
    created_by_user_id BIGINT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    FOREIGN KEY (created_by_user_id) REFERENCES users(id),
    INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Insert demo data
-- Default admin user (password: password - hashed with BCrypt)
INSERT INTO companies (name, code) VALUES ('ABC Corporation', 'ABC001');
INSERT INTO departments (company_id, name, code) VALUES (1, 'Warehouse Division', 'WH001');

INSERT INTO users (username, password, email, full_name, company_id, department_id, role) VALUES
('admin', '$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy', 'admin@example.com', 'Admin User', 1, 1, 'ADMIN');

-- Sample materials
INSERT INTO materials (code, name, category, unit, quantity, unit_price, status) VALUES
('MAT001', 'Steel Pipe 1"', 'Raw Materials', 'EA', 100, 25.50, 'Active'),
('MAT002', 'Bolt M10x50', 'Spare Parts', 'EA', 500, 1.20, 'Active'),
('MAT003', 'Paint - Red', 'Finished Goods', 'Liter', 50, 15.00, 'Active');

-- Sample warehouse bins
INSERT INTO warehouse_bins (code, name, zone, aisle, rack, level, capacity, current_usage, status) VALUES
('BIN-A-01-01', 'Zone A Aisle 1 Rack 1 Level 1', 'A', '01', '01', '1', 1000, 100, 'Active'),
('BIN-A-01-02', 'Zone A Aisle 1 Rack 2 Level 1', 'A', '01', '02', '1', 1000, 500, 'Active'),
('BIN-B-01-01', 'Zone B Aisle 1 Rack 1 Level 1', 'B', '01', '01', '1', 1000, 50, 'Active');

-- Sample announcements
INSERT INTO announcements (title, content, is_important, created_by_user_id) VALUES
('System Maintenance Notice', 'The system will undergo maintenance on Saturday from 2 AM to 4 AM.', TRUE, 1),
('New Feature Release', 'We have released new inventory tracking features.', FALSE, 1);

 

/src/main/java/com/warehouse/config/SecurityConfig.java

 

package com.warehouse.config;

import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

import java.util.Arrays;

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SecurityConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .cors(cors -> cors.configurationSource(corsConfigurationSource()))
            .csrf(csrf -> csrf.disable())
            .sessionManagement(session -> session
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS))
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/auth/**").permitAll()
                .requestMatchers("/swagger-ui/**", "/v3/api-docs/**").permitAll()
                .anyRequest().authenticated()
            );

        return http.build();
    }

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:3000", "https://*"));
        configuration.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "DELETE", "OPTIONS"));
        configuration.setAllowedHeaders(Arrays.asList("*"));
        configuration.setAllowCredentials(true);
        configuration.setMaxAge(3600L);
        
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", configuration);
        return source;
    }
}

 

백엔드 실행 방법

1. MariaDB 설치 및 설정

Copy# MariaDB 설치
sudo apt install mariadb-server

# 데이터베이스 생성
mysql -u root -p < /home/user/webapp/backend/src/main/resources/schema.sql

2. 백엔드 실행

Copycd /home/user/webapp/backend

# Maven 빌드 및 실행
mvn spring-boot:run

# 또는 JAR 빌드 후 실행
mvn clean package
java -jar target/warehouse-management-1.0.0.jar

3. 프론트엔드 API 연결

.env 파일 수정:

VITE_API_BASE_URL=http://localhost:8080/api

💡 주요 특징

✅ 테마 시스템

  • 헤더 우측 "Theme" 버튼 클릭
  • 4가지 테마 중 선택
  • 실시간 적용
  • localStorage에 자동 저장

✅ 반응형 디자인

  • 모바일, 태블릿, 데스크톱 모두 지원
  • 사이드바 자동 축소/확장
  • 적응형 레이아웃

✅ 애니메이션

  • 페이지 전환 효과
  • 호버 애니메이션
  • 카드 hover 효과
  • 로딩 스피너

✅ 프로덕션 준비

  • TypeScript 타입 안정성
  • JWT 인증 시스템
  • 에러 처리
  • 로깅 시스템
  • 보안 설정

 

 

현대적인 UI 디자인 시스템
🎨 4가지 전문 테마
프로젝트에 4가지 프로페셔널 테마가 추가되었습니다:

1️⃣ Government Theme (정부 기관)
색상: 딥 블루 (#1e40af) + 스카이 블루 (#0369a1)
스타일: 전문적이고 공식적인 디자인
특징: 신뢰성과 안정성 강조
2️⃣ Enterprise Theme (대기업)
색상: 다크 슬레이트 (#0f172a) + 앰버 (#f59e0b)
스타일: 모던하고 세련된 기업 디자인
특징: 프리미엄 느낌과 전문성
3️⃣ University Theme (대학교)
색상: 바이올렛 (#7c3aed) + 핑크 (#ec4899)
스타일: 활기차고 창의적인 디자인
특징: 젊고 혁신적인 분위기
4️⃣ Global Theme (글로벌 서비스)
색상: 시안 (#0891b2) + 오렌지 (#f97316)
스타일: 신선하고 다이나믹한 디자인
특징: 국제적이고 현대적인 감각
🎯 업그레이드된 UI 컴포넌트
헤더 (Header)

그라데이션 배경
블러 효과 (backdrop-blur)
테마 선택 버튼 추가
호버 효과와 애니메이션
사이드바 (Sidebar)

그라데이션 배경
아이콘 기반 메뉴
부드러운 펼침/접힘 애니메이션
모던한 서브메뉴 스타일
탭 시스템 (Tabs)

번호 배지 추가
활성 탭 하이라이트
테마별 색상 적용
로그인 페이지

풀 스크린 그라데이션 배경
애니메이션 배경 효과
현대적인 폼 디자인
반응형 카드 레이아웃
대시보드

통계 카드 (Stats Cards)
그라데이션 웰컴 섹션
공지사항 카드
호버 효과와 전환
🔧 2. Java Spring Boot 백엔드
📁 완전한 백엔드 구조
backend/
├── src/main/
│   ├── java/com/warehouse/
│   │   ├── WarehouseManagementApplication.java
│   │   ├── config/
│   │   │   └── SecurityConfig.java
│   │   ├── controller/
│   │   │   └── AuthController.java
│   │   ├── service/
│   │   │   ├── AuthService.java
│   │   │   └── JwtService.java
│   │   ├── mapper/
│   │   │   └── UserMapper.java
│   │   ├── entity/
│   │   │   ├── User.java
│   │   │   └── Material.java
│   │   └── dto/
│   │       ├── LoginRequest.java
│   │       ├── LoginResponse.java
│   │       ├── UserDto.java
│   │       └── AffiliationDto.java
│   └── resources/
│       ├── application.yml
│       ├── schema.sql
│       └── mapper/
│           └── UserMapper.xml
└── pom.xml
🗄️ MariaDB 데이터베이스
완전한 스키마가 포함되어 있습니다:

users - 사용자 정보
companies - 회사 정보
departments - 부서 정보
materials - 자재 정보
warehouse_bins - 창고 빈 정보
arrivals - 도착 관리
putaway - 적치 관리
picking - 피킹 관리
onhand_inventory - 재고 정보
announcements - 공지사항
🔐 보안 기능
Spring Security 통합
JWT 토큰 인증
BCrypt 비밀번호 암호화
CORS 설정
Role 기반 접근 제어
📊 프로젝트 통계
Frontend
파일: 45+ 파일
코드 라인: ~10,000 라인
컴포넌트: 20+ 재사용 가능한 컴포넌트
테마: 4가지 프로페셔널 테마
Backend
파일: 19 파일
Entity: 2개 (User, Material)
Controller: 1개 (Auth)
Service: 2개 (Auth, JWT)
Mapper: 1개 (User + XML)

 

 

반응형