- 공통 베이스 클래스 추가 (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>
136 lines
3.2 KiB
Java
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();
|
|
}
|
|
}
|