목차
OpenAI API를 이용해서 뭐 재미난 것이 없을까 생각하던 중, 이제 2024년도 벌써 얼마 남지 않았고 2025년 새해를 맞아 재미 삼아 새해 운수를 OpenAI API를 이용해서 구현해 보면 재밌겠다 생각했어요. 하지만, GPT가 사주팔자 세우는 법을 잘 모르더라고요, 거의 대부분 틀리게 나옵니다.
아무리 재미 삼아 보는 새해 운세라고 해도 엉뚱한 사람의 생년월일로 내 운세를 보는 게 재미라고 할 수는 없을 것 같았어요. 해서, 어쩔 수 없이 OpenAI API를 사용하기 전에 우선 사주팔자 세우는 코드부터 구현해 보기로 했습니다.
OpenAI API를 활용한 새해 운세 프로그램
사주 팔자
이 말을 통칭하는 단어가 없을까요? 명리학을 좀 공부하신 분들은 아실 텐데, 저는 뭐 대충 수박 겉핥기 수준이라서 모르겠어요. 하여 이하 계속 ‘사주팔자 세우는…’으로 하겠습니다.
사주팔자를 세우려면 일단 생년월일시가 있어야 합니다. 아래와 같은 생년월일시가 있다고 합시다.
2003년 2월 14일, 오전 11시
사주팔자를 세운다는 것은 위와 같은 숫자로 구성된 연월일시를 천간과 지지라는 특별한 의미의 한자어로 구성한다는 말이에요.
사주의 한자 의미는 4개의 기둥입니다. 즉, 년, 월, 일, 시에 해당하는 4개의 기둥을 만든다는 거죠. 년에 해당하는 기둥을 ‘년주’, 월에 해당하는 기둥을 ‘월주’, 일에 해당하는 기둥을 ‘일주’, 시에 해당하는 기둥을 ‘시주’인 거죠. 또 이 주(기둥) 하나하나는 두 개의 글자로 구성되어 있는데, 윗 글자는 천간, 아래 글자를 지지라고 부릅니다. 그러면 기둥 4개에 기둥 하나당 글자가 2개로 구성되어 있으니, 총 8개의 글자가 사용되는 거죠.
그래서 사주팔자입니다. 4개의 기둥과 8글자라는 거죠.
자, 그러면 위 생년월일시에 해당하는 사주팔자를 사주 보는 앱에서는 어떻게 구성하고 있는지 볼까요?

시주, 일주, 월주, 년주로 구성되고 총 8자의 한자가 보입니다. 이 8자들 중에 위쪽에 4글자가 천간이라 부르고, 아래쪽에 4글자를 지지라고 부릅니다. 그러면 천간과 지지는 무엇일까요? 의외와 우리가 흔히 알고 있는 것들이라서 알아보면 꽤 익숙하실 거예요.
천간부터 볼게요. 아래 그림처럼 천간은 갑, 을, 병, 정, 무, 기, 경, 신, 임, 계의 10글자로 구성되어 있어요. 의미가 뭔지까지는 여기서 얘기하지는 않고요, 그저 천간은 10개 글자고 구성되어 있다. 정도만 보겠습니다.

다음은 지지입니다. 아래 그림과 같이 구성되어 있고요, 너무 익숙하죠? 우리가 흔히 사용하는 출생 연도별 “띠”입니다. 순서대로 쥐, 소, 범, 토끼, 용, 뱀, 말, 양, 원숭이, 닭, 개, 돼지로 12글자로 구성되어 있어요.

“환갑”이라는 단어를 많이 들어 보셨을 거예요. 우리들 부모님이나 자신이 이에 해당하거나 예정 또는 지난 분들이 있을 거예요. 이 “환갑”이 만 60세, 물론 한국 아니에요. 우리나라는 태어나자마자 1살이었으니까요. 생일과 무관하게 말이죠. 그 시절 만 60세가 되면 ‘환갑’이라고 했는데, 이 환갑이라는 것이 나의 년주와 똑같은 해가 60년마다 돌아온다고 “환갑”이라고 하는 거죠.
그럼 왜 하필 60인가? 바로 위 천간과 지지 그림을 참고해서 생각해 보면 년주가 천간 1개 글자와 지지 1개 글자로 구성되어 이 글자가 매년 순환한다고 생각해 보면, 최초에 순환을 시작하는 년주가 ‘갑자’로 시작해서 ‘을축’, ‘병인’, ‘정묘’ 등의 조합으로 ‘계해’까지 조합을 해 보면 총 60개임을 알 수 있습니다.
사주 팔자 세우는 방법
이제, 기본적인 사주 팔자 자체의 의미에 대해 살펴봤어요. 의미를 알았으니 이제 사주를 세우는 법에 대해 알아보겠습니다. 이 원리를 알아야 생년월일시에 따라 사주를 세우도록 코딩할 수 있겠죠?
평소 재미 삼아 운세가 궁금하거나 사주를 주제로 만담을 하고 싶을 때는 단순하게 앱을 이용하거나 만세력을 이용해서 사주를 바로 알아봤는데, 코딩을 하려니 사주 세우는 방법에 대해 명확하게 알아야 할 필요가 있더라고요. 쉽지 않았습니다. 그럼에도 불구하고, 이미 이와 관련하여 고민을 먼저 하셨던 무명의 인터넷 의인들이 계셔서 그분들의 이론을 참고하였습니다.
년주 세우는 방법
먼저 년주 세우는 방법은 아래 네이버 블로그를 참고했습니다. 다른 분들의 이론도 살펴봤지만, 간단하게 코딩하기에는 이분의 이론이 가장 좋은 것 같았습니다. (년주 세우는 방법 참고: https://m.blog.naver.com/ksh17141715/222270302830)
이 분이 설명하는 방법을 코딩하면 다음과 같습니다. 여기에서 y_CHEONGAN과 y_JIJI는 앞서 이야기하 천간과 지지에 대한 리스트입니다.

그런데, 여기에서 한가지 추가해야할 부분이 있더군요. 다음의 생년월일시를 예로 들어 볼게요.
1989년 2월 2일 14시
1989년도만 인수로 하여 “calculate_year_ganzhi” 함수를 실행시키면 “기사년”이 출력됩니다. 하지만, 이것은 잘못된 년주에요. 정답은 “무진년”이 되어야 하는데, 그 이유는 2월 2일 생이라는 점이에요. 즉, 2월 2일은 절기상 입춘(2월 4일)을 지나지 않았으므로 새해라 볼 수 없는 거예요. 때문에 년도 뿐만 아니라 월, 일을 인수로하여 절기를 체크하는 조건이 추가되어야 했습니다.
사주를 세울 때 중요한 절기는 다음과 같습니다.
명리학을 설명하는 시간이 아니지만, 간단하게 다음의 절기를 설명하자면 입춘이 지나야 봄(인)이 오고 입하가 지나면 여름(사)이 되고, 입추가 지나면 가을(신)이 되고 입동이 지나야 겨울(해)이 됩니다. 여기에서 앞의 지지를 다시 보면 인, 묘가 녹색으로 봄을 의미하고, 사, 오가 붉은 색으로 여름을 의미하죠. 신, 유는 백색으로 가을을 의미하고 해, 자는 검은색으로 겨울을 의미합니다.

이러면 년주는 거의 완벽하게 세우게 됩니다. 더 추가할 사항은 없는 것 같아요.
오늘은 여기까지 이야기해야 겠어요. 재미 삼아 시작했는데, 너무 일이 커지는게 아닌가 싶지만, 다음에 월주와 일주 그리고 시주까지 완료해 보도록 하겠습니다.
참고로, OpenAI API 사용 방법에 관심있으신 분은 아래 이전 글(링크)을 참고하세요.
- 챗지피티 프롬프트로 지브리 스타일, 픽사 스타일 이미지 생성 방법
- 생성형 AI 소유권, 챗지피티 지브리 스타일 이미지 사례 #1
- OpenAI API로 구현하는 AI Agent #2, “프로그래밍 AI 에이전트”
- OpenAI API로 구현하는 AI Agent, GPT-4o와 Function Tool 활용
- AI Detector로 AI content 판별이 가능할까? 기준과 현실 #1