OPEN HYPER STEP
← 목록으로 (Java+Spring)
JAVA · 98 / 99
java
CHAPTER 98 / 99
읽기 약 2
FUNCTION

클라우드 네이티브: 12-Factor App


핵심 개념

12 원칙·코드베이스/의존성/설정/포트/로그/프로세스 — Spring Boot의 12-Factor 지원.

본문

12-Factor 원칙 + Spring Boot

📋 코드 (35줄)
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 안티 패턴

JAVA📋 코드 (21줄)
// ❌ 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) {}
YAML📋 코드 (5줄)
# application.yml
aws:
  s3:
    bucket: ${S3_BUCKET}    # 환경변수
    region: ${AWS_REGION}

#6 stateless 프로세스

JAVA📋 코드 (22줄)
// ❌ 메모리에 상태 저장 — 인스턴스 간 불일치
@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

YAML📋 코드 (9줄)
server:
  shutdown: graceful

spring:
  lifecycle:
    timeout-per-shutdown-phase: 30s


# K8s가 SIGTERM → Spring이 새 요청 거부 + 진행 중 요청 30초 대기 → 종료

#11 stdout 로그

YAML📋 코드 (7줄)
# logback-spring.xml — stdout으로
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>


# K8s에서 자동 수집 → Fluentd → Elasticsearch

클라우드 네이티브 추가 원칙

📋 코드 (6줄)
- 설계 → 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