들어가며
전자정부 표준프레임워크센터에서 표준프레임워크 5.0 베타 버전을 공식 배포했습니다. 이번 5.0 버전은 단순한 버전 업그레이드가 아닙니다. Spring Boot 3.5.6 지원, AI RAG 예제, 클라우드 네이티브 아키텍처, Flutter 기반 모바일 API 등 현대적인 개발 환경을 종합적으로 갖춘 대규모 업데이트입니다.
2011년 첫 출시 이후, 표준프레임워크는 한국 공공기관의 정보화 개발 표준으로 자리 잡았습니다. 약 15년간 수많은 공공시스템이 이 프레임워크 기반으로 구축되었으며, 이번 5.0 베타는 그 역사상 가장 큰 변화를 담고 있다고 해도 과언이 아닙니다.
실행환경 v5.0 (Beta)
Spring Boot 3.5.6 지원
가장 큰 변화는 Spring Boot 3.5.6을 지원한다는 점입니다. 이는 Java 17+과 Jakarta EE 10+ 기반의 최신 Spring 생태계를 활용할 수 있게 해줍니다. 기존 3.x, 4.x 버전에서 사용하던 Spring Legacy 방식에서 완전히 벗어나, 현대적인 Spring Boot 개발 방식을 공공기관에서도 적용할 수 있게 되었습니다.
Spring Boot 3.5.6의 주요 특징:
- AOT(Ahead-of-Time) 컴파일: GraalVM 네이티브 이미지 지원으로 시작 시간 단축
- Virtual Threads (Project Loom): Java 21의 가상 스레드 지원으로 높은 동시성 처리
- Observability 내장: Micrometer Tracing 기반 분산 트레이싱 지원
- ProblemDetail API: RFC 7807 표준 에러 응답 지원
- HTTP Interface Client: 선언적 HTTP 클라이언트 지원
주요 오픈소스 업그레이드
| 컴포넌트 | 이전 버전 | 5.0 버전 | 주요 변화 |
|---|---|---|---|
| Spring Framework | 5.3.37 | 6.2.11 | Jakarta EE 10, AOT 컴파일 |
| Spring Security | 5.8.13 | 6.5.5 | Lambda DSL, 메서드 보안 강화 |
| Spring Batch | 4.3.10 | 5.2.3 | Job 구성 방식 변경 |
| Spring Boot | - | 3.5.6 | 신규 지원 |
| MyBatis | 3.5.16 | 3.5.19 | 안정성 향상 |
| Hibernate | 5.6.15 | 6.6.9 | Jakarta Persistence |
Spring Framework 6.x 대로의 업그레이드는 상당한 변화입니다. 단순히 버전 숫자가 올라간 것이 아니라, 근본적인 패러다임 변화가 있습니다.
Jakarta EE 10 네임스페이스 변경
가장 큰 영향을 미치는 변화는 javax.* 패키지에서 jakarta.* 패키지로의 변경입니다.
// 기존 (javax.*)
import javax.servlet.http.HttpServletRequest;
import javax.persistence.Entity;
import javax.validation.constraints.NotNull;
// 변경 (jakarta.*)
import jakarta.servlet.http.HttpServletRequest;
import jakarta.persistence.Entity;
import jakarta.validation.constraints.NotNull;
이 변경은 모든 Java EE 관련 코드에 영향을 미치며, 특히 다음 영역에서 주의가 필요합니다:
- Servlet/JSP 관련 코드
- JPA Entity 클래스
- Bean Validation 어노테이션
- Dependency Injection (
@Inject) - Transaction 관련 코드
Spring Security 6.x Lambda DSL
Spring Security 6.x에서는 설정 방식이 Lambda DSL로 변경되었습니다.
// 기존 방식 (Spring Security 5.x)
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/public/**").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/login")
.permitAll();
}
}
// 새로운 방식 (Spring Security 6.x)
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests(auth -> auth
.requestMatchers("/public/**").permitAll()
.requestMatchers("/admin/**").hasRole("ADMIN")
.anyRequest().authenticated()
)
.formLogin(form -> form
.loginPage("/login")
.permitAll()
);
return http.build();
}
}
주요 변경 사항:
WebSecurityConfigurerAdapterdeprecatedantMatchers()→requestMatchers()@EnableGlobalMethodSecurity→@EnableMethodSecurity- Lambda 기반 체이닝 설정
AI RAG 예제 v5.0 (Beta)
이번 버전의 하이라이트 중 하나는 Spring AI 기반 RAG(Retrieval-Augmented Generation) 예제입니다. 공공기관에서 생성형 AI를 활용할 수 있는 구체적인 가이드를 제공합니다.
RAG 아키텍처 이해하기
RAG(Retrieval-Augmented Generation)는 LLM의 한계를 극복하기 위한 핵심 기술입니다. LLM은 학습 데이터에 포함된 정보만 알 수 있으며, 최신 정보나 조직 내부 문서에 대한 지식이 없습니다. RAG는 이 문제를 해결합니다.
RAG 동작 방식:
- 문서 수집 및 분할: 내부 문서를 적절한 크기의 청크로 분할
- 임베딩 생성: 각 청크를 벡터로 변환
- 벡터 저장: Vector Database에 저장
- 질문 처리: 사용자 질문을 벡터로 변환
- 유사도 검색: 질문 벡터와 유사한 문서 청크 검색
- 컨텍스트 구성: 검색된 청크와 질문을 결합
- 답변 생성: LLM이 컨텍스트를 기반으로 답변 생성
구성 요소
Spring AI: 스프링 생태계에서 AI 애플리케이션을 구축하기 위한 프레임워크입니다. OpenAI, Azure OpenAI, Ollama, Vertex AI 등 다양한 AI 백엔드를 추상화하여 일관된 API를 제공합니다.
@Service
public class RagService {
private final ChatClient chatClient;
private final VectorStore vectorStore;
private final EmbeddingModel embeddingModel;
public RagService(ChatClient chatClient, VectorStore vectorStore,
EmbeddingModel embeddingModel) {
this.chatClient = chatClient;
this.vectorStore = vectorStore;
this.embeddingModel = embeddingModel;
}
public String query(String question) {
// 1. 질문을 벡터로 변환
float[] queryEmbedding = embeddingModel.embed(question);
// 2. 유사한 문서 검색
List<Document> similarDocs = vectorStore.similaritySearch(
SearchRequest.query(question).withTopK(5)
);
// 3. 컨텍스트 구성
String context = similarDocs.stream()
.map(Document::getContent)
.collect(Collectors.joining("\n\n"));
// 4. 프롬프트 구성 및 답변 생성
String prompt = """
다음 컨텍스트를 기반으로 질문에 답변하세요.
컨텍스트:
%s
질문: %s
""".formatted(context, question);
return chatClient.call(prompt);
}
}
Ollama: 로컬 환경에서 LLM을 실행할 수 있는 도구입니다. 공공기관에서는 보안상 클라우드 API 사용이 제한될 수 있으므로, Ollama를 통해 내부망에서 LLM을 운영할 수 있습니다.
# Ollama 설치 및 모델 다운로드
curl -fsSL https://ollama.ai/install.sh | sh
ollama pull llama3.2
ollama serve
Redis Stack: Redis의 벡터 검색 기능을 활용하여 Vector Database로 사용합니다. 기존 Redis 인프라를 활용하면서도 벡터 검색 기능을 추가할 수 있습니다.
# application.yml
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
model: llama3.2
embedding:
model: nomic-embed-text
vectorstore:
redis:
uri: redis://localhost:6379
index: egov-docs
prefix: "doc:"
공공기관 활용 시나리오
- 행정 문서 Q&A: 민원 처리 가이드, 법령 해석, 업무 매뉴얼 등에 대한 질의응답
- 법령 검색: 관련 법령, 시행령, 고시 등의 검색 및 요약
- 회의록 분석: 과거 회의록에서 특정 의제에 대한 논의 내용 검색
- 계약 문서 검토: 유사 계약 사례 검색 및 조항 비교
개발환경 v5.0 (Beta)
Eclipse IDE
Eclipse 2025-03 (4.35.0)이 적용되어 최신 IDE 환경을 제공합니다.
주요 특징:
- 실행환경 5.0.0 및 공통컴포넌트 254종 통합
- SVN Connectors를 Subversive에서 ArSysOp SVN Connectors로 교체
- Java 21 지원
- 성능 개선 및 메모리 최적화
통합 개발 도구:
- egovframe Data Editor: 데이터베이스 쿼리 및 매핑 파일 편집
- egovframe Code Generator: 템플릿 기반 코드 자동 생성
- egovframe Validator: 소스코드 품질 검증
VS Code Extension v5.0 (Beta)
VS Code 사용자를 위한 확장 프로그램도 대폭 업데이트되었습니다. 경량 IDE를 선호하는 개발자들을 위한 완전한 개발 환경을 제공합니다.
지원 기능:
| 기능 | 설명 |
|---|---|
| Project Generation | Web, Template, Boot, MSA, Mobile, Batch, AI 프로젝트 생성 |
| CRUD Code Generation | DDL 기반 CRUD 코드 자동 생성 (Controller, Service, Mapper) |
| Configuration Generation | Datasource, ID Generation, Logging, Property, Scheduling, Transaction 설정 |
| Template Management | 프로젝트 템플릿 관리 및 커스터마이징 |
| Domain Generation | 도메인 엔티티 및 DTO 자동 생성 |
기술 스택:
- React Framework: 확장 프로그램 UI 개발
- Handlebars 템플릿 엔진: 코드 템플릿 렌더링
- Monaco Editor: VS Code의 핵심 에디터 컴포넌트 활용
CRUD 코드 생성 예시:
DDL을 입력하면 다음 코드들이 자동 생성됩니다:
-- 입력 DDL
CREATE TABLE COMTNBOARD (
BBS_ID VARCHAR(20) PRIMARY KEY,
BBS_NM VARCHAR(100) NOT NULL,
BBS_INTRCN VARCHAR(500),
REGIST_DT DATETIME DEFAULT CURRENT_TIMESTAMP,
UPDT_DT DATETIME
);
생성되는 파일:
BoardVO.java- Value ObjectBoardMapper.java- MyBatis Mapper InterfaceBoardMapper.xml- SQL Mapping XMLBoardService.java- Service InterfaceBoardServiceImpl.java- Service ImplementationBoardController.java- REST Controller
운영환경 v5.0 (Beta)
클라우드 서비스 메시
MSA(Microservices Architecture) 환경을 위한 클라우드 네이티브 구성을 지원합니다. 단순한 컨테이너 오케스트레이션을 넘어, 서비스 메시 아키텍처를 표준으로 제공합니다.
| 구성 요소 | 버전 | 용도 |
|---|---|---|
| Kubernetes | v1.32.5 | 컨테이너 오케스트레이션 |
| Istio | v1.25.3 | 서비스 메시 |
Kubernetes 배포 구성
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: egov-service
namespace: egov-system
spec:
replicas: 3
selector:
matchLabels:
app: egov-service
template:
metadata:
labels:
app: egov-service
version: v1
spec:
containers:
- name: egov-service
image: egov-service:5.0.0
ports:
- containerPort: 8080
resources:
requests:
memory: "512Mi"
cpu: "500m"
limits:
memory: "1Gi"
cpu: "1000m"
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
Istio 서비스 메시 구성
# destination-rule.yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: egov-service
spec:
host: egov-service
trafficPolicy:
connectionPool:
tcp:
maxConnections: 100
http:
h2UpgradePolicy: UPGRADE
http1MaxPendingRequests: 100
http2MaxRequests: 1000
outlierDetection:
consecutive5xxErrors: 5
interval: 30s
baseEjectionTime: 30s
maxEjectionPercent: 50
---
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: egov-service
spec:
hosts:
- egov-service
http:
- route:
- destination:
host: egov-service
subset: v1
weight: 90
- destination:
host: egov-service
subset: v2
weight: 10
retries:
attempts: 3
perTryTimeout: 2s
관찰가능성(Observability) 도구
분산 시스템의 모니터링과 트러블슈팅을 위한 완전한 옵저버빌리티 스택을 제공합니다. 이는 단순한 모니터링을 넘어, 마이크로서비스 간의 통신 패턴 분석, 성능 병목 식별, 장애 원인 파악까지 지원합니다.
| 도구 | 버전 | 용도 |
|---|---|---|
| OpenTelemetry | v0.120.0 | 통합 수집 (Traces, Metrics, Logs) |
| Prometheus | - | 메트릭 수집 및 알림 |
| Grafana | - | 시각화 대시보드 |
| Loki | - | 로그 집계 |
| Jaeger | - | 분산 트레이싱 |
| Kiali | - | 서비스 메시 시각화 |
| Tempo | - | 트레이스 백엔드 |
OpenTelemetry 구성
# application.yml
management:
tracing:
enabled: true
sampling:
probability: 1.0
otlp:
tracing:
endpoint: http://otel-collector:4317
metrics:
export:
enabled: true
step: 60s
spring:
application:
name: egov-service
Three Pillars of Observability
1. Metrics (메트릭)
- CPU, 메모리, 디스크 사용량
- HTTP 요청 수, 응답 시간, 에러율
- JVM 메트릭 (GC, Heap, Thread)
- 커스텀 비즈니스 메트릭
2. Logs (로그)
- 구조화된 JSON 로그 형식
- Correlation ID를 통한 요청 추적
- 로그 레벨별 필터링
- 중앙 집중식 로그 관리
3. Traces (트레이스)
- 분산 요청 추적
- 서비스 간 호출 경로 시각화
- 지연 시간 분석
- 에러 원인 파악
공통컴포넌트 v5.0 (Beta)
업그레이드 및 보안 강화
공통컴포넌트는 총 254종으로 구성되며, 실행환경 5.0.0으로의 업그레이드가 반영되었습니다.
주요 개선 사항:
- 컨트리뷰션 반영: 71명의 개발자 컨트리뷰션 370건 반영
- 보안 강화: KISA, NSR(국가보안기술연구소) 보안 점검 결과 반영
- 시큐어 코딩: OWASP Top 10 대응 가이드라인 적용
공통컴포넌트 분류
| 구분 | 주요 컴포넌트 |
|---|---|
| 로그인/인증 | 로그인, 인증, 인가, 세션, 접근제어 |
| 사용자관리 | 사용자, 부서, 조직, 권한, 역할 |
| 게시판 | 게시판, 공지사항, Q&A, FAQ, 만족도조사 |
| 민원 | 민원신청, 민원처리, 민원조회, 민원통계 |
| 결재 | 기안, 결재, 협조, 시행, 문서관리 |
| 통계 | 로그분석, 방문자, 접속통계, 성능통계 |
| 시스템 | 시스템관리, 백업, 복구, 모니터링 |
보안 기능 강화
적용된 보안 기능:
- 입력값 검증: XSS, SQL Injection 방지
- 세션 보안: 세션 하이재킹 방지
- 비밀번호 정책: 복잡성, 만료, 이력 관리
- 접근 통제: IP 기반, 시간 기반 접근 제어
- 감사 로그: 모든 중요 작업에 대한 로그 기록
- 암호화: 개인정보 암호화 저장, 전송 구간 암호화
모바일 v5.0 (Beta)
Flutter 기반 모바일 API
기존 하이브리드 앱 방식에서 Flutter 기반으로 완전히 재작성되었습니다. 크로스 플랫폼 개발 환경을 제공하여 iOS와 Android를 단일 코드베이스로 개발할 수 있습니다.
기술 스택 변화:
| 구분 | 기존 | 5.0 |
|---|---|---|
| 프레임워크 | 하이브리드 (Web + Native) | Flutter |
| UI | HTML/CSS/JS | Flutter Widget |
| 네이티브 연동 | Cordova Plugin | Flutter Platform Channel |
| 디자인 | 커스텀 | KRDS 디자인 |
모바일 디바이스 API APP
Flutter 기반 디바이스 API 가이드 프로그램 9종을 제공합니다:
- 카메라 API: 사진 촬영, 동영상 녹화
- 갤러리 API: 사진/동영상 선택, 저장
- 파일 API: 파일 탐색, 업로드/다운로드
- GPS API: 위치 정보 획득, 지도 연동
- NFC API: NFC 태그 읽기/쓰기
- 바코드 API: QR코드, 바코드 스캔
- 푸시 API: 알림 수신, 처리
- 생체인증 API: 지문, Face ID 인증
- 보안 API: 암호화, 인증서 관리
모바일 디바이스 API Web
Flutter 기반 DeviceAPI와 연동되는 웹서버 9종을 제공합니다:
- 실행환경 5.0.0 적용
- Spring Boot 기반 REST API
- JWT 인증 지원
- 파일 업로드/다운로드 처리
- 푸시 발송 서버 연동
KRDS 디자인 리소스
KRDS(Korea Responsive Design System) 디자인 리소스가 반영되어 공공서비스 UI/UX 가이드라인을 준수합니다.
- 공통 컴포넌트 (버튼, 입력필드, 카드 등)
- 접근성 가이드 준수
- 다크 모드 지원
- 반응형 디자인
버전별 구성 요약
| 구성 요소 | 버전 | 주요 특징 |
|---|---|---|
| 실행환경 | v5.0(beta) | Spring Boot 3.5.6, AI RAG |
| 개발환경 | v5.0(beta) | Eclipse 2025-03, VS Code Extension |
| 운영환경 | v5.0(beta) | Kubernetes, Istio, Observability |
| 공통컴포넌트 | v5.0(beta) | 254종, 보안 강화 |
| 모바일 | v5.0(beta) | Flutter 기반 |
마이그레이션 가이드
Spring Framework 6.x 마이그레이션 체크리스트
기존 3.x 또는 4.x 버전에서 5.0으로 마이그레이션할 때 확인해야 할 사항을 정리합니다.
1. Java 버전 확인
# Java 17 이상 필요
java -version
# openjdk version "17.0.x" 또는 그 이상
2. 의존성 업데이트
<!-- pom.xml -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.5.6</version>
</parent>
<properties>
<java.version>17</java.version>
<egovframe.version>5.0.0</egovframe.version>
</properties>
3. javax → jakarta 변경
전역 검색 및 치환:
javax.servlet→jakarta.servletjavax.persistence→jakarta.persistencejavax.validation→jakarta.validationjavax.annotation→jakarta.annotationjavax.transaction→jakarta.transaction
4. Spring Security 설정 변경
// SecurityConfig.java 재작성 필요
@Configuration
@EnableWebSecurity
@EnableMethodSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
.sessionManagement(session ->
session.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(auth -> auth
.requestMatchers("/api/public/**").permitAll()
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults()));
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
5. Spring Batch 5.x 변경사항
// 기존 Batch 설정
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.start(step1())
.next(step2())
.build();
}
// Spring Batch 5.x 설정
@Bean
public Job job(JobRepository jobRepository, Step step1, Step step2) {
return new JobBuilder("job", jobRepository)
.start(step1)
.next(step2)
.build();
}
AI RAG 도입 가이드
공공기관에서 AI 서비스 도입 시 고려사항:
1. Ollama 설치 및 구성
# 서버에 Ollama 설치
curl -fsSL https://ollama.ai/install.sh | sh
# 모델 다운로드
ollama pull llama3.2
ollama pull nomic-embed-text
# 서비스 시작
systemctl start ollama
2. Redis Stack 구성
# docker-compose.yml
version: '3.8'
services:
redis:
image: redis/redis-stack:latest
ports:
- "6379:6379"
- "8001:8001"
volumes:
- redis-data:/data
volumes:
redis-data:
3. Spring AI 의존성 추가
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-redis-store</artifactId>
</dependency>
클라우드 네이티브 전환 가이드
컨테이너 기반 배포를 위한 단계별 가이드:
1. Dockerfile 작성
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY target/egov-service.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
2. Kubernetes 매니페스트 작성
# k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: egov-service
spec:
replicas: 3
template:
spec:
containers:
- name: egov-service
image: egov-service:5.0.0
env:
- name: SPRING_PROFILES_ACTIVE
value: "prod"
- name: JAVA_OPTS
value: "-Xms512m -Xmx1g"
3. Istio 서비스 메시 적용
# Istio 설치
istioctl install --set profile=default
# 네임스페이스에 Istio 인젝션 활성화
kubectl label namespace egov-system istio-injection=enabled
# 애플리케이션 배포
kubectl apply -f k8s/
마치며
표준프레임워크 5.0은 단순한 버전 업데이트가 아니라, 클라우드 네이티브와 AI 시대에 맞춘 완전한 아키텍처 변화를 담고 있습니다. 2011년 첫 출시 이후 약 15년 만의 대대적인 변화입니다.
특히 주목할 점은:
- Spring Boot 3.5.6으로 최신 스프링 생태계 지원 - 현대적인 개발 방식 적용
- AI RAG 예제로 공공 AI 서비스 개발 가이드 제공 - 생성형 AI 도입 지원
- Kubernetes + Istio로 MSA 기반 클라우드 네이티브 지원 - 확장성과 안정성 확보
- Flutter 기반 모바일 개발 환경 현대화 - 크로스 플랫폼 개발 효율성 향상
- 옵저버빌리티 스택으로 운영 효율성 향상 - 장애 대응 및 성능 최적화
- 보안 강화로 공공기관 보안 요구사항 충족 - KISA/NSR 보안 점검 반영
이번 업데이트는 공공기관 개발자들에게 큰 기회입니다. 베타 버전부터 미리 경험해보고, 정식 버전 출시에 대비하여 기술 역량을 확보하는 것이 좋겠습니다. 특히 Spring Boot 3.x와 AI/ML 기술은 향후 공공 IT 시장의 핵심 역량이 될 것입니다.
참고 자료