Files
saju-web/app/layout.tsx
gahusb e233e18a55 feat: 카카오 앱 키 설정, 절기 기준 계산, 대운 정밀화
카카오 앱 키 설정:
- 환경 변수(.env.local)를 통한 안전한 키 관리
- NEXT_PUBLIC_KAKAO_APP_KEY 환경 변수 사용
- layout.tsx에서 환경 변수 읽어서 Kakao SDK 초기화
- .env.local 템플릿 파일 생성 (키 발급 가이드 포함)

음력 변환 정확도 개선:
- 24절기 계산 라이브러리 구현 (solar-terms.ts)
- 절기 기준 월주 계산으로 정확도 향상
- 입춘, 경칩, 청명 등 12개 월 절기 지원
- getSolarTermMonthBranch() - 절기 기준 월 지지 계산
- getCurrentSolarTerm() - 현재 절기 확인
- 사주 결과 페이지에 절기 정보 표시

대운 시작 나이 정밀 계산:
- 절기 기준 대운수 계산 구현
- 양남음녀(순행), 음남양녀(역행) 정확한 일수 계산
- 3일 = 1세 공식 적용
- calculateDaeunStartAge() 함수로 정밀 계산
- 이전 평균 8세 → 실제 계산값 (1~10세 범위)
- 대운 섹션에 시작 나이 계산 근거 표시

문서화:
- SETUP.md 생성
  - 카카오 앱 키 발급 및 설정 가이드
  - 절기 기준 사주 계산 설명
  - 대운 계산 원리 설명
  - 음력 변환 사용법
  - 기술 스택 및 개발 환경

사주 결과 페이지 개선:
- 절기 정보 표시 (녹색 박스)
- 대운 시작 나이 설명 추가
- 사용자에게 계산 원리 투명하게 공개

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-12 00:07:59 +09:00

56 lines
1.5 KiB
TypeScript

import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});
export const metadata: Metadata = {
title: "사주보기 - 무료 사주팔자, 운세, 궁합, 토정비결",
description: "생년월일로 무료로 사주팔자, 오늘의 운세, 궁합, 토정비결을 확인하세요. 쟁승메이드가 제공하는 정확한 사주 서비스입니다.",
};
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
const kakaoAppKey = process.env.NEXT_PUBLIC_KAKAO_APP_KEY;
return (
<html lang="ko">
<head>
<script
src="https://t1.kakaocdn.net/kakao_js_sdk/2.7.0/kakao.min.js"
integrity="sha384-l+xbElFSnPZ2rOaPrU//2FF5B4LB8FiX5q4fXYTlfcG4PGpMkE1vcL7kNXI6Cci0"
crossOrigin="anonymous"
async
></script>
{kakaoAppKey && (
<script
dangerouslySetInnerHTML={{
__html: `
if (typeof window !== 'undefined' && window.Kakao && !window.Kakao.isInitialized()) {
window.Kakao.init('${kakaoAppKey}');
}
`,
}}
/>
)}
</head>
<body
className={`${geistSans.variable} ${geistMono.variable} antialiased`}
>
{children}
</body>
</html>
);
}