# 12 Factor App과 나의 의견
TIP
구 블로그에 남겨둔 기록을 옮겨왔다.
The Twelve-Factor App (한국어) (opens new window)
너무 이상적인 부분도 존재해서 난 동의하지 못하는 부분도 있다.
3. 환경
같은 경우는 os env로 설정하는 일이 쉽지 않다. 특히 간단하고 빠르게 구성하는 환경에서는.
heroku같은 곳이야 자체적으로 env를 제공하지만, 자체 서버 운영 같은경우는 어쩔 수 없이 .env
같은 파일로 관리하는게 현실적이다. 권장사항 정도로 받아들이자.
# 나만의 법칙
.env.sample
샘플 환경변수를 관리하자.- 환경파일은
env.ENV=[heroku, cafe24.linux, aws.ec2.linux]
1개만 정의하여, 파일에서 로드할지 말지 결정하자. - main의 처음에 바로 env 패키지를 사용해서 환경변수를 로드. 명시적 구조체로 로드해서 사용하자.
- ui, api등 인터페이스는 필수적인 입력 검증과 간단한 로직만 수행하며, 복잡한 로직은 service로 분리.
- 재사용 가능한 부분은 library로 분리.
- libaray는 호출만 가능한 수동적 모듈.
- 자체적으로 동작이 필요한 능동적 모듈은 active-service로 분리하자.
- active-service는 start, status, stop 인터페이스가 필요하다.
- 외부 시스템들은 래핑하여 passive-service로 분류.
- service는 동작이 불가해도 일단 프로세스 기동은 가능해야 하며, 사용시에 에러를 핸들링 하자.
- 여러 환경에서 구동 가능하도록 실제 앱 객체와 main을 분리한다.
- ORM은 사용하지 않는다.
- db를 사용할 때는 model로 분류하여 다룬다.
- model에서는 실제 db driver와 인터페이스하여 원하는 결과만 외부 인터페이스로 노출한다.
- db역시 service이며 model이 service.database를 사용한다.
- 로컬 개발중 service 연결이 어려울 때는, 가상의 모듈을 구현하여 대체한다.
- fake service를 구현하고, 앱 기동때 fake를 연결한다.
- db같은 경우는, fake database 구현이 복잡하면, model을 로컬용으로 별도 구현?
- 프로세스 외부에서 프로세스에 중단 신호를 보내서 graceful shutdown이 가능하게 한다.
- 로그는 환경에 따라 다르지만, stdout이나 파일로 출력 가능하게 한다.
- 파일 로그는 롤링이 가능해야 하며, 에이징을 위한 service를 구현한다.