사주 앱을 만든다고 하면 흔히 “생년월일시 입력받아서 API 하나 붙이면 끝 아니냐”는 질문을 받습니다. 실제로 시중에는 만세력 계산을 대신 해주는 외부 서비스가 여럿 있고, 그것을 가져다 쓰면 개발 기간을 크게 줄일 수 있습니다. 저희도 초기에는 그 방법을 검토했습니다.
하지만 검토를 거듭할수록 외부 계산에 기대는 방식으로는 저희가 원하는 정확도를 담보하기 어렵다는 결론에 이르렀습니다. 오늘은 그 판단의 배경과, 그 대신 선택한 자체 개발이라는 결정에 대해 소식을 전해 드리려 합니다.
왜 외부 계산을 그대로 쓰지 않았나
만세력 계산은 겉보기에는 단순한 표 찾기처럼 보입니다. 태어난 연월일시를 입력하면 그에 대응하는 간지(干支) 여덟 글자가 나오는 구조이기 때문입니다. 그러나 실제로는 두 지점에서 계산 방식에 따라 결과가 갈리는 경우가 있습니다.
하나는 절입(節入) 시각입니다. 사주에서 월(月)이 바뀌는 기준은 달력의 1일이 아니라 절기가 들어오는 정확한 시각입니다. 이 시각은 초 단위까지 계산이 필요한데, 외부 API마다 참조하는 천문 계산 방식과 반올림 기준이 조금씩 달라 절입일 전후 몇 시간 사이에 태어난 경우 월주(月柱)가 다르게 나오는 사례를 확인했습니다.
다른 하나는 진태양시(眞太陽時) 처리입니다. 우리가 일상에서 쓰는 표준시는 경도상의 실제 태양 위치와 차이가 있어서, 사주 계산에서는 이 차이를 보정하는 것이 전통적인 방식입니다. 이 보정을 적용하는지 여부, 적용한다면 어느 기준으로 하는지에 따라 시주(時柱)가 갈리는 경우가 실제로 있었습니다.
⚠️ 작은 차이가 아닙니다 — 절입 시각이나 진태양시 보정에서 생기는 오차는 몇 분, 몇 시간 단위의 문제처럼 보이지만, 그 결과로 나오는 월주·시주 자체가 아예 다른 글자로 바뀔 수 있습니다. 사주 여덟 글자 중 하나라도 다르면 이후의 오행·십성 해석 전체가 달라지므로, 저희는 이 부분을 타협할 수 없는 지점으로 판단했습니다.
직접 만들기로 한 결정
외부 계산을 그대로 가져다 쓰면 이런 오차가 어디서 발생했는지 저희 쪽에서 직접 확인하거나 고칠 방법이 없습니다. 결과가 이상하다는 사용자 문의가 들어와도 “그 계산은 외부 서비스가 하는 부분이라 확인이 어렵다”고 답할 수밖에 없는 구조가 되는 셈입니다. 원인을 알 수 없는 오차는 고칠 수도 없는 오차입니다. 저희가 가장 경계했던 지점이 바로 이 부분이었습니다.
그래서 저희는 시간이 더 걸리더라도 만세력 계산 엔진을 자체 개발하는 쪽을 선택했습니다. 계산 로직 전체를 직접 코드로 짜고, 절입 시각과 진태양시 보정 기준을 저희가 명시적으로 정의해서 검증할 수 있는 구조로 만들었습니다. 외부 서비스에 의존했다면 개발 기간은 짧아졌겠지만, 결과에 문제가 생겼을 때 원인을 추적할 방법이 없다는 점에서 결국 더 큰 위험을 떠안는 선택이 되었을 것이라고 판단했습니다.
이 결정에는 비용도 함께 따라왔습니다. 절기 계산에 쓰이는 천문학적 공식을 검토하고, 서로 다른 계산 방식들을 비교하며 어떤 기준이 전통 명리학의 관점과 더 부합하는지 하나하나 확인하는 데 예상보다 많은 시간이 들었습니다. 그럼에도 이 시간을 아끼지 않은 이유는, 사주 계산이 앱의 다른 모든 기능(오늘의 운세, 궁합, 작명 등)이 딛고 서는 가장 밑바닥의 토대이기 때문입니다. 토대가 흔들리면 그 위에 무엇을 쌓아도 함께 흔들리게 됩니다.
💡 왜 처음부터 자체 개발을 택하지 않았나 — 사실 저희도 초기에는 외부 계산 서비스로 빠르게 프로토타입을 만들어 보는 것부터 시작했습니다. 그 과정에서 앞서 설명한 절입 시각·진태양시 처리의 불일치를 직접 발견했고, 이 문제를 근본적으로 해결하려면 계산 로직 자체를 저희 손으로 쥐고 있어야 한다는 결론에 이르렀습니다.
검증은 어떻게 했나 — 골든 테스트 69케이스
계산 로직을 직접 만드는 것과, 그 계산이 정확하다는 것을 증명하는 것은 다른 문제입니다. 저희는 이 검증을 위해 골든 테스트 69케이스를 구성했습니다. 절입일 전후의 경계 사례, 윤달이 낀 해, 시간대가 애매한 사례 등 계산이 틀리기 쉬운 조건들을 모아 정답이 이미 확인된 사주와 하나하나 대조하는 방식입니다.
새로운 코드를 수정할 때마다 이 69케이스를 전부 다시 통과하는지 확인하는 절차를 두었습니다. 계산 로직이 바뀌어도 이미 맞다고 검증된 사례들이 흔들리지 않는지를 매번 재확인하는 셈입니다.
💡 왜 이런 절차가 필요한가 — 만세력 계산은 한 번 정확하게 만들었다고 끝나는 작업이 아닙니다. 코드를 개선하거나 새 기능을 붙이는 과정에서 기존 계산 로직이 미세하게 영향을 받을 수 있기 때문에, 저희는 매번 같은 69케이스로 회귀 검증을 거치는 것을 원칙으로 삼고 있습니다.
윤달은 어떤 기준으로 처리하나
음력 생일 중에는 윤달에 태어난 경우도 있습니다. 윤달 계산은 천문학적으로 복잡한 영역이라, 저희는 이를 임의로 계산하지 않고 한국천문연구원(KASI)이 공개하는 음력·윤달 기준을 그대로 따르는 방식을 택했습니다. 국가 기관이 검증한 기준을 그대로 가져다 쓰는 것이, 저희가 독자적으로 새 기준을 만드는 것보다 안정적이라고 판단했기 때문입니다.
계산은 코드로, 해설은 언어로
자체 엔진을 만든 배경에는 저희가 앱을 설계하며 세운 원칙이 있습니다. 만세력·오행·십성 계산은 100% 결정론 코드로 처리하고, 그렇게 나온 결과를 오늘의 언어로 풀어 설명하는 부분에만 AI를 사용한다는 원칙입니다.
만약 계산 단계에서부터 결과가 불안정하다면, 그 위에 아무리 매끄러운 해설을 얹어도 근본적으로 신뢰할 수 없는 결과가 됩니다. 반대로 계산이 항상 같은 입력에 같은 결과를 내는 것이 보장된다면, 그 위에서 이루어지는 해설은 표현 방식만 다를 뿐 근거는 흔들리지 않습니다. 저희가 자체 엔진 개발에 시간을 들인 이유도 결국 이 순서 — 계산을 먼저 확실히 하고, 해설은 그 위에 얹는다는 순서를 지키기 위해서였습니다.
자주 묻는 질문 (FAQ)
Q1. 만세력 계산이 서비스마다 다르게 나오는 경우가 실제로 있나요? 절입 시각 경계나 진태양시 보정 여부에 따라 월주·시주가 달라지는 사례가 있습니다. 특히 절기가 들어오는 시각과 가까운 시간에 태어난 경우 이런 차이가 두드러지는 편입니다.
Q2. 진태양시 보정은 왜 필요한가요? 표준시는 특정 경도를 기준으로 통일해 쓰는 시간이지만, 사주 계산의 전통적 기준은 실제 태양의 위치입니다. 이 차이를 보정하지 않으면 태어난 지역에 따라 시주가 부정확해질 수 있다고 봅니다.
Q3. 골든 테스트 69케이스는 무엇을 기준으로 골랐나요? 절입일 경계, 윤달이 낀 해, 시간대가 애매한 사례 등 계산 오류가 발생하기 쉬운 조건들을 모아 구성했습니다. 이미 정답이 확인된 사주와 대조하는 방식으로 검증합니다.
Q4. 윤달 기준은 어디서 가져오나요? 한국천문연구원(KASI)이 공개하는 음력·윤달 기준을 그대로 따르고 있습니다.
Q5. 자체 엔진을 쓰면 결과가 완벽하게 정확하다고 보장할 수 있나요? 완벽을 단정하기보다, 검증 가능한 구조를 갖췄다는 점을 말씀드릴 수 있습니다. 골든 테스트 69케이스로 회귀 검증을 반복하고 있으며, 새로운 오류 사례가 발견되면 테스트 케이스에 추가해 계속 보완해 나가는 구조로 운영하고 있습니다.
마치며
외부 계산을 가져다 쓰는 것이 더 빠르고 편한 선택이었을 수 있습니다. 그러나 사주 여덟 글자 하나하나가 이후의 모든 해석의 기초가 된다는 점을 생각하면, 저희는 이 부분만큼은 직접 만들고 직접 검증하는 쪽을 택할 수밖에 없었습니다. 앞으로도 계산의 정확성과 관련된 진행 상황은 이 블로그를 통해 계속 전해 드리겠습니다.
본 콘텐츠는 점술 앱의 개발 과정과 설계 원칙을 안내하는 소식성 글이며, 세부 구성은 앱 개발 진행 상황에 따라 달라질 수 있습니다.
함께 읽기