Spring Boot 3.2.1 기반의 OT 보안 모니터링 시스템 백엔드 API 서버입니다.
- Spring Boot 3.2.1
- Java 17
- Gradle 8.5
- Elasticsearch Java Client 8.11.0
- Lombok
- Swagger/OpenAPI 3
// Spring Boot
spring-boot-starter-web
spring-boot-starter-webflux // SSE 지원
spring-boot-starter-actuator // 헬스체크
// Elasticsearch
elasticsearch-java:8.11.0
elasticsearch-rest-client:8.11.0
// Swagger
springdoc-openapi-starter-webmvc-ui:2.3.0
// Lombok
lombok# 빌드
./gradlew clean build
# 테스트 제외 빌드
./gradlew clean bootJar
# 개발 모드 실행
./gradlew bootRun
# 테스트
./gradlew test# 빌드 후
java -jar build/libs/ot-security-backend.jar
# 프로파일 지정
java -jar build/libs/ot-security-backend.jar --spring.profiles.active=prod
# JVM 옵션
java -Xms512m -Xmx1024m -jar build/libs/ot-security-backend.jardocker build -t ot-security-backend .
docker run -p 8080:8080 ot-security-backendspring:
application:
name: ot-security-backend
elasticsearch:
uris: http://localhost:9200
username: elastic
password: ${ELASTICSEARCH_PASSWORD:}
server:
port: 8080
ot-security:
sse:
timeout: 300000 # 5분
heartbeat: 30000 # 30초
refresh-interval: 5000 # 5초
elasticsearch:
packet-index: "ot-security-packets"
threat-index: "ot-security-threats"# Elasticsearch 비밀번호
export ELASTICSEARCH_PASSWORD=your_password
# 프로파일
export SPRING_PROFILES_ACTIVE=prodGET /api/dashboard/stats
대시보드 전체 통계
GET /api/packets?page=0&size=20
패킷 목록 조회
GET /api/threats?page=0&size=20
위협 이벤트 목록 조회
GET /api/sse/subscribe
GET /api/sse/threats
GET /api/sse/stats
GET /actuator/health # 헬스체크
GET /actuator/info # 애플리케이션 정보
GET /actuator/metrics # 메트릭
http://localhost:8080/swagger-ui.html
src/main/java/com/ot/security/
├── OtSecurityApplication.java # 메인 클래스
├── config/
│ ├── ElasticsearchConfig.java # ES 클라이언트 설정
│ └── CorsConfig.java # CORS 설정
├── controller/
│ ├── DashboardController.java # 대시보드 API
│ ├── PacketController.java # 패킷 API
│ ├── ThreatController.java # 위협 API
│ └── SSEController.java # SSE API
├── service/
│ ├── ElasticsearchService.java # ES 쿼리 서비스
│ └── SSEService.java # SSE 관리 서비스
├── model/
│ ├── Packet.java # 패킷 모델
│ └── ThreatEvent.java # 위협 모델
├── dto/
│ └── DashboardStatsDTO.java # 통계 DTO
└── scheduler/
└── DataRefreshScheduler.java # 실시간 업데이트 스케줄러
1. Elasticsearch ← Parser PC (데이터 저장)
2. ElasticsearchService → Elasticsearch (데이터 조회)
3. DataRefreshScheduler → 주기적 조회 (5초마다)
4. SSEService → 클라이언트 (실시간 푸시)
./gradlew test# 헬스체크
curl http://localhost:8080/actuator/health
# 대시보드 통계
curl http://localhost:8080/api/dashboard/stats
# 패킷 목록
curl http://localhost:8080/api/packets?page=0&size=10
# SSE 연결
curl -N http://localhost:8080/api/sse/subscribe문제: Connection refused
해결:
# Elasticsearch 실행 확인
curl http://localhost:9200
# application.yml 확인
spring.elasticsearch.uris: http://localhost:9200문제: Gradle 의존성 오류
해결:
# Gradle 캐시 삭제
./gradlew clean build --refresh-dependencies
# Gradle Wrapper 재다운로드
./gradlew wrapper --gradle-version 8.5문제: Timeout
해결: application.yml 수정
ot-security:
sse:
timeout: 600000 # 10분으로 증가# application.log
tail -f logs/application.log
# Docker
docker logs -f ot-security-backend# JVM 메모리
curl http://localhost:8080/actuator/metrics/jvm.memory.used
# HTTP 요청 통계
curl http://localhost:8080/actuator/metrics/http.server.requests# 이미지 빌드
docker build -t ot-security-backend:latest .
# 컨테이너 실행
docker run -d \
--name ot-security-backend \
-p 8080:8080 \
-e SPRING_PROFILES_ACTIVE=prod \
-e SPRING_ELASTICSEARCH_URIS=http://elasticsearch:9200 \
ot-security-backend:latest# 빌드
./gradlew clean bootJar
# 서버에 복사
scp build/libs/ot-security-backend.jar user@server:/app/
# 실행
ssh user@server
cd /app
nohup java -jar ot-security-backend.jar > app.log 2>&1 &- Controller 생성
@RestController
@RequestMapping("/api/new")
public class NewController {
@GetMapping
public ResponseEntity<String> getNew() {
return ResponseEntity.ok("New API");
}
}- Service 작성
@Service
public class NewService {
// 비즈니스 로직
}- Swagger 문서화
@Tag(name = "New", description = "New API")
@Operation(summary = "요약", description = "설명")public List<Data> customQuery() throws IOException {
SearchResponse<Data> response = elasticsearchClient.search(s -> s
.index("index-name")
.query(q -> q
.match(m -> m
.field("field")
.query("value")
)
),
Data.class
);
return extractResults(response);
}- Java 17 설치
- Gradle 8.5 설치 (또는 Wrapper 사용)
- Elasticsearch 8.11 실행
- application.yml 설정
- 빌드 성공
- 테스트 통과
- API 동작 확인
- SSE 연결 확인