서버 없이 굴리기

컴퓨터 자리를 통째로 빌리는 대신, 요청이 올 때만 코드 한 조각을 깨워 돌리는 방식이에요. 요금이 실행 횟수와 실행 시간으로 매겨지고, 한 번에 오래 도는 일에는 상한이 걸려 있어요.

쉽게 말하면

가게에 사람을 두는 방법은 둘이에요. 하나는 상시 직원을 채용해 손님이 없는 시간에도 월급을 주는 것이고, 다른 하나는 손님이 문을 열고 들어올 때만 시간제로 사람을 불러 그 시간만큼 값을 치르는 거예요. 서버 없이 굴리기는 뒤쪽이에요. 요청이 없으면 아무도 대기하지 않고, 요청 하나가 오면 그때 사람이 와서 일하고 끝나면 돌아가요.

"서버가 없다"는 말은 컴퓨터가 없다는 뜻이 아니에요. 컴퓨터는 여전히 남의 것으로 돌아가고, 다만 그 컴퓨터를 사장님이 빌리고 관리하지 않는다는 뜻이에요.

자리를 빌리는 방식
[[hosting|호스팅]] 자리를 월 단위로 빌려 두고, 손님이 없어도 계속 켜 둠

손님이 0명인 새벽에도 같은 값이 나가요. 대신 금액이 예측 가능하고, 오래 도는 작업도 마음대로 돌릴 수 있어요.

부를 때만 쓰는 방식
요청 하나가 올 때 코드 한 조각이 깨어나 답하고 바로 잠듦

손님이 없는 달은 거의 0원이에요. 대신 손님이 몰린 달은 청구서가 같이 뛰고, 한 번에 오래 도는 일은 못 해요.

청구서에 무엇이 찍히나

이 방식의 요금은 자리 값이 아니라 일한 값이에요. 그래서 청구서를 읽는 법이 월세와 완전히 달라요.

청구서에 있는 항목무엇을 센 것인가사장님 가게에서는
실행 횟수코드 조각이 깨어난 횟수예요. 손님 한 명이 화면 하나를 열 때 여러 번 깨어나기도 해요방문이 늘면 같이 늘어요. 봇이 두드려도 늘어요
실행 시간깨어나서 답을 내놓기까지 걸린 시간의 합이에요. 밀리초 단위로 재요느린 화면은 요금까지 비싸요. 속도 개선이 곧 절약이에요
메모리 크기한 번 깨어날 때 쓰기로 정해 둔 작업대 크기예요. 크게 잡으면 단가가 올라가요설정 화면에서 숫자 하나로 정해요. 기본값을 그냥 쓰는 경우가 많아요
오간 자료밖으로 내보낸 자료의 양이에요. 사진과 영상이 여기에 크게 잡혀요사진이 많은 가게일수록 여기가 커요. CDN을 앞에 두면 줄어요
무료 구간요금제마다 매달 공짜로 주는 구간이 있는 경우가 많아요. 그 위부터 과금돼요손님이 적을 때 0원처럼 보이는 이유예요. 넘는 순간부터 숫자가 보여요

요금이 뛰는 건 손님 때문만이 아니에요

실행 횟수는 누가 두드려도 늘어나요. 손님이든 검색 로봇이든 장난으로 새로고침을 반복하는 사람이든 똑같이 한 번이에요. 그래서 이 방식을 쓸 때는 호출 제한과 요금 상한 알림을 같이 켜 두는 게 정석이에요. 운영비 점검에서 매달 확인할 항목이기도 해요.

손님 눈에 보이는 두 가지 한계

이 방식에는 자리를 빌리는 방식에 없는 두 가지 특징이 있어요. 하나는 처음 한 번이 느린 것, 다른 하나는 한 번에 오래 못 도는 것이에요.

  1. 1요청이 도착해요. 지금 깨어 있는 조각이 하나도 없어요.
  2. 2빈 작업대를 하나 차리고 코드를 올려요. 여기서 걸리는 시간이 콜드 스타트예요. 첫 손님만 이걸 겪어요.
  3. 3코드가 실제 일을 해요. 데이터베이스에 묻고 답을 만들어요.
  4. 4답을 보내고 나면 그 작업대는 잠시 그대로 남아 있어요. 이때 들어온 다음 요청은 콜드 스타트 없이 바로 처리돼요.
  5. 5한동안 아무도 안 부르면 작업대가 치워져요. 그 뒤 첫 요청은 다시 2번을 겪어요.

그래서 새벽에 혼자 들어가 보면 첫 화면만 유난히 느리고, 두 번째부터 빨라지는 일이 생겨요. 고장이 아니라 구조예요. 손님이 꾸준히 있는 시간대에는 거의 나타나지 않아요.

여기서 터져요
명단 3천 명에게 메일 보내기를 요청 하나 안에서 전부 처리하려 함

플랫폼마다 한 번 실행에 걸린 시간 상한이 있어요. 넘으면 중간에 끊겨요. 절반은 보내지고 절반은 안 보내진 채로 끝나요.

이렇게 나눠요
메일 3천 건을 대기열에 쌓아 두고, 뒤에서 조금씩 꺼내 보냄

요청은 즉시 끝나고 발송은 뒤에서 돌아요. 실패한 건만 다시 넣을 수도 있어요. [[job-queue|대기열로 나중에 처리하기]]

상한은 플랫폼마다 달라요

한 번에 몇 초까지 도는지, 몇 개까지 동시에 깨어날 수 있는지는 쓰는 서비스와 요금제마다 다른 숫자예요. 오래 걸리는 기능을 붙이기 전에 그 숫자부터 확인하세요. 나중에 발견하면 이미 손님이 겪은 뒤예요.

기억을 못 한다는 점이 제일 자주 사고를 내요

시간제로 부른 사람은 일이 끝나면 돌아가요. 다음에 오는 사람은 어제 무슨 일이 있었는지 몰라요. 코드 조각도 똑같아요. 방금 처리한 내용을 다음 호출까지 들고 있지 않아요.

이렇게 만들면무슨 일이 생기나이렇게 바꿔요
방문자 수를 코드 안 변수에 더해서 셈조각이 잠들면 숫자가 0으로 돌아가요. 여러 개가 동시에 깨면 각자 따로 세요숫자는 데이터베이스에 저장해요. 기억은 밖에 두는 게 원칙이에요
손님이 올린 사진을 코드 옆 폴더에 저장그 작업대가 치워질 때 사진도 같이 사라져요사진은 별도 창고에 올려요. 파일 저장
로그인 상태를 조각의 메모리에 담아 둠다음 요청이 다른 조각으로 가면 로그인이 풀린 것처럼 보여요쿠키나 토큰으로 상태를 손님 쪽에 들려 보내요
느린 계산 결과를 조각 안에 캐시가끔 맞고 가끔 틀려요. 조각마다 다른 값을 들고 있으니까요공용 저장소에 캐시해요. 캐시
밤 12시에 정산을 돌리는 코드를 넣어 둠아무도 안 부르면 실행되지 않아요. 조각은 스스로 깨지 않아요정해진 시각에 깨워 주는 장치를 따로 붙여요. 정해진 시간에 자동 실행

장면 1 · 외주 개발자가 말했다

서버리스라 관리가 필요 없습니다. 알아서 늘어나니까 트래픽 걱정 안 하셔도 돼요.

앞부분은 맞고 뒷부분은 조건부예요. 조각은 정말 알아서 늘어나요. 그런데 그 조각들이 전부 하나의 데이터베이스에 접속하면 접속 자리가 먼저 차 버려요. 되물을 말은 하나예요. "동시에 몇 개까지 깨어날 수 있고, 데이터베이스 접속은 몇 개까지 받나요?" 이 두 숫자가 안 맞으면 손님이 몰린 날 앞은 멀쩡한데 뒤가 막혀요. 손님이 몰릴 때 버티기

장면 2 · 결제사 담당자가 말했다

연동하시려면 접속하는 IP를 알려주세요. 허용 목록에 등록해 드립니다.

이 방식은 기본적으로 나가는 주소가 매번 달라질 수 있어요. 그래서 고정 주소를 요구하는 상대와 붙일 때는 별도 설정이나 중계 장치가 필요해요. 견적 전에 확인할 항목이에요. "이 연동이 고정 IP를 요구하나요?" 한 줄이면 나중에 통째로 다시 만드는 일을 막아요.

언제 쓰고 언제 피하나

정직하게 말할게요. 대부분의 작은 가게에는 이 방식이 유리해요. 손님이 없는 시간의 값을 안 내는 게 초기에는 가장 큰 절약이니까요.

내 상황이 방식이 맞나이유
손님이 아직 적고 방문이 들쭉날쭉해요잘 맞아요안 부르면 값이 거의 안 나가요. 시작 단계에서 고정비가 0에 가까워요
주문·문의처럼 짧게 끝나는 요청이 대부분이에요잘 맞아요한 번에 짧게 도는 일이 이 방식의 정확한 용도예요
영상 변환이나 대량 발송처럼 오래 도는 일이 있어요그 부분만 따로 빼세요실행 시간 상한에 걸려요. 대기열이나 전용 작업 서버로 넘겨요
24시간 끊기지 않는 연결이 필요해요안 맞아요실시간 채팅처럼 계속 열어 두는 연결은 다른 방식이 필요해요
방문이 매달 꾸준하고 아주 많아요계산해 보세요일정 규모를 넘으면 자리를 통째로 빌리는 쪽이 싸지는 구간이 와요
고정 IP나 특수한 장비가 필요한 연동이 있어요확인이 먼저예요구조를 다 만든 뒤에 알면 다시 만드는 값이 붙어요

판단 기준은 감이 아니라 청구서 한 장이에요. 두세 달 실제 금액을 보고, 자리를 빌리는 방식의 월 정액과 비교하면 답이 바로 나와요. 그전에 미리 옮기는 건 대부분 헛수고예요.

AI에게 그대로 말할 문장

증상을 전문어로 옮기려고 애쓰지 마세요. 보이는 그대로 말하고 원하는 결과를 붙이는 것이 가장 잘 통해요. 오른쪽 칸은 그대로 복사해 붙여도 되는 문장이에요.

내가 겪는 일그대로 말할 문장
가끔 첫 화면만 유난히 느려요새벽처럼 방문이 없다가 처음 들어갈 때만 화면이 느려요. 첫 요청이 느린 원인을 확인하고, 자주 쓰는 화면은 미리 준비되게 해 주세요
대량 메일이 중간에 끊겨요명단 전체에 메일 보내기가 도중에 멈춰요. 한 번에 다 보내지 말고 대기열에 쌓아 조금씩 보내도록 바꾸고, 실패한 건은 다시 시도하게 해 주세요
올린 사진이 나중에 사라져요손님이 올린 사진이 시간이 지나면 안 보여요. 사진을 코드와 같은 자리에 저장하지 말고 별도 저장소에 올린 뒤 주소만 기록해 주세요
요금이 갑자기 뛰었어요이번 달 실행 횟수가 평소보다 많아요. 어떤 주소가 몇 번 호출됐는지 많은 순서로 보여주고, 사람이 아닌 접근을 막을 방법을 알려 주세요
밤에 도는 정산이 안 돌아요매일 밤 자동으로 도는 정리 작업이 실행되지 않아요. 정해진 시각에 실행을 깨우는 방식으로 바꿔 주세요
손님이 몰리자 오류가 났어요방문이 몰린 시간에 데이터베이스 접속 오류가 났어요. 동시에 열리는 접속 수를 확인하고 한도 안에서 돌도록 정리해 주세요

숫자를 먼저 물어보세요

구조를 바꾸기 전에 확인할 숫자는 셋이에요. 한 번 실행의 시간 상한 · 동시에 깨어날 수 있는 개수 · 이번 달 실행 횟수. 이 셋을 모르고 고치면 고친 뒤에도 같은 자리에서 다시 걸려요.

자주 묻는 것

Q. 서버가 없다는데 그럼 제 자료는 어디에 있나요?
자료는 데이터베이스와 파일 저장소에 그대로 있어요. 없어진 건 항상 켜져 있는 컴퓨터 한 대뿐이에요. 코드가 도는 자리만 부를 때 생겼다 사라지고, 저장된 것은 별개의 자리에 남아요.
Q. 호스팅과 뭐가 다른 건가요?
호스팅은 자리를 빌리는 계약이고, 이건 그 자리를 일한 만큼만 빌리는 방식이에요. 둘은 반대말이 아니라 요금과 관리 방식이 다른 선택지예요. 한 서비스 안에서 화면은 이 방식, 무거운 작업은 별도 서버로 섞어 쓰는 경우도 많아요.
Q. 관리가 필요 없다고 들었어요. 정말인가요?
컴퓨터 관리는 정말 안 해도 돼요. 보안 업데이트나 재부팅 같은 일이 사라져요. 대신 요금 상한, 실행 시간, 동시 실행 개수, 기록 확인은 여전히 사장님 몫이에요. 관리 대상이 사라진 게 아니라 바뀐 거예요.
Q. 청구서가 무서워요. 상한을 걸 수 있나요?
쓰는 서비스마다 이름은 다르지만 금액 알림이나 사용량 한도 설정이 대체로 있어요. 문 열기 전에 이것부터 켜세요. 실제 요금 사고의 대부분은 잘못 만든 코드가 스스로를 계속 부르거나, 막지 않은 주소를 기계가 두드린 경우예요.
Q. 바이브캠퍼스로 만들면 이걸 제가 정해야 하나요?
만드는 동안 서버를 직접 빌리거나 설정할 일은 없어요. 이 문서가 필요한 순간은 오래 걸리는 기능을 붙일 때, 그리고 외주 견적이나 연동 문서에서 이 말이 나올 때예요.
Q. 나중에 일반 서버로 옮길 수 있나요?
옮길 수 있어요. 옮기는 값을 정하는 건 기억을 어디에 뒀는지예요. 자료를 전부 데이터베이스와 저장소에 뒀다면 이사가 가벼워요. 코드 안에 상태를 담아 뒀다면 그 부분을 전부 다시 짜야 해요.

확인해 보세요

이번 달 요금이 지난달의 다섯 배로 나왔어요. 방문자 수는 거의 그대로예요. 가장 먼저 볼 곳은 어디일까요?

하나 더

손님 3천 명에게 안내 메일을 보내는 기능을 붙이려고 해요. 어떻게 부탁하는 게 안전할까요?

직접 해보기

내 서비스가 어디서 오래 도는지 물어보세요

스튜디오 대화창에 그대로 붙여 넣어 보세요. "지금 만든 기능 중에 한 번 실행이 오래 걸릴 수 있는 곳을 찾아 목록으로 보여주고, 각각을 뒤에서 처리하도록 바꾸는 방법을 알려 주세요." 아직 만들기 전이라면 계획 중인 기능 기준으로 짚어 줘요. 오래 도는 곳을 미리 아는 것이 이 문서의 목적이에요.

스튜디오 열기

더 깊이 (안 읽어도 괜찮아요)

비유가 어디까지 맞고 어디부터 다른가 · 시간제로 사람을 부르는 비유는 요금과 대기 시간까지 정확해요. 다른 점은 한 번에 한 명이 아니라는 것이에요. 손님 백 명이 동시에 들어오면 사람도 백 명이 동시에 생겨요. 그래서 앞은 아무리 늘어나도 멀쩡하고, 뒤에 있는 데이터베이스나 외부 연동이 먼저 막혀요. 이 방식에서 병목은 거의 항상 조각 자신이 아니라 조각이 부르는 상대에게 있어요.

왜 첫 요청만 느린가 · 코드가 도는 자리는 그냥 켜지는 게 아니라 한 번 차려져야 해요. 필요한 부품을 올리고 설정을 읽는 시간이 붙어요. 그래서 코드 덩치가 크고 부품이 많을수록 첫 요청이 더 느려져요. 용량 줄이기가 여기서도 값어치를 해요. 손님이 꾸준한 서비스에서 이 문제가 잘 안 보이는 건, 작업대가 계속 재사용되기 때문이에요.

기록이 유일한 증거예요 · 자리를 빌리는 방식에서는 그 컴퓨터에 들어가 무슨 일이 있었는지 볼 수 있어요. 이 방식에서는 그 자리가 이미 사라졌어요. 남은 건 실행할 때 남긴 기록뿐이에요. 그래서 문 열기 전에 무엇을 기록으로 남길지 정해 두는 게 중요해요. 요청이 실패했을 때 어떤 손님의 어떤 요청이었는지 못 찾으면 원인 추적이 통째로 막혀요. 시간 초과와 재시도와 같이 읽으면 좋아요.

이것만 기억하세요

  • ·자리를 빌리는 게 아니라 요청이 올 때만 코드 한 조각을 깨우는 방식이에요
  • ·요금은 실행 횟수와 실행 시간으로 매겨져요. 손님이 아닌 기계가 두드려도 똑같이 올라가요
  • ·한 번 실행에는 시간 상한이 있어요. 오래 걸리는 일은 대기열로 뒤에 빼요
  • ·조각은 기억을 못 해요. 숫자와 파일과 상태는 항상 밖에 저장해요
  • ·문 열기 전에 요금 상한 알림과 호출 제한을 켜 두세요
VibeCampus新建作品