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)
'교육' 카테고리의 다른 글
| mariadb에서 datetime 유형에서 특정 일자 이후 조건 예제 (0) | 2025.12.31 |
|---|---|
| intellij idea community edition 2025.2 버전 이하 Community 버전 다운로드 방법 (0) | 2025.12.26 |
| React 테마 디자인 추가 (0) | 2025.12.24 |
| 디자인 화면 분석 (0) | 2025.12.24 |
| React 프로젝트 생성 흐름 확인 (0) | 2025.12.24 |