Skip to content

Commit b491f7e

Browse files
authored
Update Micronaut intro index.mdx
1 parent 389855c commit b491f7e

1 file changed

Lines changed: 11 additions & 11 deletions

File tree

  • src/content/posts/2026-02-22-micronaut-1-intro

src/content/posts/2026-02-22-micronaut-1-intro/index.mdx

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,9 @@ Rod Johnson의 2002년 책 "Expert One-on-One J2EE Design and Development"[^rj_b
108108

109109
### 전자정부프레임워크: Spring을 국가 표준으로
110110

111-
이 혼재 구조를 바꾼 것이 **전자정부표준프레임워크(eGovFrame)**입니다. 2009년 6월 24일 행정안전부가 v1.0 소스코드를 공개했고,[^egov_nia] 그 아키텍처는 **Spring MVC + Spring Web Flow + Spring+iBATIS + Spring Transaction** 조합이었습니다.[^vicki_2009] 단순한 기술 권고가 아니었습니다. 「행정기관 및 공공기관 정보시스템 구축·운영 지침(행정규칙)」에 **"전자정부표준개발프레임워크의 적용을 우선적으로 고려하여야 한다"**는 조항이 명시되며,[^law_egov] 신규 사업의 발주·감리 문서에서 Spring 기반 아키텍처가 기본 체크리스트가 됐습니다. 2011년 11월 기준으로 이미 166개의 공공 정보화사업에 적용됐다는 수치가 정부 브리핑에 등장합니다.[^briefing_2011]
111+
이 혼재 구조를 바꾼 것이 **전자정부표준프레임워크(eGovFrame)** 입니다. 2009년 6월 24일 행정안전부가 v1.0 소스코드를 공개했고,[^egov_nia] 그 아키텍처는 **Spring MVC + Spring Web Flow + Spring+iBATIS + Spring Transaction** 조합이었습니다.[^vicki_2009] 단순히 권고 차원이 아니라, 「행정기관 및 공공기관 정보시스템 구축·운영 지침(행정규칙)」에 **"전자정부표준개발프레임워크의 적용을 우선적으로 고려하여야 한다"**는 조항이 명시되며[^law_egov] 신규 사업의 발주·감리 문서에서 Spring 기반 아키텍처가 기본 체크리스트가 됐습니다. 2011년 11월 기준으로 이미 166개의 공공 정보화사업에 적용됐다는 수치가 정부 브리핑에 등장합니다.[^briefing_2011]
112112

113-
공공 SI 비중이 높은 한국 시장 구조상,표준화는 민간으로도 파급됐습니다. eGovFrame 기반 공공사업에서 훈련된 개발자 풀이 민간 프로젝트로 이동하면서, "Spring = 개발 방법론의 기본값"이라는 관성이 산업 전반으로 확산됐습니다.
113+
공공 SI 비중이 높은 한국 시장 구조상 이 기조는 민간으로도 파급됐습니다. eGovFrame 기반 공공사업에서 양성된 개발자 풀이 민간 프로젝트로 이동하면서, "Spring = 개발 방법론의 기본값"이라는 관성이 산업 전반으로 확산됐습니다. eGovFrame에 익숙한 SI 업체들 중에는 민간 프로젝트에서도 eGovFrame을 사용하기도 했습니다.
114114

115115
Spring이 한국 커뮤니티에서 본격적으로 논의되기 시작한 것은 Spring 2.0(2006) 이후이지만, "한국 Java = Spring"이라는 등식으로 굳어진 배경에는 이 공공 표준화 과정이 있었습니다. EJB는 레거시로 밀려났고, Struts는 신규 프로젝트에서 선택할 유인이 사라졌습니다.
116116

@@ -175,15 +175,15 @@ Spring이 탄생한 2003년과 Micronaut이 등장한 2018년 사이에 세상
175175

176176
### 콜드 스타트가 중요해진 이유
177177

178-
2000년대 중반까지 서버는 "항상 켜져 있는 물리 장비"였습니다. 시작 시간이 30초든 1분이든 큰 문제가 없었습니다. 서버는 배포 후 수개월을 재시작 없이 운영되었습니다.
178+
2000년대 중반까지 백엔드 서버 어플리케이션은 베어메탈 서버에서 항상 항상 켜져 있었습니다. 시작 시간이 30초든 1분이든 큰 문제가 없었습니다. 서버는 배포 후 수개월을 재시작 없이 운영되었습니다.
179179

180-
2013년 Docker의 등장과 함께 컨테이너 환경이 확산되었고, 2014년 AWS Lambda가 발표되며 서버리스가 등장했습니다.[^lambda_ga] 그리고 클라우드 VM을 탄력적으로 운용하는 방식도 보편화되었습니다. 세 환경 모두에서 시작 시간이 핵심 지표가 됩니다.
180+
AWS를 기점으로 클라우드 VM이 대중화된 이후, 2013년 Docker의 등장과 함께 컨테이너 환경이 확산되었고, 2014년 AWS Lambda가 발표되며 서버리스가 등장했습니다.[^lambda_ga] 세 환경 모두에서 시작 시간이 핵심 지표가 됩니다.
181181

182182
[^lambda_ga]: AWS Lambda는 2014년 11월 AWS re:Invent에서 처음 발표(preview)됐고, GA는 2015년 4월입니다. https://aws.amazon.com/blogs/compute/aws-lambda-is-generally-available/
183183

184-
- **클라우드 VM 오토스케일링**: EC2 Auto Scaling Group과 CloudWatch를 연동해 CPU 사용률이 임계치를 넘으면 새 인스턴스를 자동으로 추가하는 구성이 일반적입니다. VM 한 대에 Spring 인스턴스 하나를 띄우는 방식이더라도, 스케일 아웃 시 새 인스턴스가 트래픽을 받을 준비가 될 때까지 걸리는 시간이 병목이 됩니다. 시작 시간이 5초면 그 5초 동안 기존 인스턴스가 과부하를 혼자 감당해야 합니다.
184+
- **클라우드 VM 오토스케일링**: EC2 Auto Scaling Group과 CloudWatch를 연동해 탄력적으로 인스턴스를 운용해서 비용을 절감할 수 있습니다. VM 한 대당 Spring 인스턴스 하나를 띄우는 방식이더라도, 스케일 아웃 시 새 인스턴스가 트래픽을 받을 준비가 될 때까지 걸리는 시간이 병목이 됩니다. 시작 시간이 5초면 그 5초 동안 기존 인스턴스가 과부하를 혼자 감당해야 합니다.
185185
- **컨테이너 / 쿠버네티스**: HPA(Horizontal Pod Autoscaler)가 파드를 추가할 때 새 파드가 `Ready` 상태가 될 때까지 트래픽을 받지 못합니다. 롤링 업데이트에서도 구버전 파드를 종료하기 전에 신버전이 준비되어야 합니다.
186-
- **서버리스 함수**: AWS Lambda는 요청이 없으면 인스턴스가 종료되고 다음 요청 시 새로 시작합니다. JVM 콜드 스타트가 수 초에 달하면 그 지연이 API 응답 시간으로 그대로 나타납니다.
186+
- **서버리스 함수**: AWS Lambda는 일정 시간 동안 요청이 없으면 인스턴스가 종료되고 다음 요청 시 새로 시작합니다. JVM 콜드 스타트가 수 초에 달하면 그 지연이 API 응답 시간으로 그대로 전이됩니다.
187187

188188
Spring Boot 애플리케이션의 JVM 시작 시간은 기본적인 웹 서비스 구성 기준 2~5초 수준입니다.[^spring_startup] 물리 서버 시대에는 무시할 수 있었던 이 시간이, 탄력적으로 크기가 변하는 클라우드 환경에서는 가용성과 비용에 직접 영향을 주기 시작했습니다.
189189

@@ -205,7 +205,7 @@ AWS Lambda는 128MB부터 10,240MB까지 메모리를 설정하며, 메모리와
205205

206206
### Graeme Rocher — Grails에서 Micronaut으로
207207

208-
Micronaut의 창시자 Graeme Rocher는 낯선 이름이 아닙니다. 그는 Grails 프레임워크의 핵심 개발자였습니다. Grails는 Groovy 언어로 Ruby on Rails 스타일의 개발 경험을 Java 생태계에 가져온 프레임워크로, Spring 위에서 동작합니다.
208+
Micronaut의 창시자 Graeme Rocher는 Grails로 유명한 개발자입니다. Grails는 Groovy 언어로 Ruby on Rails 스타일의 개발 경험을 Java 생태계에 가져온 프레임워크로, Spring 위에서 동작합니다.
209209

210210
Grails를 수년간 개발하면서 Rocher는 Spring의 한계를 깊이 이해하게 됩니다. Spring 기반 Grails 애플리케이션은 시작 시간이 길고, 클라우드 환경에 적합하지 않았습니다. 근본 원인은 Spring의 runtime reflection과 classpath scanning이었습니다.
211211

@@ -246,7 +246,7 @@ Micronaut이 해결하려 한 문제, "Spring의 런타임 reflection이 클라
246246

247247
### Quarkus: 표준을 지키며 빌드 타임으로
248248

249-
2019년 Red Hat이 Quarkus 1.0을 출시했습니다.[^quarkus_announcement] JBoss, Hibernate, RESTEasy를 만든 팀들이 합류한 프로젝트로, Jakarta EE 생태계에 깊은 뿌리를 두고 있습니다.
249+
2019년 Red Hat이 Quarkus 1.0을 출시했습니다.[^quarkus_announcement] JBoss, Hibernate, RESTEasy를 만든 팀들이 합류한 프로젝트로, Jakarta EE 생태계에 깊게 연관되어있습니다.
250250

251251
아이디어는 Micronaut과 유사하지만 구현 방식이 다릅니다. Micronaut은 Java annotation processor(APT)로 빌드 시 소스 코드를 분석해서 `BeanDefinition` 클래스를 생성합니다. Quarkus는 **Jandex**[^jandex]라는 별도 인덱서로 클래스패스를 빌드 타임에 인덱싱하고, **Gizmo**라는 바이트코드 생성기로 직접 바이트코드를 만들어냅니다. 그리고 **Arc**[^quarkus_cdi]라는 CDI 구현체가 이 생성된 코드를 런타임에 빠르게 초기화합니다.
252252

@@ -295,14 +295,14 @@ Helidon은 Micronaut, Quarkus와 달리 DI 처리를 컴파일 타임으로 옮
295295

296296
### Reflection-free
297297

298-
Micronaut은 런타임에 reflection을 사용하지 않습니다. 정확히는 framework core에서 사용하지 않는다는 의미입니다. 사용자 코드가 reflection을 쓰는 것은 막지 않습니다.
298+
Micronaut은 런타임에 reflection을 사용하지 않습니다. 정확히는 framework core에서 사용하지 않는다는 의미입니다. 사용자 코드가 reflection을 쓴다면 막지 않습니다.
299299

300-
왜 reflection이 문제인가?
300+
### 왜 reflection이 문제인가?
301301

302302
1. **성능**: reflection 호출은 일반 메서드 호출보다 느립니다. 특히 JVM warm-up 이전인 시작 시점에 수천 건씩 반복 실행될 때 병목이 됩니다.[^reflection_bottleneck]
303303
[^reflection_bottleneck]: reflection의 실제 오버헤드는 JVM 버전과 호출 패턴에 따라 다르며, JIT이 일부 경로를 최적화합니다. 시작 시점의 대량 반복 호출이 특히 문제가 됩니다.
304304
2. **메모리**: reflection에 필요한 메타데이터가 메모리를 차지합니다. Spring은 시작 시 수천 개의 클래스를 스캔하고 메타데이터를 캐싱합니다.
305-
3. **GraalVM Native Image 비호환**: Native Image는 reflection 사용 정보를 사전에 선언해야 합니다. 동적 reflection은 Native Image에서 동작하지 않습니다. Spring Native는 이를 위해서 `reflect-config.json`, `proxy-config.json` 등 다양한 Metadata 파일을 생성하는 복잡한 절차를 거칩니다.[^spring_native_aot]
305+
3. **GraalVM Native Image 호환성 저하**: Native Image는 reflection 사용 정보를 사전에 선언해야 합니다. 동적 reflection은 Native Image에서 동작하지 않습니다. Spring Native는 이를 위해서 `reflect-config.json`, `proxy-config.json` 등 다양한 Metadata 파일을 생성하는 복잡한 절차를 거칩니다.[^spring_native_aot]
306306
4. **타입 안전성 부재**: reflection 오류는 컴파일 타임이 아닌 런타임에 발생합니다.
307307
[^spring_native_aot]: https://docs.spring.io/spring-boot/docs/3.2.3/reference/html/native-image.html#native-image.introducing-graalvm-native-images.understanding-aot-processing
308308

0 commit comments

Comments
 (0)