snp-batch-validation/src/main/java/com/snp/batch/global/model/BypassApiConfig.java
HYOJIN 951b6c759d feat: BYPASS API 등록 프로세스 설계 및 개발 (#63)
- 공통 베이스 클래스 추가 (BaseBypassService, BaseBypassController)
- 기존 Risk 모듈 베이스 클래스 상속으로 리팩토링
- BYPASS API 설정 CRUD API 구현 (/api/bypass-config)
- Java 코드 생성기 구현 (Controller, Service, DTO 자동 생성)
- JSON 샘플 파싱 기능 구현
- 프론트엔드 BYPASS API 관리 페이지 추가 (멀티스텝 등록 모달)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 16:24:54 +09:00

136 lines
3.2 KiB
Java

package com.snp.batch.global.model;
import jakarta.persistence.*;
import lombok.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* BYPASS API 설정 정보를 저장하는 엔티티
* 외부 API를 동적으로 프록시하기 위한 설정 메타데이터
*
* JPA를 사용하므로 @PrePersist, @PreUpdate로 감사 필드 자동 설정
*/
@Entity
@Table(name = "bypass_api_config")
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class BypassApiConfig {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 도메인명 (패키지명/URL 경로)
* 예: "ship-info", "port-data"
*/
@Column(name = "domain_name", unique = true, nullable = false, length = 50)
private String domainName;
/**
* 표시명
* 예: "선박 정보 API", "항만 데이터 API"
*/
@Column(name = "display_name", nullable = false, length = 100)
private String displayName;
/**
* WebClient 빈 이름
* 예: "maritimeWebClient", "portWebClient"
*/
@Column(name = "webclient_bean", nullable = false, length = 100)
private String webclientBean;
/**
* 외부 API 경로
* 예: "/api/v1/ships/{imoNumber}"
*/
@Column(name = "external_path", nullable = false, length = 500)
private String externalPath;
/**
* HTTP 메서드
* 예: "GET", "POST"
*/
@Column(name = "http_method", nullable = false, length = 10)
@Builder.Default
private String httpMethod = "GET";
/**
* 응답 타입
* 예: "LIST", "SINGLE"
*/
@Column(name = "response_type", nullable = false, length = 20)
@Builder.Default
private String responseType = "LIST";
/**
* 설명
*/
@Column(name = "description", length = 1000)
private String description;
/**
* 코드 생성 완료 여부
*/
@Column(name = "generated", nullable = false)
@Builder.Default
private Boolean generated = false;
/**
* 코드 생성 일시
*/
@Column(name = "generated_at")
private LocalDateTime generatedAt;
/**
* 생성 일시 (감사 필드)
*/
@Column(name = "created_at", nullable = false, updatable = false)
private LocalDateTime createdAt;
/**
* 수정 일시 (감사 필드)
*/
@Column(name = "updated_at", nullable = false)
private LocalDateTime updatedAt;
/**
* API 파라미터 목록
*/
@OneToMany(mappedBy = "config", cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
private List<BypassApiParam> params = new ArrayList<>();
/**
* API 응답 필드 목록
*/
@OneToMany(mappedBy = "config", cascade = CascadeType.ALL, orphanRemoval = true)
@Builder.Default
private List<BypassApiField> fields = new ArrayList<>();
/**
* 엔티티 저장 전 자동 호출 (INSERT 시)
*/
@PrePersist
protected void onCreate() {
LocalDateTime now = LocalDateTime.now();
this.createdAt = now;
this.updatedAt = now;
}
/**
* 엔티티 업데이트 전 자동 호출 (UPDATE 시)
*/
@PreUpdate
protected void onUpdate() {
this.updatedAt = LocalDateTime.now();
}
}