시주를 바꾸는 보정들 — 진태양시, 서머타임, 야자시
출생 시각이 "진짜" 시각이 아닐 수 있다
사주에서 시주(時柱)는 출생 시각으로 결정된다. 하루를 12시진(時辰)으로 나누고, 각 시진은 2시간 단위다. 자시(子時)는 23:00~01:00, 축시(丑時)는 01:00~03:00, 이런 식이다. 단순해 보인다. 출생 시각을 2시간 단위로 나누면 될 것 같다.
그런데 출생 시각이 "진짜 태양 시간"과 다를 수 있다는 문제가 있다. 한국의 시계가 가리키는 시각과 서울에서 해가 남중하는 실제 시각 사이에 최대 48분의 차이가 존재한다. 2시간 단위인 시주에서 48분은 시주 자체를 바꿀 수 있는 크기다.
이 문제를 무시하고 출생 신고 시각을 그대로 사용할 것인가, 아니면 보정을 적용할 것인가. 그리고 보정을 적용한다면 어디까지 할 것인가. 이것이 시주 구현에서 만난 가장 큰 의사결정이었다.
진태양시: 32분 + 16분 = 최대 48분의 차이
한국 표준시(KST)는 동경 135도를 기준으로 한다. 이 기준 경선은 일본 효고현 아카시시를 지나간다. 서울의 경도는 약 127도다. 이 8도의 차이가 시간으로 환산하면 약 32분이다. 경도 1도가 4분의 시간 차이를 만들기 때문이다.
쉽게 말하면, 한국 시계가 12시 정오를 가리킬 때 서울에서는 아직 태양이 남중하지 않았다는 뜻이다. 서울의 "진짜 정오"는 시계 시각보다 약 32분 늦다. 사주에서 시주를 정할 때는 시계 시각이 아니라 이 "진짜 태양 시각"을 써야 한다는 것이 진태양시(True Solar Time) 보정의 핵심이다.
여기에 균시차(Equation of Time)라는 변수가 추가된다. 지구 공전 궤도가 완전한 원이 아니라 타원이고, 자전축이 기울어져 있기 때문에, 태양의 남중 시각은 매일 미세하게 달라진다. 이 차이가 최대 약 16분이다. 2월 중순에는 태양이 시계보다 약 14분 빠르게 남중하고, 11월 초에는 약 16분 늦게 남중한다.
경도 차이 32분과 균시차 최대 16분을 합치면, 이론적으로 최대 48분의 보정이 필요한 상황이 생긴다. 시주가 2시간 단위이므로, 48분은 시주 경계를 넘기에 충분한 크기다. 예를 들어 시계로 13시 05분에 태어난 사람의 경우, 보정을 적용하면 12시 20분대가 될 수 있고, 이는 오시(午時, 11:00~13:00)에서 미시(未時, 13:00~15:00)로의 차이를 만든다. 시주가 달라지면 시간(時干)이 달라지고, 십신 관계와 해석이 바뀐다.
균시차 구현의 실제
균시차를 구현하려면 매일의 보정값을 알아야 한다. 천문학적 공식으로 계산할 수 있는데, 이 공식이 간단하지 않다.
Claude에게 균시차 계산 공식을 요청하자, 두 가지 접근을 제시했다. 첫째는 정밀한 천문학 공식으로, 지구 궤도의 이심률과 자전축 기울기를 반영한 삼각함수 조합이다. 둘째는 근사 공식으로, 연중 날수(day of year)를 입력으로 받아 충분히 정확한 근사값을 반환하는 간단한 식이다.
사주 앱에서 필요한 정밀도는 1분 이내다. 근사 공식의 오차가 30초 이내라면 실용적으로 충분하다. 근사 공식을 채택하되, 여러 날짜에 대해 천문학 공식의 결과와 비교하여 오차 범위를 확인했다. 이 판단 과정에서 AI가 "두 공식의 차이가 최대 몇 초"라는 정보를 제공해준 것이 결정을 빠르게 내리는 데 도움이 됐다.
진태양시 보정의 최종 공식은 이렇다. 진태양시 = 시계 시각 - 경도 보정(약 32분) + 균시차(날짜별 변동). 이 결과가 시주 판정에 사용되는 "진짜" 출생 시각이다.
서머타임: 한국이 과거에 시행했던 시간 이동
진태양시가 "지리적 차이"에 의한 보정이라면, 서머타임은 "제도적 차이"에 의한 보정이다. 한국은 과거 세 기간에 걸쳐 서머타임(일광절약시간제)을 시행했다.
첫 번째는 1948년부터 1951년까지다. 대한민국 정부 수립 직후 시행되었다. 두 번째는 1955년부터 1960년까지다. 한국전쟁 후 다시 시행되었다. 세 번째는 1987년부터 1988년까지다. 올림픽을 앞두고 짧은 기간 시행되었다. 각 기간 내에서도 적용 시작일과 종료일이 매년 달랐다.
서머타임이 시행된 기간에 태어난 사람의 출생 신고 시각에는 1시간이 더해져 있다. 실제 태양 시각을 구하려면 신고 시각에서 1시간을 빼야 한다. 이 1시간은 시주를 확실히 바꿀 수 있는 크기다.
구현에서 까다로운 부분은, 서머타임 적용 기간을 정확히 데이터로 확보하는 것이었다. 1948년부터 1988년까지의 서머타임 시작일/종료일을 연도별로 정리한 테이블이 필요하다. Claude가 관련 자료를 정리해줬고, 한국천문연구원과 법제처 자료를 교차 확인하여 데이터의 정확성을 검증했다.
현실적으로 서머타임 보정이 영향을 미치는 사용자는 1988년 이전 출생자다. 2026년 기준으로 38세 이상이 되는 사람들이다. 비율이 적다고 무시할 수는 없다. 사주 앱에서 "정확도"는 모든 사용자에게 적용되어야 하는 가치이기 때문이다.
야자시(夜子時): 같은 자시인데 일주가 다르다
시주 보정에서 가장 철학적인 문제는 야자시다. 자시(子時)는 23:00부터 다음 날 01:00까지다. 그런데 이 2시간 안에 자정(00:00)이 포함된다. 날짜가 바뀌면 일주(日柱)가 바뀐다. 같은 자시인데 23:30 출생과 00:30 출생의 일주가 다른 것이다.
이 모순을 어떻게 처리할 것인가에 대해 두 가지 학설이 있다.
첫 번째는 야자시설(夜子時說)이다. 23:00~00:00(야자시)과 00:00~01:00(조자시)을 분리한다. 야자시에 태어난 사람은 다음 날의 일주를 적용한다. 즉 23:00 이후는 이미 "다음 날"로 본다. 자시의 시주 천간은 동일하지만, 일주가 바뀌므로 나머지 기둥의 십신 관계도 달라진다.
두 번째는 자시 불분리설이다. 자시를 나누지 않고, 자정을 기준으로 일주를 바꾼다. 23:00~23:59는 당일 일주, 00:00~00:59는 다음 날 일주를 적용한다. 이 방식은 양력 날짜 변경 기준과 일치하므로 직관적이지만, 자시의 시주 천간이 일주에 따라 달라지는 문제가 생긴다.
현대 명리학에서는 야자시설이 좀 더 보편적인 것으로 알려져 있고, 전문 앱들도 대부분 야자시설을 기본으로 채택하고 있다. 우리 앱에서도 야자시설을 기본값으로 설정하되, 설정에서 전환할 수 있게 구현했다. "하나만 맞다"고 하드코딩하면, 다른 학설을 따르는 사용자는 "이 앱은 틀렸다"고 느끼기 때문이다.
규칙의 모호함이 알고리즘보다 어렵다
진태양시, 서머타임, 야자시. 이 세 가지를 구현하면서 가장 크게 느낀 것은, 기술적 구현 자체보다 "어떤 규칙을 적용할 것인가"를 결정하는 것이 더 어렵다는 점이었다.
진태양시 보정의 수학 공식은 명확하다. 코드로 옮기면 된다. 서머타임 보정도 테이블만 확보되면 단순한 조건문이다. 하지만 "진태양시 보정을 적용할 것인가, 말 것인가"는 기술의 문제가 아니라 입장의 문제다. 일부 명리학자는 출생 신고 시각을 그대로 사용해야 한다고 주장한다. 태양의 실제 위치가 아니라, "그 시각에 세상에 등록된 시간"이 중요하다는 논리다.
야자시도 마찬가지다. 야자시설과 불분리설 모두 나름의 이론적 근거가 있다. 어느 쪽이 "맞다"고 단정할 수 없다. 이것은 수학 문제가 아니라 해석의 문제이기 때문이다.
개발자로서 이 상황에서 내린 원칙은 하나다. "합리적 기본값 + 명시적 선택지". 진태양시 보정은 기본 적용, 서머타임 보정은 해당 기간 자동 적용, 야자시는 야자시설 기본. 하지만 세 가지 모두 설정에서 끄거나 변경할 수 있게 했다. 사용자가 자신의 명리학적 입장에 따라 선택할 수 있어야 한다.
이 "기본값 + 선택지" 구조는 코드의 복잡도를 확실히 높인다. 단일 규칙만 구현하는 것보다 모든 조합을 지원하는 것이 훨씬 많은 분기와 테스트를 요구한다. 하지만 "정답이 여러 개인 도메인"에서는 이 복잡도를 감수해야 한다.
세 가지 보정의 조합이 만드는 경우의 수
진태양시 적용 여부, 서머타임 적용 여부, 야자시 처리 방식 — 이 세 가지 설정의 조합이 같은 출생 시각에서 다른 시주를 만들 수 있다. 특히 시주 경계 근처에서 태어난 사람에게는 설정에 따라 사주 전체가 달라질 수 있다.
예를 들어 1987년 7월 15일 23시 10분 서울 출생인 경우를 생각해보자. 서머타임이 적용 중이므로 실제 태양 시각은 22시 10분이다. 여기에 진태양시 보정(약 -32분 + 균시차)을 적용하면 21시 40분 전후가 된다. 야자시설을 적용하면 23시 이전이므로 당일 일주, 불분리설을 적용해도 23시 이전이므로 당일 일주. 이 경우에는 결과가 같다.
하지만 출생 시각이 23시 40분이었다면? 서머타임 보정 후 22시 40분, 진태양시 보정 후 22시 10분 전후. 보정을 적용하면 해시(亥時, 21:00~23:00)가 되고, 보정을 적용하지 않으면 자시(子時, 23:00~01:00)가 된다. 시주가 완전히 달라진다.
이런 경우를 대비하여 앱에서는 "현재 적용된 보정 설정"을 명시적으로 표시하고, 설정 변경 시 결과가 어떻게 달라지는지 사용자가 직접 확인할 수 있게 했다. "왜 다른 앱과 결과가 다른가"에 대한 답이 항상 투명하게 드러나야 한다.
이 과정에서 배운 것
첫째, 시간 보정은 수학적 계산보다 "어떤 입장을 택할 것인가"의 문제가 더 크다. 공식은 명확하지만, 그 공식을 적용할지 말지는 학파마다 다르다.
둘째, "기본값 + 명시적 선택지" 패턴은 정답이 여러 개인 도메인에서의 핵심 설계 원칙이다. 하나만 제공하면 절반의 사용자를 잃고, 선택지 없이 모두 제공하면 혼란을 준다.
셋째, 보정 설정의 조합이 만드는 경우의 수를 처음부터 인식하고 설계해야 한다. 나중에 추가하려면 기존 로직 전체를 건드려야 한다.
넷째, AI는 "두 학설의 차이와 각각의 근거"를 정리하는 데 탁월하지만, "우리 앱은 이걸로 간다"는 최종 선택은 사람이 해야 한다.
다음 편 예고
만세력이 완성되고 시간 보정까지 구현됐다. 사주 네 기둥이 정확하게 계산되는 상태다. 이제 이 기둥들을 "분석"해야 한다. 용신(用神)을 어떻게 판단하는지, 사용자가 가장 궁금해하는 신살 22종을 왜 P3에서 필수 기능으로 격상했는지, 대운과 세운은 어떻게 계산하는지를 9편에서 다룬다.
댓글
댓글 쓰기