Skip to content

[feat]: 기자재 모델 등록 API 구현 및 대여 정책 카테고리 이동 - #31

Merged
SeungKu-Kang merged 13 commits into
devfrom
feature/equipment-model-create
Oct 21, 2026
Merged

SeungKu-Kang merged 13 commits into
devfrom
feature/equipment-model-create

Conversation

@SeungKu-Kang

@SeungKu-Kang SeungKu-Kang commented Oct 21, 2026 •

Copy link
Copy Markdown
Collaborator

작업 내용

  • 기자재 모델 등록 API 구현 (POST /api/admin/equipment-models, 조교 권한)
    • 카테고리의 label_required에 따라 접두사 필수/금지 검사
      • 라벨 필요 카테고리 + 접두사 없음 → 400 EQUIPMENTMODEL400_2
      • 라벨 불필요 카테고리 + 접두사 있음 → 400 EQUIPMENTMODEL400_3
    • 같은 카테고리 내 동일 모델명 → 409 EQUIPMENTMODEL409_1 (삭제된 모델 포함)
    • 없는 카테고리 → 404 CATEGORY404_1, 없는 접두사 → 404 LABELPREFIX404_1
    • 성공 시 EQUIPMENTMODEL201_1, 응답 { modelId }
  • 대여 정책을 모델에서 카테고리로 이동 (PM 회의 결과 정책이 카테고리 단위로 확정)
    • Category에 label_required, regular_rental_enabled, loan_period_type,
      loan_duration_days, pickup_photo_required, pledge_required 추가
    • EquipmentModel에서 application_policy, loan_period_type,
      loan_duration_days, pledge_required 제거
  • EquipmentModel 컬럼 수정 (프론트 화면 기준)
    • disposal_date 추가, components 필수, prefix_id NULL 허용(기타 카테고리)
    • EquipmentModelStatus에서 DISCONTINUED 제거
  • EquipmentItem 엔티티 및 EquipmentItemStatus enum 추가 (기기 등록 API용, 이번 PR에서는 엔티티만)
  • enum 컬럼에 @JdbcTypeCode(SqlTypes.VARCHAR) 적용 (Hibernate 6의 MySQL ENUM 타입 생성 방지)

⚠️ 머지 전 RDS 반영 필요

운영은 ddl-auto: validate라 아래 SQL을 먼저 실행하지 않으면 서버가 기동되지 않습니다.
실행 전 RDS의 category, equipment_model에 기존 데이터가 있는지 확인 부탁드립니다.

실행 순서대로 정리했습니다. 0단계 결과에 CHECK 제약이나 기존 데이터가 있으면 실행 전에 공유 부탁드립니다.
(CHECK 제약이 걸린 컬럼은 DROP이 실패하고, equipment_model에 행이 있으면 disposal_date NOT NULL 추가가 실패할 수 있습니다.)
enum 컬럼에는 CHECK 제약을 두지 않았습니다. enum 값이 바뀔 때마다 DB도 같이 고쳐야 하는 부담을 피하기 위함입니다.

-- 0. 실행 전 확인
SHOW CREATE TABLE category;
SHOW CREATE TABLE equipment_model;
SHOW CREATE TABLE label_prefix;
SELECT COUNT(*) FROM category;
SELECT COUNT(*) FROM equipment_model;
SELECT COUNT(*) FROM label_prefix;

-- 1. category: 대여 정책 컬럼 추가
ALTER TABLE category
  ADD COLUMN label_required         bit(1)      NOT NULL,
  ADD COLUMN regular_rental_enabled bit(1)      NOT NULL,
  ADD COLUMN loan_period_type       varchar(30) NOT NULL,
  ADD COLUMN loan_duration_days     int         NULL,
  ADD COLUMN pickup_photo_required  bit(1)      NOT NULL,
  ADD COLUMN pledge_required        bit(1)      NOT NULL;

-- 2. equipment_model: 정책 컬럼 제거 + 컬럼 수정
ALTER TABLE equipment_model
  DROP COLUMN application_policy,
  DROP COLUMN loan_period_type,
  DROP COLUMN loan_duration_days,
  DROP COLUMN pledge_required,
  MODIFY COLUMN components    text        NOT NULL,
  MODIFY COLUMN rental_status varchar(30) NOT NULL,
  MODIFY COLUMN prefix_id     bigint      NULL,
  ADD COLUMN disposal_date    date        NOT NULL;

-- 3. equipment_item 생성
CREATE TABLE equipment_item (
  id           bigint      NOT NULL AUTO_INCREMENT,
  created_at   datetime(6) DEFAULT NULL,
  deleted_at   datetime(6) DEFAULT NULL,
  updated_at   datetime(6) DEFAULT NULL,
  label_code   varchar(30) DEFAULT NULL,
  label_number int         DEFAULT NULL,
  memo         text,
  status       varchar(30) NOT NULL,
  model_id     bigint      NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY uk_equipment_item_label_code (label_code),
  CONSTRAINT fk_equipment_item_model FOREIGN KEY (model_id) REFERENCES equipment_model (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- 4. 초기 데이터 (0단계에서 category·label_prefix가 비어 있을 때만)
--    category에 기존 행이 있으면 1단계 후 loan_period_type이 ''로 채워지므로 UPDATE로 정책 값을 채워야 합니다.
INSERT INTO category (category_name, label_required, regular_rental_enabled, loan_period_type,
                      loan_duration_days, pickup_photo_required, pledge_required, created_at, updated_at)
VALUES ('노트북',     1, 1, 'SEMESTER_END', NULL, 1, 1, NOW(6), NOW(6)),
       ('태블릿',     1, 1, 'SEMESTER_END', NULL, 1, 1, NOW(6), NOW(6)),
       ('보조배터리', 1, 0, 'FIXED_DAYS',   1,    0, 0, NOW(6), NOW(6)),
       ('기타',       0, 0, 'FIXED_DAYS',   1,    0, 0, NOW(6), NOW(6));

INSERT INTO label_prefix (prefix_code, prefix_name, last_number, created_at, updated_at)
VALUES ('TA', 'Android 태블릿',   0, NOW(6), NOW(6)),
       ('TI', 'iOS 태블릿',       0, NOW(6), NOW(6)),
       ('L',  'LG 그램',          0, NOW(6), NOW(6)),
       ('M',  'Mac북',            0, NOW(6), NOW(6)),
       ('X',  'HP All in One PC', 0, NOW(6), NOW(6)),
       ('B',  '보조배터리',       0, NOW(6), NOW(6));

테스트 (로컬)

  • 정상 등록 (노트북 + 접두사 L) → DB에 category_id, prefix_id 정상 저장
  • 동일 카테고리·동일 모델명 재등록 → 409
  • 기타 카테고리 + 접두사 없음 정상 등록
  • 400_2 / 400_3 / 404(카테고리·접두사) / @Valid 400 — 미실시

공유 사항

  • Swagger에 SecurityScheme이 없어 Authorize로 토큰 입력 불가 → Postman으로 테스트함
  • 토큰 없이 인증 필요한 API 호출 시 401이 아닌 403 + 빈 본문 응답 (AuthenticationEntryPoint 미설정)

@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration
  • Configuration used: Organization UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 717a0654-f200-43b9-a00e-45755a8fdad6
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@SeungKu-Kang
SeungKu-Kang merged commit 9a270bc into dev Oct 21, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant