java
CHAPTER 98 / 99
읽기 약 2분
FUNCTION
클라우드 네이티브: 12-Factor App
핵심 개념
12 원칙·코드베이스/의존성/설정/포트/로그/프로세스 — Spring Boot의 12-Factor 지원.
본문
12-Factor 원칙 + Spring Boot
1. 코드베이스: Git 저장소 1 + 배포 N
✅ Spring Boot — Maven/Gradle + Git
2. 의존성: 명시적 선언 + 격리
✅ build.gradle / pom.xml
3. 설정: 환경에 저장 (코드 X)
✅ application.yml + 환경변수 + @ConfigurationProperties
4. 백엔드 서비스: 첨부 리소스로 취급
✅ DataSource URL을 환경변수로 — DB 교체 시 코드 무변경
5. 빌드/릴리스/실행: 엄격히 분리
✅ Gradle bootJar + Docker 이미지 + ENTRYPOINT
6. 프로세스: stateless + share-nothing
✅ Spring Boot 기본 — Session은 Redis
7. 포트 바인딩: HTTP를 포트로 노출
✅ embedded Tomcat/Jetty
8. 동시성: 프로세스 모델로 확장
✅ K8s replicas + HPA
9. 폐기 가능: 빠른 시작 + 정상 종료
✅ Spring Boot Graceful Shutdown
10. 개발/프로덕션 패리티: 환경 차이 최소화
✅ Testcontainers + Docker Compose
11. 로그: 이벤트 스트림으로 취급
✅ stdout으로 출력 → Fluentd/Filebeat
12. 관리 프로세스: 1회성 작업도 동일 환경
✅ kubectl exec ... + Spring Boot CommandLineRunner#3 설정 — 12-Factor 안티 패턴
// ❌ 12-Factor 위반 — 설정이 코드에
@Service
public class S3Service {
private static final String BUCKET = "my-bucket"; // 환경별 다름
private static final String REGION = "us-east-1"; // 하드코딩
}
// ✅ 12-Factor 준수
@Service
@RequiredArgsConstructor
public class S3Service {
private final S3Properties properties;
public String getBucket() { return properties.bucket(); }
public String getRegion() { return properties.region(); }
}
@ConfigurationProperties(prefix = "aws.s3")
public record S3Properties(String bucket, String region) {}# application.yml
aws:
s3:
bucket: ${S3_BUCKET} # 환경변수
region: ${AWS_REGION}#6 stateless 프로세스
// ❌ 메모리에 상태 저장 — 인스턴스 간 불일치
@Service
public class SessionService {
private final Map<String, User> sessions = new ConcurrentHashMap<>();
// 인스턴스 A에 로그인 → 인스턴스 B 요청 시 인증 안 됨
}
// ✅ Redis로 상태 외부화
@Service
@RequiredArgsConstructor
public class SessionService {
private final RedisTemplate<String, User> redis;
public void store(String token, User user) {
redis.opsForValue().set("session:" + token, user, Duration.ofMinutes(30));
}
public Optional<User> get(String token) {
return Optional.ofNullable(redis.opsForValue().get("session:" + token));
}
}#9 Graceful Shutdown
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 30s
# K8s가 SIGTERM → Spring이 새 요청 거부 + 진행 중 요청 30초 대기 → 종료#11 stdout 로그
# logback-spring.xml — stdout으로
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
# K8s에서 자동 수집 → Fluentd → Elasticsearch클라우드 네이티브 추가 원칙
- 설계 → Container-First
- 실패 → 빠르게 Fail
- 자동화 → 모든 것 (배포·스케일·복구)
- 마이크로서비스 → 작은 책임
- 분산 → 네트워크 가정
- 관측 → 메트릭·로그·트레이싱 3요소다음 챕터
CH.30 "Java+Spring 마스터 로드맵" — 종합·커리어.
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 Spring 코드의 12-Factor App 부분을 분석해서 클라우드 네이티브 친화도와 개선 우선순위를 알려줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
12-Factor App vs 다른 패턴 비교를 실전 사례 5개로 보여주고 모놀리스 vs 12-Factor MSA를 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 코드베이스 전체를 분석해서 12-Factor App 관련 12-Factor 위반 위치를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 한국 기업의 12-Factor App 채택률과 한국 클라우드 네이티브 트렌드를 솔직히 알려줘.
⭐ 이것만 기억하세요
클라우드 네이티브: 12-Factor App는 이 3가지만 확실히 잡으세요
1.12-Factor App = 환경 의존 분리 + stateless + 빌드/릴리스/실행 분리
2.Spring Boot는 12-Factor 친화적 — 환경변수 + Graceful Shutdown + stdout
3.다음 챕터 CH.30에서 마스터 로드맵 — 주니어→시니어 커리어
공유하기
진행도 98 / 99