- ApiAccessLog 엔티티: 사용자/도메인/URI/파라미터/응답코드/처리시간 기록 - HandlerInterceptor로 /api/** 전체 요청 자동 기록 (health 제외) - Origin 헤더로 guide/wing 도메인 구분 - @Async 비동기 저장으로 응답 지연 방지 - GET /api/admin/audit-logs 관리자 조회 API (필터: origin, userId, uri, 기간) - ClientIpUtils 유틸 분리 (AuthController에서 공용화) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
65 lines
1.6 KiB
Java
65 lines
1.6 KiB
Java
package com.gcsc.guide.entity;
|
|
|
|
import jakarta.persistence.*;
|
|
import lombok.AllArgsConstructor;
|
|
import lombok.Builder;
|
|
import lombok.Getter;
|
|
import lombok.NoArgsConstructor;
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
@Entity
|
|
@Table(name = "api_access_logs", indexes = {
|
|
@Index(name = "idx_access_logs_created", columnList = "created_at"),
|
|
@Index(name = "idx_access_logs_user", columnList = "user_id"),
|
|
@Index(name = "idx_access_logs_uri", columnList = "request_uri")
|
|
})
|
|
@Getter
|
|
@NoArgsConstructor
|
|
@AllArgsConstructor
|
|
@Builder
|
|
public class ApiAccessLog {
|
|
|
|
@Id
|
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
|
private Long id;
|
|
|
|
@Column(name = "user_id")
|
|
private Long userId;
|
|
|
|
@Column(name = "user_email")
|
|
private String userEmail;
|
|
|
|
@Column(name = "client_ip", length = 45)
|
|
private String clientIp;
|
|
|
|
@Column(name = "origin_domain")
|
|
private String originDomain;
|
|
|
|
@Column(name = "http_method", nullable = false, length = 10)
|
|
private String httpMethod;
|
|
|
|
@Column(name = "request_uri", nullable = false, length = 500)
|
|
private String requestUri;
|
|
|
|
@Column(name = "query_string", length = 2000)
|
|
private String queryString;
|
|
|
|
@Column(name = "response_status")
|
|
private Integer responseStatus;
|
|
|
|
@Column(name = "duration_ms")
|
|
private Long durationMs;
|
|
|
|
@Column(name = "user_agent", length = 500)
|
|
private String userAgent;
|
|
|
|
@Column(name = "created_at", nullable = false, updatable = false)
|
|
private LocalDateTime createdAt;
|
|
|
|
@PrePersist
|
|
protected void onCreate() {
|
|
this.createdAt = LocalDateTime.now();
|
|
}
|
|
}
|