avatar
sanghyeon.dev.log
Next.js server action의 함수가 실행되지 않는 문제
Next.js와 FaaS
next.js
Aug 27
·
3 min read

문제

서버사이드에서 동작하는 아래와 같은 코드의 결과가 가끔씩 들어왔다.

mixpanel.track(event, { distinct_id: userId, properties }, err => {  
  if (err) {  
    reject(err);  
  } else {  
    resolve("success");  
  }  
});

로컬에서 테스트했을 때는 하나의 이벤트도 빠지지 않고 전부 들어왔지만, 배포 후에는 모든 이벤트가 들어오지 않는 현상을 확인했다.

원인

원인을 살펴보기전 Vercel Function에 대해 알아보자. Vercel에서는 Vercel에 배포된 환경에 대해 Vercel Function이라는 기능을 제공한다.

Vercel Function에 대해 간략하게 설명하면, Vercel에 배포된 모든 서버 사이드에서의 코드 실행은 버셀의 인프라 환경 아래에서 실행된다는 것이며. 즉, FaaS가 적용 된다는 뜻이다.

Vercel의 이러한 기능 덕에, 우리가 서버설정을 딱히 하지 않아도 API Routes나, SSR등을 이용할 수 있는 것이다.

✏️ Good to Know

Vercel의 Serverless architecture는 AWS의 Lambda를 통해 구동된다.

가끔씩 동작했던 코드는 서버 액션으로 설정되어 서버 측에서 작동했고, Vercel은 기본적으로 서버리스로 호스팅되기 때문에 코드도 서버리스 함수로 등록된다.

이는 함수가 람다를 통해 실행되는 것을 의미하고, 그렇게 될 경우 Promise로 감싸지 않으면 코드가 실행이 완료되기 전에 종료될 수 있어 callback 함수가 실행되지 않아 동작이 종종 중단되었던 것이다.

해결

따라서 코드를 아래와 같이 Promise로 감싸주었고, 모든 이벤트가 정상적으로 들어왔다.

return new Promise((resolve, reject) => {
    mixpanel.track(event, { distinct_id: userId, properties }, (err) => {
      if (err) {
        reject(err)
      } else {
        resolve('success')
      }
    })
  })

참조

Behind the scenes of Vercel's infrastructure: Achieving optimal scalability and performance – Vercel


- 컬렉션 아티클







안녕하세요