TypeDI와 TypeORM을 사용하기로는 결정했다. 하지만 lambda에서 동작하도록 코드를 구성하기에는 많은 예제에서 다루는 express/routing-controller 형식의 http 요청을 모방할 수는 없었다.
구현방법을 이리저리 모색하다가 여러가지 이슈에 도달하게 되었다.
그래서 직접 테스트 환경에서 배포해보며 TypeDI 가 어떻게 동작하는지 확인해보았다. 아래와 같은 제약사항을 두었고 흐름을 확인해 보았다.
대략 3시간 정도 삽질을 끝낸 후에, 다음과 같은 코드 구성에서 DataSource가 잘 동작하는 구조를 얻을 수 있었다.handler.ts에서는 TypeDI의 Container로부터 DataSource 객체를 얻을 수 있는 지 확인한다. probSetRepo(원래는 Service 여야 함)의 dataSource 객체를 사용하여 getRepository한 결과와 아래 test함수의 결과가 동일해야 한다.
promise로 SecretManager에서 rds 연결정보를 잡으려고 했을 때는 DataSource가 undefined였기 때문이다.
connection은 promise를 resolve하면 DataSource를 반환하게 하였다. 이는 위 handler.ts에서
Container.set
을 사용해 등록되게 된다.
마지막으로 ProbSetService는
@Service()
데코레이터를 통해 함수 호출로 lambda 컨테이너 생성 시 바로 등록될 수 있도록 하였으며 handler.ts에서 Container.get(ProbSetService)
로 생성된 객체를 사용할 수 있었다.
결과적으로 DataSource가 정상적으로 동작하는 것을 확인할 수 있다. 코드는 정상적으로 사용할 수는 있겠으나 test 케이스를 던지는 경우와 코드 통일성에서 많이 부족해 보인다. 리팩토링을 계속 하면서 개선해 나가야겠다고 생각한다.
class A {
private privateValue
constructor(value){
this.privateValue = value
}
public static async init(){
const value = await someFunction()
return new A(value)
}
}
const obj = A.init()
따로 검증은 해보지 않았지만 이 방법이 제대로 된 방법인지 확인해보고 싶다. 이런 궁금증은 따로 모아두는 것도 좋을 듯 하다.