title: "The Twelve-Factor App 개인적 해석 2/2"
description: "web app, SaaS와 같은 서비스형 소프트웨어를 구축하기 위한 일종의 Best Practice인 Twelve-Factor 앱에 대한 개인적 해석 2/2"
cleanUrl: /sw-engineer/twelve-factor-app-2
ogImage: "<https://anyflower.notion.site/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7570d2fc-66b1-4e23-bb3c-ff7b56842b0d%2Fbdb52cf8-2959-4c19-8248-7792dbdf8fbf%2FUntitled.png?table=block&id=0bd12363-36db-4271-93a2-ce27e3936fdd&spaceId=7570d2fc-66b1-4e23-bb3c-ff7b56842b0d&width=2000&userId=&cache=v2>"
floatFirstTOC: right

이미지 출처: https://architecturenotes.co/12-factor-app-revisited/

이미지 출처: https://architecturenotes.co/12-factor-app-revisited/

Introduction

The Twelve-Factor App 개인적 해석 1/2 에서 이어지는 The Twelve-Factor App에 대한 나머지 6개 지침에 대한 해석이다. 앞선 글과 마찬가지로 주로 참조한 문서는 다음과 같다.

The Twelve-Factor App

Google Cloud에서의 Twelve-Factor App 개발  |  클라우드 아키텍처 센터

The Twelve-Factor App

7. Port Binding: 포트 바인딩으로 서비스 내보내기

Export services via port binding (포트 바인딩으로 서비스 내보내기)

이미지 출처: https://architecturenotes.co/12-factor-app-revisited/

이미지 출처: https://architecturenotes.co/12-factor-app-revisited/

이 문장, *“The twelve-factor app is completely self-contained and does not rely on runtime injection (Twelve-factor app은 완전히 자기완결적이어야. 그리고 런타임 주입에 의존하지 말라)”*이 핵심인 듯. 문서에서는 예전에 많이 사용하던 방식인 Tomcat에 app을 주입하여 app을 노출시키는 방식을 자기완결적이지 않은 예로 시작부터 들이밀며 위 문장을 강조한다.

runtime injection과 port binding이 무슨 관계인지 잘 이해가 안되었는데, 여러 app을 주입할 수 있되 각 app이 자체적인 port를 갖는 컨테이너를 만드는 게 가능하기 때문. 물론 컨테이너로 인해 app 간에 독립성을 해치게 되므로 좋은 구조가 아님은 분명하다. 실제 이렇게 동작하는 컨테이너가 있는지도 의심스럽고.

이와 같은 관점에서, 각기 다른 port는 ‘일반적으로’ 각기 독립적인 실행 환경을 가짐을 암시한다는 측면에서, 나아가 service 식별 수준을 높인다는 수준에서 port binding을 논한 것으로 이해한다. 보통 한 process가 한 port를 점유한다는 측면에서 아래 8. Concurrency와도 의미가 연결되는 듯.

8. Concurrency: 프로세스 모델을 통한 규모 확장

Scale out via the process model (프로세스 모델을 통한 규모 확장)

이미지 출처: https://12factor.net/concurrency

이미지 출처: https://12factor.net/concurrency

프로세스 모델이라 함은 workload type 별로 process type(정확히는 process가 인스턴스화 될 프로토타입)을 나누라는 의미이다. 그리고 프로세스 모델을 취하는 이유는 concurrency, 즉 확장 용이성을 위함이다. 문서는 이에 반하는 예로 PHP와 JVM을 드는데, PHP의 request 량에 따른 child process spawn의 경우 동일 workload type임에도 parent와 child process가 이질적이란 점이 이슈로 보이고, JVM의 multi threading은 thread 사용 자체보다는 단일 JVM 내에서 서로 다른 workload type이 함께 운용되는 케이스를 문제 삼는 듯.

문서에서 process를 가리켜 first class citizen이라 표현하는데, 이는 workload에 대한 process 중심의 처리 정도로 이해한다(JVM 등에서는 process의 낮은 가시성을 문제 삼는다). 여담으로 first class는 함수형 언어에서 주로 사용되는 용어로, 데이터처럼 생성, 할당, 전달, 반환할 수 있는 function을 first class function이라 부른다. 결국 first class citizen란 연산 가능한 무엇을 의미하는데, 연산이 computing에서 가장 중요한 속성이기에 이 같이 칭하지 않았나 싶다.