celery는 한마디로 queue를 중간에 두고 백그라운드 작업을 실행할 수 있게 하는 파이썬 라이브러리다. python, 백그라운드 작업 하면 딱 떠오르는 유명한 라이브러리라서 이쪽에 관심이 있던, 혹은 프로젝트를 진행하셨던 분들이라면 아마 다 아실 거라 생각한다. 회사 프로젝트에서 celery를 사용할 일이 있어서 celery worker를 ecs로 배포했는데, 이와 관련하여 고민했던 과정들을 적어보고자 한다.
지금까지 알아온 것들을 바탕으로 Nest container가 어떻게 DI와 IoC를 적용하는 지 살펴보자. 정말정말 복잡하고 글도 길고 코드도 필자가 보고싶었던 부분만 본 거고 모든 내용이 필자의 뇌피셜이고 아 이런게 있구나 하는 정도로만 봐주길 바란다. 구조를 보여주는 사진도 추상적으로 마음대로 그린 것이다. 뇌피셜 주의
NestJS에서 소스코드 보다가 정말 신선했던 부분이 있었는데, 이게 NestJS를 개발한 사람이 혼자 이 방법을 생각해내서 사용한건지, 아니면 많이 쓰이는 방법인데 필자만 몰랐던 건지 모르겠지만 아무튼 되게 똑똑한 방법이고 활용성 높은 코드라고 느껴서 이렇게 따로 글을 써봤다. 나중에 알게 된 사실인데 테스트 패키지인 jest에서도 똑같아 보이는 걸 봤다. [링크] done promise는 여러 곳에서 많이 쓰이는 것 같다.
NestJS는 데코레이터와 reflection 기능을 기반으로 동작한다. 서비스로 등록하고 싶은 클래스에 Injectable 데코레이터를 달아주고, 모듈로 등록하고 싶은 클래스에 Module 데코레이터를 달아줘야만 metadata를 클래스에 할당해서 제대로 동작하기 때문이다.
Nest container를 통해 dependency가 관리된다는 건 알겠는데, 인스턴스를 뭘로 구분할까? 예를 들면 CatService의 인스턴스를 어딘가에 저장해놓고 DogService가 instantiate될 때 그걸 불러와야 하는데, 그 어딘가에는 CatService 말고 다른 인스턴스들도 있을건데, 뭘로 CatService의 인스턴스를 찾을까?
pulumi에는 dynamic resource provider 라는 게 존재한다. 리소스의 lifecycle을 직접 관리할 수 있는데, 여러모로 편리하고 확장성 있는 기능이다. (terraform에는 없다고 한다.) 원래 이런 게 있는지도 몰랐었는데 회사에서 좀 특별한? 상황이 생겨서 이러한 기능이 필요해서 찾다 보니 발견하게 됐다.
오늘(230307) pulumi destroy를 해서 회사에서 동작하는 개발용 서비스를 중지시켰다. pulumi cli가 내부적으로 어떻게 동작하는지 몰라서 일어난 일이다. 원래 있던 리소스의 파라미터 값을 편하게 가져오기 위해 pulumi import를 사용해서 코드를 짰으나 이게 pulumi 서버와 연동되는 줄 몰랐다.