woosday 사주 풀이 기능을 만든 과정
woosday에 사주 풀이 기능을 추가했다. 단순히 생년월일을 받아 문장을 고르는 방식이 아니라, 양력 날짜와 태어난 시각을 기준으로 음력 날짜, 절기, 네 기둥, 일간, 지장간, 십신, 대운 흐름을 계산해 결과를 보여 주는 작은 리포트로 구성했다.
이 기능의 목적은 미래를 단정하는 것이 아니다. 전통 명리 개념을 참고용 콘텐츠로 소개하고, 사용자가 계산 근거와 한계를 함께 확인할 수 있도록 만드는 데 있다.
입력을 단순하게 유지하면서 계산 정보는 충분히 받기
화면에서는 이름을 선택 입력으로 두고, 생년월일, 태어난 시각, 성별, 출생 지역을 받는다. 이름은 결과 제목에만 사용하며 계산에는 참여하지 않는다. 태어난 시각을 모르는 사용자를 위해 오시 기준값을 선택할 수 있게 했다. 오시는 11시부터 12시 59분까지의 시간대이며, 시각을 모르는 경우 정확한 시주를 계산할 수 없다는 점을 결과에 표시한다.
출생 지역은 서울, 부산, 대구, 대전, 광주, 인천, 제주, 강릉, 전주, 춘천과 한국 표준시 기준을 제공한다. 같은 한국 표준시라도 지역 경도에 따라 태양이 남중하는 시각이 달라질 수 있어, 선택한 지역의 경도를 계산에 반영했다.
계산 흐름
계산은 FortuneSajuService 한 곳에서 담당한다.
- 날짜, 시각, 성별, 지역을 검증한다.
- 출생 지역의 경도와 날짜별 균시차를 이용해 지역 태양시를 보정한다.
- 보정된 시각을 Tyme4j의 SolarTime으로 변환한다.
- SolarTime에서 음력 시각과 EightChar를 얻는다.
- 년주, 월주, 일주, 시주를 각각 천간·지지와 오행으로 분해한다.
- 일간을 기준으로 십신과 지장간을 계산한다.
- 성별과 출생 시각을 기준으로 8개의 대운 구간을 만든다.
- 계산에 사용한 보정 시각과 절입 시각을 결과에 함께 반환한다.
보정 시각을 결과에 노출한 이유는 사용자가 “왜 원래 입력 시각과 결과가 다르지?”라고 느끼지 않게 하기 위해서다. 계산 라이브러리의 결과만 보여 주기보다, 입력값과 계산 기준을 설명하는 편이 신뢰하기 쉽다.
API와 화면의 책임 분리
화면은 입력값을 검증하고 POST /fortune/api/saju로 JSON을 보낸다. 서버는 계산 결과를 SajuCalculationResponse로 반환하고, 화면은 네 기둥 카드와 대운 표로 렌더링한다. 서버 응답에는 입력한 이름을 포함하지 않고 계산에 필요한 날짜, 시각, 지역과 결과만 담았다.
잘못된 날짜나 성별, 출생 지역이 들어오면 400 응답과 사용자용 오류 메시지를 반환한다. 계산 라이브러리에서 예상하지 못한 오류가 나면 내부 예외를 그대로 노출하지 않고 일반적인 500 메시지로 바꾼다.
개인정보를 저장하지 않는 선택
생년월일과 태어난 시각은 개인을 추정할 수 있는 정보가 될 수 있다. 그래서 이 기능은 입력을 데이터베이스나 파일에 저장하지 않는다. 요청이 계산을 끝내면 서버 메모리의 요청 객체와 응답만 사라지고, 화면에도 “입력 정보는 저장되지 않는다”는 안내를 표시한다.
운영 로그에도 출생일과 시각을 남기지 않는 것이 원칙이다. 오류를 조사할 때는 trace ID와 오류 유형만 확인하고, 요청 본문을 통째로 기록하지 않는다. 나중에 통계를 추가하더라도 원본 출생 정보 대신 익명화된 집계값만 검토해야 한다.
전통 콘텐츠와 과학적 예측의 경계
사주 결과는 전통적인 음양·오행·간지 해석을 바탕으로 한 콘텐츠다. 건강, 재산, 법률, 투자처럼 중요한 결정을 대신할 수 없다는 안내를 결과에 포함했다. 계산 정확도와 해석의 신뢰도를 같은 의미로 포장하지 않도록, “계산 근거는 제공하지만 미래를 과학적으로 예측하지 않는다”는 문장을 고정했다.
테스트로 고정한 부분
서비스 테스트에서는 날짜와 시각이 정상일 때 네 기둥과 대운 목록이 반환되는지 확인한다. 미래 날짜, 지원 범위를 벗어난 연도, 잘못된 성별과 지역은 각각 거부되어야 한다. 지역을 바꿨을 때 보정 시각이 달라지는지도 확인해 계산 기준이 화면 설명과 일치하는지 검증한다.
이번 기능에서 가장 중요했던 것은 해석 문장을 많이 만드는 일이 아니었다. 입력값을 명확히 받고, 계산 과정의 기준을 보여 주고, 민감할 수 있는 정보를 남기지 않는 경계를 정하는 일이었다. 사용자가 직접 결과를 확인하고 다시 계산할 수 있는 작은 도구로 운영하는 것이 현재 woosday의 방향이다.
직접 사용하기: 사주 리포트
함께 읽기: